Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Important
- Azure Cognitive Services Form Recognizer est désormais Azure Document Intelligence dans Foundry Tools.
- Certaines plateformes attendent toujours la mise à jour de changement de nom.
- Toute mention de Form Recognizer ou document Intelligence dans notre documentation fait référence au même service Azure.
Ce contenu s’applique à :
v4.0 (GA)Versions antérieures :
v3.1 (GA)
v3.0 (GA)
- Mettez-vous à la dernière version stable de Azure Document Intelligence v4.0
2024-11-30(GA).
Ce contenu s’applique à :
v3.1 (GA)Versions antérieures :
v3.0
v2.1
- Commencez avec la dernière version générale d'Azure Form Recognizer (
2023-07-31).
Ce contenu s’applique à :
v3.0 (GA)Version plus récente :
v3.1
v2.1
- Commencez avec la version héritée en disponibilité générale d’Azure Form Recognizer (
2022-08-31).
Azure Document Intelligence / Form Recognizer est un service Foundry Tools basé sur le cloud qui utilise le Machine Learning pour extraire des paires clé-valeur, du texte, des tables et des données clés à partir de vos documents.
Vous pouvez facilement intégrer des modèles de traitement de documents dans vos workflows et applications à l’aide d’un SDK de langage de programmation ou d’appeler l’API REST.
Nous vous recommandons d’utiliser le service gratuit pendant que vous apprenez la technologie pour ce guide de démarrage rapide. N’oubliez pas que le nombre de pages gratuites est limité à 500 par mois.
Pour en savoir plus sur les fonctionnalités de l’API et les options de développement, visitez notre page Vue d’ensemble .
bibliothèque cliente | Référence de l'API REST | Paquet| Exemples|Version de l’API REST prise en charge
Bibliothèque Client |Référence API | Package (NuGet) | Exemples | Version de l’API REST prise en charge
bibliothèque cliente |Référence de l'API REST | Paquet | Exemples |Version de l’API REST prise en charge
Dans ce guide de démarrage rapide, utilisez les fonctionnalités suivantes pour analyser et extraire des données et des valeurs à partir de formulaires et de documents :
Modèle de disposition : analysez et extrayez des tables, des lignes, des mots et des marques de sélection comme des cases d’option et des cases à cocher dans les documents, sans avoir à entraîner un modèle.
Modèle prédéfini : analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle prédéfini.
Conditions préalables
abonnement Azure - Créez-en un gratuitement.
Version actuelle de IDE Visual Studio.
Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource single-service ou Azure multiservice, dans le portail Azure, pour obtenir votre clé et votre point de terminaison.
Vous pouvez utiliser le niveau tarifaire gratuit (
F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.
Conseil
Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.
Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :
Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource single-service ou Azure multiservice, dans le portail Azure, pour obtenir votre clé et votre point de terminaison.
Vous pouvez utiliser le niveau tarifaire gratuit (
F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.
Conseil
Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour avoir accès uniquement à Form Recognizer, créez une ressource Form Recognizer. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.
Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Form Recognizer. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :
Configurer
Démarrez Visual Studio.
Dans la page de démarrage, choisissez Créer un projet.
Dans la page Créer un projet, entrez la console dans la zone de recherche. Choisissez le modèle d’application console , puis choisissez Suivant.
- Dans la fenêtre de boîte de dialogue Configurer votre nouvelle boîte de dialogue project, entrez
doc_intel_quickstartdans la zone nom du Project. Ensuite, choisissez Suivant.
- Dans la fenêtre de boîte de dialogue Configurer votre nouvelle boîte de dialogue project, entrez
form_recognizer_quickstartdans la zone nom du Project. Ensuite, choisissez Suivant.
Dans la fenêtre de dialogue Additional information, sélectionnez .NET 8.0 (support à long terme), puis sélectionnez Create.
Installer la bibliothèque cliente avec NuGet
Cliquez avec le bouton droit sur votre projet doc_intel_quickstart , puis sélectionnez Gérer les packages NuGet... .
Sélectionnez l’onglet Browse et tapez Azure. IA. DocumentIntelligence.
Cochez la
Include prereleasecase.
Choisissez une version dans le menu déroulant et installez le package dans votre projet.
Cliquez avec le bouton droit sur votre projet form_recognizer_quickstart , puis sélectionnez Gérer les packages NuGet... .
Sélectionnez l’onglet Parcourir et tapez Azure. IA. FormRecognizer. Sélectionnez la version 4.1.0 dans le menu déroulant
Cliquez avec le bouton droit sur votre projet form_recognizer_quickstart , puis sélectionnez Gérer les packages NuGet... .
Sélectionnez l’onglet Parcourir et tapez Azure. IA. FormRecognizer. Sélectionnez la version 4.0.0 dans le menu déroulant
Créer votre application
Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentIntelligenceClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentIntelligenceClient avec le AzureKeyCredential et votre Document Intelligence endpoint.
Pour interagir avec le service Form Recognizer, vous devez créer une instance de la classe DocumentAnalysisClient. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentAnalysisClient avec le AzureKeyCredential et votre Form Recognizer endpoint.
Note
- À compter de .NET 6, de nouveaux projets utilisant le modèle
consolegénèrent un nouveau style de programme qui diffère des versions précédentes. - La nouvelle sortie utilise des fonctionnalités C# récentes qui simplifient le code que vous devez écrire.
- Lorsque vous utilisez la version la plus récente, vous devez uniquement écrire le corps de la
Mainméthode. Vous n’avez pas besoin d’inclure des instructions de niveau supérieur, des directives using globales ou des directives using implicites. - Pour plus d’informations, consultezLes nouveaux modèles C# génèrent des instructions de niveau supérieur.
Ouvrez le fichier Program.cs .
Supprimez le code existant, y compris la ligne
Console.Writeline("Hello World!"), puis sélectionnez l'un des exemples de code suivants pour copier et coller dans le fichier Program.cs de votre application :
Important
Nous vous recommandons l'authentification Microsoft Entra ID avec les identités gérées pour les ressources Azure pour éviter de stocker les informations d'identification avec vos applications qui s'exécutent dans le cloud.
Utilisez des clés API avec précaution. N’incluez pas la clé API directement dans votre code et ne la publiez jamais publiquement. Si vous utilisez des clés API, stockez-les en toute sécurité dans Azure Key Vault, faites pivoter les clés régulièrement et limitez l’accès aux Azure Key Vault à l’aide du contrôle d’accès en fonction du rôle et des restrictions d’accès réseau. Pour plus d’informations sur l’utilisation sécurisée des clés API dans vos applications, consultez les API avec Azure Key Vault.
Pour plus d’informations sur la sécurité des services d’INTELLIGENCE artificielle, consultez Demandes d’authentification à Azure AI services.
Modèle de disposition
Extrayez le texte, les marques de sélection, les styles textuels, les structures de tableau et les coordonnées des régions englobantes à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document à partir d’un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URI de fichier à la
Uri fileUrivariable en haut du script. - Pour extraire la disposition d’un fichier donné à un URI, utilisez la
AnalyzeDocumentAsyncméthode et passezprebuilt-layoutcomme ID de modèle. La valeur retournée est unAnalyzeResultobjet contenant des données du document soumis.
Ajoutez l’exemple de code suivant au fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :
using Azure;
using Azure.AI.DocumentIntelligence;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
UrlSource= fileUri
};
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", content);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s)," +
$" and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i}:");
Console.WriteLine($" Content: '{line.Content}'");
Console.Write(" Bounding polygon, with points ordered clockwise:");
for (int j = 0; j < line.Polygon.Count; j += 2)
{
Console.Write($" ({line.Polygon[j]}, {line.Polygon[j + 1]})");
}
Console.WriteLine();
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" State: {selectionMark.State}");
Console.Write(" Bounding polygon, with points ordered clockwise:");
for (int j = 0; j < selectionMark.Polygon.Count; j++)
{
Console.Write($" ({selectionMark.Polygon[j]}, {selectionMark.Polygon[j + 1]})");
}
Console.WriteLine();
}
}
for (int i = 0; i < result.Paragraphs.Count; i++)
{
DocumentParagraph paragraph = result.Paragraphs[i];
Console.WriteLine($"Paragraph {i}:");
Console.WriteLine($" Content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
var handwrittenContent = result.Content.Substring(span.Offset, span.Length);
Console.WriteLine($" {handwrittenContent}");
}
}
}
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) is a '{cell.Kind}' with content: {cell.Content}");
}
}
Exécuter votre application
Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.
Ajoutez l’exemple de code suivant au fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l'instance de Form Recognizer de votre portail Azure.
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding box is:");
Console.WriteLine($" Upper left => X: {line.Polygon[0].X}, Y= {line.Polygon[0].Y}");
Console.WriteLine($" Upper right => X: {line.Polygon[1].X}, Y= {line.Polygon[1].Y}");
Console.WriteLine($" Lower right => X: {line.Polygon[2].X}, Y= {line.Polygon[2].Y}");
Console.WriteLine($" Lower left => X: {line.Polygon[3].X}, Y= {line.Polygon[3].Y}");
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding box is:");
Console.WriteLine($" Upper left => X: {selectionMark.Polygon[0].X}, Y= {selectionMark.Polygon[0].Y}");
Console.WriteLine($" Upper right => X: {selectionMark.Polygon[1].X}, Y= {selectionMark.Polygon[1].Y}");
Console.WriteLine($" Lower right => X: {selectionMark.Polygon[2].X}, Y= {selectionMark.Polygon[2].Y}");
Console.WriteLine($" Lower left => X: {selectionMark.Polygon[3].X}, Y= {selectionMark.Polygon[3].Y}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Exécuter votre application
Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.
Sortie du modèle de mise en page
Voici un extrait de code de la sortie attendue :
Document Page 1 has 69 line(s), 425 word(s), and 15 selection mark(s).
Line 0 has content: 'UNITED STATES'.
Its bounding box is:
Upper left => X: 3.4915, Y= 0.6828
Upper right => X: 5.0116, Y= 0.6828
Lower right => X: 5.0116, Y= 0.8265
Lower left => X: 3.4915, Y= 0.8265
Line 1 has content: 'SECURITIES AND EXCHANGE COMMISSION'.
Its bounding box is:
Upper left => X: 2.1937, Y= 0.9061
Upper right => X: 6.297, Y= 0.9061
Lower right => X: 6.297, Y= 1.0498
Lower left => X: 2.1937, Y= 1.0498
Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de mise en page.
Ajoutez l’exemple de code suivant au fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs provenant de votre instance Form Recognizer sur le portail Azure.
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < line.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
}
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < selectionMark.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
}
}
}
Console.WriteLine("Paragraphs:");
foreach (DocumentParagraph paragraph in result.Paragraphs)
{
Console.WriteLine($" Paragraph content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Extract the layout of a document from a file stream
To extract the layout from a given file at a file stream, use the AnalyzeDocument method and pass prebuilt-layout as the model ID. The returned value is an AnalyzeResult object containing data about the submitted document.
string filePath = "<filePath>";
using var stream = new FileStream(filePath, FileMode.Open);
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", stream);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < line.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
}
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < selectionMark.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
}
}
}
Console.WriteLine("Paragraphs:");
foreach (DocumentParagraph paragraph in result.Paragraphs)
{
Console.WriteLine($" Paragraph content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Exécuter votre application
Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.
Modèle prédéfini
Analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle prédéfini. Dans cet exemple, nous analysons une facture à l’aide du modèle prédéfini de facture .
Conseil
Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Consultez l’extraction des données du modèle.
- Analysez une facture à l’aide du modèle prédéfini de facture. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URI du fichier à la
Uri invoiceUrivariable en haut du fichier Program.cs. - Pour analyser un fichier donné à un URI, utilisez la
AnalyzeDocumentAsyncméthode et passezprebuilt-invoicecomme ID de modèle. La valeur retournée est unAnalyzeResultobjet contenant des données du document soumis. - Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas affichées ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .
Ajoutez l’exemple de code suivant à votre fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :
using Azure;
using Azure.AI.DocumentIntelligence;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
//sample invoice document
Uri invoiceUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");
AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
UrlSource = invoiceUri
};
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", content);
AnalyzeResult result = operation.Value;
for (int i = 0; i < result.Documents.Count; i++)
{
Console.WriteLine($"Document {i}:");
AnalyzedDocument document = result.Documents[i];
if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField)
&& vendorNameField.FieldType == DocumentFieldType.String)
{
string vendorName = vendorNameField.ValueString;
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField)
&& customerNameField.FieldType == DocumentFieldType.String)
{
string customerName = customerNameField.ValueString;
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
&& itemsField.FieldType == DocumentFieldType.List)
{
foreach (DocumentField itemField in itemsField.ValueList)
{
Console.WriteLine("Item:");
if (itemField.FieldType == DocumentFieldType.Dictionary)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueDictionary;
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField)
&& itemDescriptionField.FieldType == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.ValueString;
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField)
&& itemAmountField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue itemAmount = itemAmountField.ValueCurrency;
Console.WriteLine($" Amount: '{itemAmount.CurrencySymbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
}
}
}
}
if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField)
&& subTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue subTotal = subTotalField.ValueCurrency;
Console.WriteLine($"Sub Total: '{subTotal.CurrencySymbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
}
if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField)
&& totalTaxField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue totalTax = totalTaxField.ValueCurrency;
Console.WriteLine($"Total Tax: '{totalTax.CurrencySymbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
}
if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField)
&& invoiceTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
Console.WriteLine($"Invoice Total: '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
}
}
Exécuter votre application
Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.
Ajoutez l’exemple de code suivant à votre fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `FormRecognizerClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample invoice document
Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");
Operation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", invoiceUri);
AnalyzeResult result = operation.Value;
for (int i = 0; i < result.Documents.Count; i++)
{
Console.WriteLine($"Document {i}:");
AnalyzedDocument document = result.Documents[i];
if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField))
{
if (vendorNameField.FieldType == DocumentFieldType.String)
{
string vendorName = vendorNameField.Value.AsString();
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField))
{
if (customerNameField.FieldType == DocumentFieldType.String)
{
string customerName = customerNameField.Value.AsString();
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
{
if (itemsField.FieldType == DocumentFieldType.List)
{
foreach (DocumentField itemField in itemsField.Value.AsList())
{
Console.WriteLine("Item:");
if (itemField.FieldType == DocumentFieldType.Dictionary)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.Value.AsDictionary();
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
{
if (itemDescriptionField.FieldType == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.Value.AsString();
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
{
if (itemAmountField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();
Console.WriteLine($" Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
}
}
}
}
}
}
if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField))
{
if (subTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue subTotal = subTotalField.Value.AsCurrency();
Console.WriteLine($"Sub Total: '{subTotal.Symbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
}
}
if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField))
{
if (totalTaxField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue totalTax = totalTaxField.Value.AsCurrency();
Console.WriteLine($"Total Tax: '{totalTax.Symbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
}
}
if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField))
{
if (invoiceTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.Value.AsCurrency();
Console.WriteLine($"Invoice Total: '{invoiceTotal.Symbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
}
}
}
Exécuter votre application
Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.
Sortie du modèle prédéfini
Voici un extrait de code de la sortie attendue :
Document 0:
Vendor Name: 'CONTOSO LTD.', with confidence 0.962
Customer Name: 'MICROSOFT CORPORATION', with confidence 0.951
Item:
Description: 'Test for 23 fields', with confidence 0.899
Amount: '100', with confidence 0.902
Sub Total: '100', with confidence 0.979
Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples de Azure sur GitHub pour afficher la sortie du modèle de facture prebuilt.
Ajoutez l’exemple de code suivant à votre fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `FormRecognizerClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample invoice document
Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-invoice", invoiceUri);
AnalyzeResult result = operation.Value;
for (int i = 0; i < result.Documents.Count; i++)
{
Console.WriteLine($"Document {i}:");
AnalyzedDocument document = result.Documents[i];
if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField))
{
if (vendorNameField.FieldType == DocumentFieldType.String)
{
string vendorName = vendorNameField.Value.AsString();
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField))
{
if (customerNameField.FieldType == DocumentFieldType.String)
{
string customerName = customerNameField.Value.AsString();
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
{
if (itemsField.FieldType == DocumentFieldType.List)
{
foreach (DocumentField itemField in itemsField.Value.AsList())
{
Console.WriteLine("Item:");
if (itemField.FieldType == DocumentFieldType.Dictionary)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.Value.AsDictionary();
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
{
if (itemDescriptionField.FieldType == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.Value.AsString();
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
{
if (itemAmountField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();
Console.WriteLine($" Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
}
}
}
}
}
}
if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField))
{
if (subTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue subTotal = subTotalField.Value.AsCurrency();
Console.WriteLine($"Sub Total: '{subTotal.Symbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
}
}
if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField))
{
if (totalTaxField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue totalTax = totalTaxField.Value.AsCurrency();
Console.WriteLine($"Total Tax: '{totalTax.Symbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
}
}
if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField))
{
if (invoiceTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.Value.AsCurrency();
Console.WriteLine($"Invoice Total: '{invoiceTotal.Symbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
}
}
}
Exécuter votre application
Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.
Bibliothèque Client | Référence de l'API REST | Package (Maven) | Exemples |Version de l'API REST prise en charge
Bibliothèque Client |Référence de l'API REST | Package (Maven) | Exemples| version de l’API REST prise en charge
Bibliothèque Client || Référence de l’API REST | Package (Maven) | Exemples|Version de l'API REST prise en charge
Dans ce guide de démarrage rapide, utilisez les fonctionnalités suivantes pour analyser et extraire des données et des valeurs à partir de formulaires et de documents :
Disposition : analysez et extrayez des tableaux, des lignes, des mots et des marques de sélection comme des cases d’option et des cases à cocher dans des documents, sans avoir à entraîner un modèle.
Facture prédéfinie : analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle préentraîné.
Conditions préalables
abonnement Azure - Créez-en un gratuitement.
La dernière version de Visual Studio Code ou votre IDE préféré. VoirJava dans Visual Studio Code.
Conseil
- Visual Studio Code propose un pack Coding pour Java pour Windows et macOS.Le pack de codage est un ensemble de VS Code, du kit de développement Java (JDK) et d’une collection d’extensions suggérées par Microsoft. Le pack de codage peut également être utilisé pour corriger un environnement de développement existant.
- Si vous utilisez VS Code et le pack de codage pour Java, installez l'extension Gradle pour Java.
Si vous n'utilisez pas Visual Studio Code, vérifiez que vous disposez des éléments suivants dans votre environnement de développement :
Un kit de développement Java (JDK) version 8 ou ultérieure. Pour plus d’informations, voirBuild Microsoft d’OpenJDK.
Gradle, version 6.8 ou ultérieure.
Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource Document Intelligence à service unique ou à service multiple dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (
F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.Conseil
Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.
Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Plus tard, vous collez votre clé et votre point de terminaison dans le code :
Configurer
Créer un projet Gradle
Dans la fenêtre de console (par exemple, cmd, PowerShell ou Bash), créez un répertoire pour votre application appelée doc-intel-app, puis accédez-y.
mkdir doc-intel-app && doc-intel-appmkdir doc-intel-app; cd doc-intel-appExécutez la
gradle initcommande à partir de votre répertoire de travail. Cette commande crée des fichiers de build essentiels pour Gradle, notamment build.gradle.kts, qui est utilisé lors de l’exécution pour créer et configurer votre application.gradle init --type basicLorsque vous êtes invité à choisir une DSL, sélectionnez Kotlin.
Acceptez le nom du projet par défaut (doc-intel-app) en sélectionnant Retour ou Entrée.
Dans la fenêtre de console (par exemple, cmd, PowerShell ou Bash), créez un répertoire pour votre application appelée form-recognize-app, puis accédez-y.
mkdir form-recognize-app && cd form-recognize-appmkdir form-recognize-app; cd form-recognize-appExécutez la
gradle initcommande à partir de votre répertoire de travail. Cette commande crée des fichiers de build essentiels pour Gradle, notamment build.gradle.kts, qui est utilisé lors de l’exécution pour créer et configurer votre application.gradle init --type basicLorsque vous êtes invité à choisir une DSL, sélectionnez Kotlin.
Acceptez le nom de projet par défaut (form-recognize-app) en sélectionnant Retour ou Entrée.
Installer la bibliothèque cliente
Ce guide de démarrage rapide utilise le gestionnaire de dépendances Gradle. Vous trouverez la bibliothèque cliente et les informations pour d’autres gestionnaires de dépendances sur le référentiel central Maven.
Ouvrez le fichier build.gradle.kts du projet dans votre IDE. Copiez et collez le code suivant pour inclure la bibliothèque cliente en tant que déclaration implementation, ainsi que les plug-ins et paramètres requis.
plugins {
java
application
}
application {
mainClass.set("DocIntelligence")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0'
}
Ce guide de démarrage rapide utilise le gestionnaire de dépendances Gradle. Vous trouverez la bibliothèque cliente et les informations pour d’autres gestionnaires de dépendances sur le référentiel central Maven.
Ouvrez le fichier build.gradle.kts du projet dans votre IDE. Copier et collez le code suivant pour inclure la bibliothèque cliente comme une instruction implementation, ainsi que les plug-ins et paramètres requis.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.1.0'
}
Ce guide de démarrage rapide utilise le gestionnaire de dépendances Gradle. Vous trouverez la bibliothèque cliente et les informations pour d’autres gestionnaires de dépendances sur le référentiel central Maven.
Ouvrez le fichier build.gradle.kts du projet dans votre IDE. Copiez et collez le code suivant pour inclure la bibliothèque cliente en tant qu’instruction implementation, ainsi que les plug-ins et paramètres requis.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'
}
Créer une application Java
Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentIntelligenceClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentIntelligenceClient avec le AzureKeyCredential et votre Document Intelligence endpoint.
Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentAnalysisClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentAnalysisClient avec le AzureKeyCredential et votre Document Intelligence endpoint.
À partir du répertoire doc-intel-app, exécutez la commande suivante :
mkdir -p src/main/javaVous créez la structure de répertoires suivante :
Accédez au
javarépertoire et créez un fichier nomméDocIntelligence.java.Conseil
- Vous pouvez créer un fichier à l’aide de PowerShell.
- Ouvrez une fenêtre PowerShell dans votre répertoire de projet en maintenant la touche Maj enfoncée et en cliquant avec le bouton droit sur le dossier.
- Tapez la commande suivante New-Item DocIntelligence.java.
Ouvrez le
DocIntelligence.javafichier. Copiez et collez l’un des exemples de code suivants dans votre application :
Accédez au
javarépertoire et créez un fichier nomméFormRecognizer.java.Conseil
- Vous pouvez créer un fichier à l’aide de PowerShell.
- Ouvrez une fenêtre PowerShell dans votre répertoire de projet en maintenant la touche Maj enfoncée et en cliquant avec le bouton droit sur le dossier.
- Tapez la commande suivante New-Item FormRecognizer.java.
Ouvrez le
FormRecognizer.javafichier. Copiez et collez l’un des exemples de code suivants dans votre application :
Important
Nous vous recommandons l'authentification Microsoft Entra ID avec les identités gérées pour les ressources Azure pour éviter de stocker les informations d'identification avec vos applications qui s'exécutent dans le cloud.
Utilisez des clés API avec précaution. N’incluez pas la clé API directement dans votre code et ne la publiez jamais publiquement. Si vous utilisez des clés API, stockez-les en toute sécurité dans Azure Key Vault, faites pivoter les clés régulièrement et limitez l’accès aux Azure Key Vault à l’aide du contrôle d’accès en fonction du rôle et des restrictions d’accès réseau. Pour plus d’informations sur l’utilisation sécurisée des clés API dans vos applications, consultez les API avec Azure Key Vault.
Pour plus d’informations sur la sécurité des services d’INTELLIGENCE artificielle, consultez Demandes d’authentification à Azure AI services.
Modèle de disposition
Extrayez le texte, les marques de sélection, les styles textuels, les structures de tableau et les coordonnées des régions englobantes à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
- Pour analyser un fichier donné à un URI, vous allez utiliser la
beginAnalyzeDocumentméthode et passerprebuilt-layouten tant qu’ID de modèle. La valeur retournée est unAnalyzeResultobjet contenant des données sur le document soumis. - Nous avons ajouté la valeur d’URI de fichier à la
documentUrlvariable dans la méthode principale.
Ajoutez l’exemple de code suivant au DocIntelligence.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :
import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.DocumentTable;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.util.List;
public class DocIntelligence {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-layout";
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
AnalyzeDocumentOptions options = new AnalyzeDocumentOptions(documentUrl);
SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeLayoutPoller = client.beginAnalyzeDocument(modelId, options);
AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line '%s' is within a bounding polygon %s.%n",
documentLine.getContent(),
documentLine.getPolygon()));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f.%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getState().toString(),
documentSelectionMark.getPolygon(),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell ->
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex()));
System.out.println();
}
// styles
analyzeLayoutResult.getStyles().forEach(documentStyle -> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
}
}
Générer et exécuter l’application
Après avoir ajouté un exemple de code à votre application, revenez au répertoire de votre projet principal ( doc-intel-app).
Générez votre application avec la
buildcommande :gradle buildExécutez votre application avec la
runcommande :gradle run
Ajoutez l’exemple de code suivant au FormRecognizer.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :
import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-layout";
SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);
AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line %s is within a bounding polygon %s.%n",
documentLine.getContent(),
documentLine.getPolygon().toString()));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is %s and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getState().toString(),
documentSelectionMark.getPolygon().toString(),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
}
// Utility function to get the bounding polygon coordinates
private static String getBoundingCoordinates(List < Point > Polygon) {
return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Générer et exécuter l’application
Après avoir ajouté un exemple de code à votre application, revenez à votre répertoire de projet principal ( form-recognize-app).
Générez votre application avec la
buildcommande :gradle buildExécutez votre application avec la
runcommande :gradle run
Sortie du modèle de mise en page
Voici un extrait de code de la sortie attendue :
Table 0 has 5 rows and 3 columns.
Cell 'Title of each class', has row index 0 and column index 0.
Cell 'Trading Symbol', has row index 0 and column index 1.
Cell 'Name of exchange on which registered', has row index 0 and column index 2.
Cell 'Common stock, $0.00000625 par value per share', has row index 1 and column index 0.
Cell 'MSFT', has row index 1 and column index 1.
Cell 'NASDAQ', has row index 1 and column index 2.
Cell '2.125% Notes due 2021', has row index 2 and column index 0.
Cell 'MSFT', has row index 2 and column index 1.
Cell 'NASDAQ', has row index 2 and column index 2.
Cell '3.125% Notes due 2028', has row index 3 and column index 0.
Cell 'MSFT', has row index 3 and column index 1.
Cell 'NASDAQ', has row index 3 and column index 2.
Cell '2.625% Notes due 2033', has row index 4 and column index 0.
Cell 'MSFT', has row index 4 and column index 1.
Cell 'NASDAQ', has row index 4 and column index 2.
Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de mise en page.
Ajoutez l’exemple de code suivant au FormRecognizer.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentTable;
import com.azure.ai.formrecognizer.documentanalysis.models.Point;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.util.List;
import java.util.stream.Collectors;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-layout";
SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutPoller =
client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);
AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line '%s' is within a bounding polygon %s.%n",
documentLine.getContent(),
getBoundingCoordinates(documentLine.getPolygon())));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f.%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getSelectionMarkState().toString(),
getBoundingCoordinates(documentSelectionMark.getPolygon()),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
// styles
analyzeLayoutResult.getStyles().forEach(documentStyle -
> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
}
/**
* Utility function to get the bounding polygon coordinates.
*/
private static String getBoundingCoordinates(List < Point > Polygon) {
return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Générer et exécuter l’application
Après avoir ajouté un exemple de code à votre application, revenez à votre répertoire de projet principal ( form-recognize-app).
Générez votre application avec la
buildcommande :gradle buildExécutez votre application avec la
runcommande :gradle run
Modèle prédéfini
Analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle prédéfini. Dans cet exemple, nous analysons une facture à l’aide du modèle prédéfini de facture .
Conseil
Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Consultez l’extraction des données du modèle.
- Analysez une facture à l’aide du modèle prédéfini de facture. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URL du fichier à la
invoiceUrlvariable en haut du fichier. - Pour analyser un fichier donné à un URI, vous allez utiliser la
beginAnalyzeDocumentsméthode et passerPrebuiltModels.Invoiceen tant qu’ID de modèle. La valeur retournée est unresultobjet contenant des données sur le document soumis. - Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas affichées ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .
Ajoutez l’exemple de code suivant au DocIntelligence.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :
import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzedDocument;
import com.azure.ai.documentintelligence.models.DocumentField;
import com.azure.ai.documentintelligence.models.DocumentFieldType;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
public class DocIntelligence {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-invoice";
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeInvoicesPoller =
client.beginAnalyzeDocument(modelId, new AnalyzeDocumentOptions(invoiceUrl));
AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map<String, DocumentField> invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueAsString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueAsString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueAsString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueAsString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueAsString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (invoiceDateField != null) {
if (DocumentFieldType.DATE == invoiceDateField.getType()) {
LocalDate invoiceDate = invoiceDateField.getValueAsDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (invoiceTotalField != null) {
if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueAsDouble();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
invoiceTotal, invoiceTotalField.getConfidence());
}
}
DocumentField invoiceItemsField = invoiceFields.get("Items");
if (invoiceItemsField != null) {
System.out.printf("Invoice Items: %n");
if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
List<DocumentField> invoiceItems = invoiceItemsField.getValueAsList();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
.map(documentField -> documentField.getValueAsMap())
.forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
// See a full list of fields found on an invoice here:
// https://aka.ms/documentintelligence/invoicefields
if ("Description".equals(key)) {
if (DocumentFieldType.STRING == documentField.getType()) {
String name = documentField.getValueAsString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double quantity = documentField.getValueAsDouble();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double unitPrice = documentField.getValueAsDouble();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double productCode = documentField.getValueAsDouble();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
Générer et exécuter l’application
Après avoir ajouté un exemple de code à votre application, revenez au répertoire de votre projet principal ( doc-intel-app).
Générez votre application avec la
buildcommande :gradle buildExécutez votre application avec la
runcommande :gradle run
Ajoutez l’exemple de code suivant au FormRecognizer.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :
import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(final String[] args) throws IOException {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-invoice";
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);
AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueAsString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueAsString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueAsString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueAsString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueAsString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (customerNameField != null) {
if (DocumentFieldType.DATE == invoiceDateField.getType()) {
LocalDate invoiceDate = invoiceDateField.getValueAsDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueAsDouble();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
invoiceTotal, invoiceTotalField.getConfidence());
}
}
DocumentField invoiceItemsField = invoiceFields.get("Items");
if (invoiceItemsField != null) {
System.out.printf("Invoice Items: %n");
if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
.map(documentField -> documentField.getValueAsMap())
.forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
// See a full list of fields found on an invoice here:
// https://aka.ms/formrecognizer/invoicefields
if ("Description".equals(key)) {
if (DocumentFieldType.STRING == documentField.getType()) {
String name = documentField.getValueAsString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double quantity = documentField.getValueAsDouble();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double unitPrice = documentField.getValueAsDouble();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double productCode = documentField.getValueAsDouble();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
Générer et exécuter l’application
Après avoir ajouté un exemple de code à votre application, revenez au répertoire de votre projet principal ( doc-intel-app).
Générez votre application avec la
buildcommande :gradle buildExécutez votre application avec la
runcommande :gradle run
Sortie du modèle prédéfini
Voici un extrait de code de la sortie attendue :
----------- Analyzing invoice 0 -----------
Analyzed document has doc type invoice with confidence : 1.00
Vendor Name: CONTOSO LTD., confidence: 0.92
Vendor address: 123 456th St New York, NY, 10001, confidence: 0.91
Customer Name: MICROSOFT CORPORATION, confidence: 0.84
Customer Address Recipient: Microsoft Corp, confidence: 0.92
Invoice ID: INV-100, confidence: 0.97
Invoice Date: 2019-11-15, confidence: 0.97
Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples de Azure sur GitHub pour afficher la sortie du modèle de facture prebuilt.
Ajoutez l’exemple de code suivant au FormRecognizer.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzedDocument;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentField;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentFieldType;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-invoice";
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);
AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueAsString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueAsString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueAsString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueAsString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueAsString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (customerNameField != null) {
if (DocumentFieldType.DATE == invoiceDateField.getType()) {
LocalDate invoiceDate = invoiceDateField.getValueAsDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueAsDouble();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
invoiceTotal, invoiceTotalField.getConfidence());
}
}
DocumentField invoiceItemsField = invoiceFields.get("Items");
if (invoiceItemsField != null) {
System.out.printf("Invoice Items: %n");
if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
.map(documentField -> documentField.getValueAsMap())
.forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
// See a full list of fields found on an invoice here:
// https://aka.ms/formrecognizer/invoicefields
if ("Description".equals(key)) {
if (DocumentFieldType.STRING == documentField.getType()) {
String name = documentField.getValueAsString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double quantity = documentField.getValueAsDouble();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double unitPrice = documentField.getValueAsDouble();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double productCode = documentField.getValueAsDouble();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
Générer et exécuter l’application
Après avoir ajouté un exemple de code à votre application, revenez au répertoire de votre projet principal ( doc-intel-app).
Générez votre application avec la
buildcommande :gradle buildExécutez votre application avec la
runcommande :gradle run
Bibliothèque client | Référence de l'API REST | Package (npm) | Exemples |Version de l’API REST prise en charge
Bibliothèque cliente |Informations de référence sur | l’API RESTPackage (npm) | Échantillons |Version de l’API REST prise en charge
Bibliothèque cliente |Informations de référence sur | l’API RESTPackage (npm) | Échantillons |Version de l’API REST prise en charge
Dans ce guide de démarrage rapide, utilisez les fonctionnalités suivantes pour analyser et extraire des données et des valeurs à partir de formulaires et de documents :
Disposition : analysez et extrayez des tableaux, des lignes, des mots et des marques de sélection comme des cases d’option et des cases à cocher dans des documents, sans avoir à entraîner un modèle.
Facture prédéfinie : analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle de facture préentraîné.
Conditions préalables
abonnement Azure - Créez-en un gratuitement.
La dernière version de Visual Studio Code ou votre IDE préféré. Pour plus d’informations, seeNode.js dans Visual Studio Code.
La dernière
LTSversion de Node.js.Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource Document Intelligence à service unique ou à service multiple dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (
F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.Conseil
Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.
Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :
Configurer
Créez une application express Node.js : dans une fenêtre de console (par exemple, cmd, PowerShell ou Bash), créez et accédez à un répertoire pour votre application nommée
doc-intel-app.mkdir doc-intel-app && cd doc-intel-appExécutez la
npm initcommande pour initialiser l’application et générer une structure de votre projet.npm initSpécifiez les attributs de votre projet à l’aide des invites présentées dans le terminal.
- Les attributs les plus importants sont le nom, le numéro de version et le point d’entrée.
- Nous vous recommandons de conserver
index.jsle nom du point d’entrée. La description, la commande de test, le référentiel GitHub, les mots clés, l’auteur et les informations de licence sont des attributs facultatifs. Ils peuvent être ignorés pour ce projet. - Acceptez les suggestions entre parenthèses en sélectionnant Retour ou Entrée.
- Une fois les invites terminées, un fichier
package.jsonsera créé dans votre répertoire doc-intel-app.
Installez la
ai-document-intelligencebibliothèque cliente etazure/identityles packages npm :npm i @azure-rest/ai-document-intelligence@1.1.0Le fichier
package.jsonde votre application est mis à jour avec les dépendances.
Installez la
ai-form-recognizerbibliothèque cliente etazure/identityles packages npm :npm i @azure/ai-form-recognizer@5.0.0 @azure/identity- Le fichier de l'application
package.jsonest mis à jour avec les dépendances.
- Le fichier de l'application
Installez la
ai-form-recognizerbibliothèque cliente etazure/identityles packages npm :npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
Créez un fichier nommé
index.jsdans le répertoire de l’application.Conseil
- Vous pouvez créer un fichier à l’aide de PowerShell.
- Ouvrez une fenêtre PowerShell dans votre répertoire de projet en maintenant la touche Maj enfoncée et en cliquant avec le bouton droit sur le dossier.
- Tapez la commande suivante New-Item index.js.
Créer votre application
Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentIntelligenceClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentIntelligenceClient avec le AzureKeyCredential et votre Document Intelligence endpoint.
Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentAnalysisClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentAnalysisClient avec le AzureKeyCredential et votre Form Recognizer endpoint.
Ouvrez le fichier
index.jsdans Visual Studio Code ou votre IDE favori. Copiez et collez l’un des exemples de code suivants dans votre application :
Important
Nous vous recommandons l'authentification Microsoft Entra ID avec les identités gérées pour les ressources Azure pour éviter de stocker les informations d'identification avec vos applications qui s'exécutent dans le cloud.
Utilisez des clés API avec précaution. N’incluez pas la clé API directement dans votre code et ne la publiez jamais publiquement. Si vous utilisez des clés API, stockez-les en toute sécurité dans Azure Key Vault, faites pivoter les clés régulièrement et limitez l’accès aux Azure Key Vault à l’aide du contrôle d’accès en fonction du rôle et des restrictions d’accès réseau. Pour plus d’informations sur l’utilisation sécurisée des clés API dans vos applications, consultez les API avec Azure Key Vault.
Pour plus d’informations sur la sécurité des services d’INTELLIGENCE artificielle, consultez Demandes d’authentification à Azure AI services.
Modèle de disposition
Extrayez le texte, les marques de sélection, les styles textuels, les structures de tableau et les coordonnées des régions englobantes à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document à partir d’une URL. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URL du fichier à la
formUrlvariable en haut du fichier.- Pour analyser un fichier donné à partir d’une URL, vous allez utiliser la méthode
beginAnalyzeDocumentset transmettreprebuilt-layoutcomme ID de modèle.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
async function main() {
const client = DocumentIntelligence(endpoint, { key });
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-layout")
.post({
contentType: "application/json",
body: {
urlSource: formUrl
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const pages = analyzeResult?.pages;
const tables = analyzeResult?.tables;
if (pages && pages.length > 0) {
console.log("Pages:");
for (const page of pages) {
console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
console.log(` ${page.width}x${page.height}`);
console.log(` ${page.lines?.length || 0} lines, ${page.words?.length || 0} words`);
}
} else {
console.log("No pages were extracted from the document.");
}
if (tables && tables.length > 0) {
console.log("Tables:");
for (const table of tables) {
console.log(
`- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
);
}
} else {
console.log("No tables were extracted from the document.");
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Exécuter votre application
Après avoir ajouté un exemple de code à votre application, exécutez votre programme :
Accédez au dossier dans lequel vous disposez de votre application Document Intelligence (doc-intel-app).
Tapez la commande suivante dans votre terminal :
node index.js
Ajoutez l’exemple de code suivant au index.js fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :
const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
async function main() {
const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-layout", formUrl);
const {
pages,
tables
} = await poller.pollUntilDone();
if (pages.length <= 0) {
console.log("No pages were extracted from the document.");
} else {
console.log("Pages:");
for (const page of pages) {
console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
console.log(` ${page.width}x${page.height}, angle: ${page.angle}`);
console.log(` ${page.lines.length} lines, ${page.words.length} words`);
}
}
if (tables.length <= 0) {
console.log("No tables were extracted from the document.");
} else {
console.log("Tables:");
for (const table of tables) {
console.log(
`- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
);
}
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Exécuter votre application
Après avoir ajouté un exemple de code à votre application, exécutez votre programme :
Accédez au dossier dans lequel vous disposez de votre application Document Intelligence (doc-intel-app).
Tapez la commande suivante dans votre terminal :
node index.js
Sortie du modèle de mise en page
Voici un extrait de code de la sortie attendue :
Pages:
- Page 1 (unit: inch)
8.5x11, angle: 0
69 lines, 425 words
Tables:
- Extracted table: 3 columns, 5 rows (15 cells)
Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de mise en page.
Modèle prédéfini
Dans cet exemple, nous analysons une facture à l’aide du modèle prédéfini de facture .
Conseil
Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Consultez l’extraction des données du modèle.
- Analysez une facture à l’aide du modèle prédéfini de facture. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URL du fichier à la
invoiceUrlvariable en haut du fichier. - Pour analyser un fichier donné à un URI, vous allez utiliser la
beginAnalyzeDocumentsméthode et passerPrebuiltModels.Invoiceen tant qu’ID de modèle. La valeur retournée est unresultobjet contenant des données sur le document soumis. - Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas affichées ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
async function main() {
const client = DocumentIntelligence(endpoint, { key });
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
.post({
contentType: "application/json",
body: {
urlSource: invoiceUrl,
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const invoice = documents && documents[0];
if (!invoice) {
throw new Error("Expected at least one invoice in the result.");
}
console.log(
"Extracted invoice:",
invoice.docType,
`(confidence: ${invoice.confidence || "<undefined>"})`
);
console.log("Fields:", invoice.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Exécuter votre application
Après avoir ajouté un exemple de code à votre application, exécutez votre programme :
Accédez au dossier dans lequel vous disposez de votre application Document Intelligence (doc-intel-app).
Tapez la commande suivante dans votre terminal :
node index.js
const {
AzureKeyCredential,
DocumentAnalysisClient
} = require("@azure/ai-form-recognizer");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
async function main() {
const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-invoice", invoiceUrl);
const {
pages,
tables
} = await poller.pollUntilDone();
if (pages.length <= 0) {
console.log("No pages were extracted from the document.");
} else {
console.log("Pages:");
for (const page of pages) {
console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
console.log(` ${page.width}x${page.height}, angle: ${page.angle}`);
console.log(` ${page.lines.length} lines, ${page.words.length} words`);
if (page.lines && page.lines.length > 0) {
console.log(" Lines:");
for (const line of page.lines) {
console.log(` - "${line.content}"`);
// The words of the line can also be iterated independently. The words are computed based on their
// corresponding spans.
for (const word of line.words()) {
console.log(` - "${word.content}"`);
}
}
}
}
}
if (tables.length <= 0) {
console.log("No tables were extracted from the document.");
} else {
console.log("Tables:");
for (const table of tables) {
console.log(
`- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
);
}
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Exécuter votre application
Après avoir ajouté un exemple de code à votre application, exécutez votre programme :
Accédez au dossier dans lequel vous disposez de votre application Document Intelligence (doc-intel-app).
Tapez la commande suivante dans votre terminal :
node index.js
Sortie du modèle prédéfini
Voici un extrait de code de la sortie attendue :
Vendor Name: CONTOSO LTD.
Customer Name: MICROSOFT CORPORATION
Invoice Date: 2019-11-15T00:00:00.000Z
Due Date: 2019-12-15T00:00:00.000Z
Items:
- <no product code>
Description: Test for 23 fields
Quantity: 1
Date: undefined
Unit: undefined
Unit Price: 1
Tax: undefined
Amount: 100
Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples de Azure sur GitHub pour afficher la sortie du modèle de facture prebuilt.
const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
async function main() {
const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginAnalyzeDocument("prebuilt-invoice", invoiceUrl);
const {
documents: [document],
} = await poller.pollUntilDone();
if (document) {
const {
vendorName,
customerName,
invoiceDate,
dueDate,
items,
subTotal,
previousUnpaidBalance,
totalTax,
amountDue,
} = document.fields;
// The invoice model has many fields. For details, *see* [Invoice model field extraction](../../prebuilt/invoice.md#field-extraction)
console.log("Vendor Name:", vendorName && vendorName.value);
console.log("Customer Name:", customerName && customerName.value);
console.log("Invoice Date:", invoiceDate && invoiceDate.value);
console.log("Due Date:", dueDate && dueDate.value);
console.log("Items:");
for (const item of (items && items.values) || []) {
const { productCode, description, quantity, date, unit, unitPrice, tax, amount } =
item.properties;
console.log("-", (productCode && productCode.value) || "<no product code>");
console.log(" Description:", description && description.value);
console.log(" Quantity:", quantity && quantity.value);
console.log(" Date:", date && date.value);
console.log(" Unit:", unit && unit.value);
console.log(" Unit Price:", unitPrice && unitPrice.value);
console.log(" Tax:", tax && tax.value);
console.log(" Amount:", amount && amount.value);
}
console.log("Subtotal:", subTotal && subTotal.value);
console.log("Previous Unpaid Balance:", previousUnpaidBalance && previousUnpaidBalance.value);
console.log("Tax:", totalTax && totalTax.value);
console.log("Amount Due:", amountDue && amountDue.value);
} else {
throw new Error("Expected at least one receipt in the result.");
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Exécuter votre application
Après avoir ajouté un exemple de code à votre application, exécutez votre programme :
Accédez au dossier dans lequel vous disposez de votre application Document Intelligence (doc-intel-app).
Tapez la commande suivante dans votre terminal :
node index.js
Bibliothèque client |Référence API REST | Package (PyPi) | Exemples | Version API REST prise en charge
Bibliothèque client |Référence API REST | Package (PyPi) | Exemples | Version API REST prise en charge
Bibliothèque client |Référence API REST | Package (PyPi) | Exemples | Version API REST prise en charge
Dans ce guide de démarrage rapide, utilisez les fonctionnalités suivantes pour analyser et extraire des données à partir de formulaires et de documents :
Disposition : analysez et extrayez des tableaux, des lignes, des mots et des marques de sélection comme des cases d’option et des cases à cocher, ainsi que des paires clé-valeur, sans nécessiter d'entraîner un modèle.
Facture prédéfinie : analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle préentraîné.
Conditions préalables
abonnement Azure - Créez-en un gratuitement.
Python 3.7 ou version ultérieure.
- Votre installation de Python doit inclure pip. Vous pouvez vérifier si pip est installé en exécutant
pip --versionla ligne de commande. Obtenez pip en installant la dernière version de Python.
- Votre installation de Python doit inclure pip. Vous pouvez vérifier si pip est installé en exécutant
La dernière version de Visual Studio Code ou votre IDE préféré. Pour plus d’informations, seeGetting Started with Python in Visual Studio Code.
Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource Document Intelligence à service unique ou à service multiple dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (
F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.
Conseil
Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.
Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :
Configurer
Ouvrez une fenêtre de terminal dans votre environnement local et installez la bibliothèque cliente Azure Document Intelligence dans Foundry Tools pour Python avec pip :
pip install azure-ai-documentintelligence==1.0.2
pip install azure-ai-formrecognizer==3.3.0
pip install azure-ai-formrecognizer==3.2.0b6
Créer votre application Python
Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentIntelligenceClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentIntelligenceClient avec le AzureKeyCredential et votre Document Intelligence endpoint.
Créez un fichier Python appelé doc_intel_quickstart.py dans votre éditeur ou IDE préféré.
Ouvrez le fichier doc_intel_quickstart.py et sélectionnez l’un des exemples de code suivants pour copier et coller dans votre application :
Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentAnalysisClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentAnalysisClient avec le AzureKeyCredential et votre Document Intelligence endpoint.
Créez un fichier Python appelé form_recognizer_quickstart.py dans votre éditeur ou IDE préféré.
Ouvrez le fichier form_recognizer_quickstart.py et sélectionnez l’un des exemples de code suivants pour copier et coller dans votre application :
Important
Nous vous recommandons l'authentification Microsoft Entra ID avec les identités gérées pour les ressources Azure pour éviter de stocker les informations d'identification avec vos applications qui s'exécutent dans le cloud.
Utilisez des clés API avec précaution. N’incluez pas la clé API directement dans votre code et ne la publiez jamais publiquement. Si vous utilisez des clés API, stockez-les en toute sécurité dans Azure Key Vault, faites pivoter les clés régulièrement et limitez l’accès aux Azure Key Vault à l’aide du contrôle d’accès en fonction du rôle et des restrictions d’accès réseau. Pour plus d’informations sur l’utilisation sécurisée des clés API dans vos applications, consultez les API avec Azure Key Vault.
Pour plus d’informations sur la sécurité des services d’INTELLIGENCE artificielle, consultez Demandes d’authentification à Azure AI services.
Modèle de disposition
Extrayez le texte, les marques de sélection, les styles textuels, les structures de tableau et les coordonnées des régions englobantes à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document à partir d’une URL. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URL du fichier à la
formUrlvariable dans laanalyze_layoutfonction.
Ajoutez l’exemple de code suivant à votre application doc_intel_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :
# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
# helper functions
def get_words(page, line):
result = []
for word in page.words:
if _in_span(word, line.spans):
result.append(word)
return result
def _in_span(word, spans):
for span in spans:
if word.span.offset >= span.offset and (
word.span.offset + word.span.length
) <= (span.offset + span.length):
return True
return False
def analyze_layout():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
document_intelligence_client = DocumentIntelligenceClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_intelligence_client.begin_analyze_document(
"prebuilt-layout", AnalyzeDocumentRequest(url_source=formUrl
))
result: AnalyzeResult = poller.result()
if result.styles and any([style.is_handwritten for style in result.styles]):
print("Document contains handwritten content")
else:
print("Document does not contain handwritten content")
for page in result.pages:
print(f"----Analyzing layout from page #{page.page_number}----")
print(
f"Page has width: {page.width} and height: {page.height}, measured with unit: {page.unit}"
)
if page.lines:
for line_idx, line in enumerate(page.lines):
words = get_words(page, line)
print(
f"...Line # {line_idx} has word count {len(words)} and text '{line.content}' "
f"within bounding polygon '{line.polygon}'"
)
for word in words:
print(
f"......Word '{word.content}' has a confidence of {word.confidence}"
)
if page.selection_marks:
for selection_mark in page.selection_marks:
print(
f"Selection mark is '{selection_mark.state}' within bounding polygon "
f"'{selection_mark.polygon}' and has a confidence of {selection_mark.confidence}"
)
if result.tables:
for table_idx, table in enumerate(result.tables):
print(
f"Table # {table_idx} has {table.row_count} rows and "
f"{table.column_count} columns"
)
if table.bounding_regions:
for region in table.bounding_regions:
print(
f"Table # {table_idx} location on page: {region.page_number} is {region.polygon}"
)
for cell in table.cells:
print(
f"...Cell[{cell.row_index}][{cell.column_index}] has text '{cell.content}'"
)
if cell.bounding_regions:
for region in cell.bounding_regions:
print(
f"...content on page {region.page_number} is within bounding polygon '{region.polygon}'"
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_layout()
Exécuter l’application
Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier dans lequel vous disposez de votre fichier doc_intel_quickstart.py .
Tapez la commande suivante dans votre terminal :
python doc_intel_quickstart.py
Pour analyser un fichier donné à une URL, utilisez la begin_analyze_document_from_url méthode et passez-le comme prebuilt-layout ID de modèle. La valeur retournée est un result objet contenant des données sur le document soumis.
Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.
# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
def format_polygon(polygon):
if not polygon:
return "N/A"
return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])
def analyze_layout():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
document_analysis_client = DocumentAnalysisClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-layout", formUrl)
result = poller.result()
for idx, style in enumerate(result.styles):
print(
"Document contains {} content".format(
"handwritten" if style.is_handwritten else "no handwritten"
)
)
for page in result.pages:
print("----Analyzing layout from page #{}----".format(page.page_number))
print(
"Page has width: {} and height: {}, measured with unit: {}".format(
page.width, page.height, page.unit
)
)
for line_idx, line in enumerate(page.lines):
words = line.get_words()
print(
"...Line # {} has word count {} and text '{}' within bounding box '{}'".format(
line_idx,
len(words),
line.content,
format_polygon(line.polygon),
)
)
for word in words:
print(
"......Word '{}' has a confidence of {}".format(
word.content, word.confidence
)
)
for selection_mark in page.selection_marks:
print(
"...Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
selection_mark.state,
format_polygon(selection_mark.polygon),
selection_mark.confidence,
)
)
for table_idx, table in enumerate(result.tables):
print(
"Table # {} has {} rows and {} columns".format(
table_idx, table.row_count, table.column_count
)
)
for region in table.bounding_regions:
print(
"Table # {} location on page: {} is {}".format(
table_idx,
region.page_number,
format_polygon(region.polygon),
)
)
for cell in table.cells:
print(
"...Cell[{}][{}] has content '{}'".format(
cell.row_index,
cell.column_index,
cell.content,
)
)
for region in cell.bounding_regions:
print(
"...content on page {} is within bounding box '{}'".format(
region.page_number,
format_polygon(region.polygon),
)
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_layout()
Exécuter l’application
Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier dans lequel vous disposez de votre fichier form_recognizer_quickstart.py .
Tapez la commande suivante dans votre terminal :
python form_recognizer_quickstart.py
Sortie du modèle de mise en page
Voici un extrait de code de la sortie attendue :
----Analyzing layout from page #1----
Page has width: 8.5 and height: 11.0, measured with unit: inch
...Line # 0 has word count 2 and text 'UNITED STATES' within bounding box '[3.4915, 0.6828], [5.0116, 0.6828], [5.0116, 0.8265], [3.4915, 0.8265]'
......Word 'UNITED' has a confidence of 1.0
......Word 'STATES' has a confidence of 1.0
...Line # 1 has word count 4 and text 'SECURITIES AND EXCHANGE COMMISSION' within bounding box '[2.1937, 0.9061], [6.297, 0.9061], [6.297, 1.0498], [2.1937, 1.0498]'
......Word 'SECURITIES' has a confidence of 1.0
......Word 'AND' has a confidence of 1.0
......Word 'EXCHANGE' has a confidence of 1.0
......Word 'COMMISSION' has a confidence of 1.0
...Line # 2 has word count 3 and text 'Washington, D.C. 20549' within bounding box '[3.4629, 1.1179], [5.031, 1.1179], [5.031, 1.2483], [3.4629, 1.2483]'
......Word 'Washington,' has a confidence of 1.0
......Word 'D.C.' has a confidence of 1.0
Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de mise en page.
Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.
# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
def analyze_layout():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
document_analysis_client = DocumentAnalysisClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-layout", formUrl
)
result = poller.result()
for idx, style in enumerate(result.styles):
print(
"Document contains {} content".format(
"handwritten" if style.is_handwritten else "no handwritten"
)
)
for page in result.pages:
print("----Analyzing layout from page #{}----".format(page.page_number))
print(
"Page has width: {} and height: {}, measured with unit: {}".format(
page.width, page.height, page.unit
)
)
for line_idx, line in enumerate(page.lines):
words = line.get_words()
print(
"...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
line_idx,
len(words),
line.content,
format_polygon(line.polygon),
)
)
for word in words:
print(
"......Word '{}' has a confidence of {}".format(
word.content, word.confidence
)
)
for selection_mark in page.selection_marks:
print(
"...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
selection_mark.state,
format_polygon(selection_mark.polygon),
selection_mark.confidence,
)
)
for table_idx, table in enumerate(result.tables):
print(
"Table # {} has {} rows and {} columns".format(
table_idx, table.row_count, table.column_count
)
)
for region in table.bounding_regions:
print(
"Table # {} location on page: {} is {}".format(
table_idx,
region.page_number,
format_polygon(region.polygon),
)
)
for cell in table.cells:
print(
"...Cell[{}][{}] has content '{}'".format(
cell.row_index,
cell.column_index,
cell.content,
)
)
for region in cell.bounding_regions:
print(
"...content on page {} is within bounding polygon '{}'".format(
region.page_number,
format_polygon(region.polygon),
)
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_layout()
Exécuter l’application
Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier dans lequel vous disposez de votre fichier form_recognizer_quickstart.py .
Tapez la commande suivante dans votre terminal :
python form_recognizer_quickstart.py
Modèle prédéfini
Analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle prédéfini. Dans cet exemple, nous analysons une facture à l’aide du modèle prédéfini de facture .
Conseil
Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Consultez l’extraction des données du modèle.
- Analysez une facture à l’aide du modèle prédéfini de facture. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URL du fichier à la
invoiceUrlvariable en haut du fichier. - Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas affichées ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .
Ajoutez l’exemple de code suivant à votre application doc_intel_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :
# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
def analyze_invoice():
# sample document
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
document_intelligence_client = DocumentIntelligenceClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_intelligence_client.begin_analyze_document(
"prebuilt-invoice", AnalyzeDocumentRequest(url_source=invoiceUrl)
)
invoices = poller.result()
if invoices.documents:
for idx, invoice in enumerate(invoices.documents):
print(f"--------Analyzing invoice #{idx + 1}--------")
vendor_name = invoice.fields.get("VendorName")
if vendor_name:
print(
f"Vendor Name: {vendor_name.get('content')} has confidence: {vendor_name.get('confidence')}"
)
vendor_address = invoice.fields.get("VendorAddress")
if vendor_address:
print(
f"Vendor Address: {vendor_address.get('content')} has confidence: {vendor_address.get('confidence')}"
)
vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
if vendor_address_recipient:
print(
f"Vendor Address Recipient: {vendor_address_recipient.get('content')} has confidence: {vendor_address_recipient.get('confidence')}"
)
customer_name = invoice.fields.get("CustomerName")
if customer_name:
print(
f"Customer Name: {customer_name.get('content')} has confidence: {customer_name.get('confidence')}"
)
customer_id = invoice.fields.get("CustomerId")
if customer_id:
print(
f"Customer Id: {customer_id.get('content')} has confidence: {customer_id.get('confidence')}"
)
customer_address = invoice.fields.get("CustomerAddress")
if customer_address:
print(
f"Customer Address: {customer_address.get('content')} has confidence: {customer_address.get('confidence')}"
)
customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
if customer_address_recipient:
print(
f"Customer Address Recipient: {customer_address_recipient.get('content')} has confidence: {customer_address_recipient.get('confidence')}"
)
invoice_id = invoice.fields.get("InvoiceId")
if invoice_id:
print(
f"Invoice Id: {invoice_id.get('content')} has confidence: {invoice_id.get('confidence')}"
)
invoice_date = invoice.fields.get("InvoiceDate")
if invoice_date:
print(
f"Invoice Date: {invoice_date.get('content')} has confidence: {invoice_date.get('confidence')}"
)
invoice_total = invoice.fields.get("InvoiceTotal")
if invoice_total:
print(
f"Invoice Total: {invoice_total.get('content')} has confidence: {invoice_total.get('confidence')}"
)
due_date = invoice.fields.get("DueDate")
if due_date:
print(
f"Due Date: {due_date.get('content')} has confidence: {due_date.get('confidence')}"
)
purchase_order = invoice.fields.get("PurchaseOrder")
if purchase_order:
print(
f"Purchase Order: {purchase_order.get('content')} has confidence: {purchase_order.get('confidence')}"
)
billing_address = invoice.fields.get("BillingAddress")
if billing_address:
print(
f"Billing Address: {billing_address.get('content')} has confidence: {billing_address.get('confidence')}"
)
billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
if billing_address_recipient:
print(
f"Billing Address Recipient: {billing_address_recipient.get('content')} has confidence: {billing_address_recipient.get('confidence')}"
)
shipping_address = invoice.fields.get("ShippingAddress")
if shipping_address:
print(
f"Shipping Address: {shipping_address.get('content')} has confidence: {shipping_address.get('confidence')}"
)
shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
if shipping_address_recipient:
print(
f"Shipping Address Recipient: {shipping_address_recipient.get('content')} has confidence: {shipping_address_recipient.get('confidence')}"
)
print("Invoice items:")
for idx, item in enumerate(invoice.fields.get("Items").get("valueArray")):
print(f"...Item #{idx + 1}")
item_description = item.get("valueObject").get("Description")
if item_description:
print(
f"......Description: {item_description.get('content')} has confidence: {item_description.get('confidence')}"
)
item_quantity = item.get("valueObject").get("Quantity")
if item_quantity:
print(
f"......Quantity: {item_quantity.get('content')} has confidence: {item_quantity.get('confidence')}"
)
unit = item.get("valueObject").get("Unit")
if unit:
print(
f"......Unit: {unit.get('content')} has confidence: {unit.get('confidence')}"
)
unit_price = item.get("valueObject").get("UnitPrice")
if unit_price:
unit_price_code = (
unit_price.get("valueCurrency").get("currencyCode")
if unit_price.get("valueCurrency").get("currencyCode")
else ""
)
print(
f"......Unit Price: {unit_price.get('content')}{unit_price_code} has confidence: {unit_price.get('confidence')}"
)
product_code = item.get("valueObject").get("ProductCode")
if product_code:
print(
f"......Product Code: {product_code.get('content')} has confidence: {product_code.get('confidence')}"
)
item_date = item.get("valueObject").get("Date")
if item_date:
print(
f"......Date: {item_date.get('content')} has confidence: {item_date.get('confidence')}"
)
tax = item.get("valueObject").get("Tax")
if tax:
print(
f"......Tax: {tax.get('content')} has confidence: {tax.get('confidence')}"
)
amount = item.get("valueObject").get("Amount")
if amount:
print(
f"......Amount: {amount.get('content')} has confidence: {amount.get('confidence')}"
)
subtotal = invoice.fields.get("SubTotal")
if subtotal:
print(
f"Subtotal: {subtotal.get('content')} has confidence: {subtotal.get('confidence')}"
)
total_tax = invoice.fields.get("TotalTax")
if total_tax:
print(
f"Total Tax: {total_tax.get('content')} has confidence: {total_tax.get('confidence')}"
)
previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
if previous_unpaid_balance:
print(
f"Previous Unpaid Balance: {previous_unpaid_balance.get('content')} has confidence: {previous_unpaid_balance.get('confidence')}"
)
amount_due = invoice.fields.get("AmountDue")
if amount_due:
print(
f"Amount Due: {amount_due.get('content')} has confidence: {amount_due.get('confidence')}"
)
service_start_date = invoice.fields.get("ServiceStartDate")
if service_start_date:
print(
f"Service Start Date: {service_start_date.get('content')} has confidence: {service_start_date.get('confidence')}"
)
service_end_date = invoice.fields.get("ServiceEndDate")
if service_end_date:
print(
f"Service End Date: {service_end_date.get('content')} has confidence: {service_end_date.get('confidence')}"
)
service_address = invoice.fields.get("ServiceAddress")
if service_address:
print(
f"Service Address: {service_address.get('content')} has confidence: {service_address.get('confidence')}"
)
service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
if service_address_recipient:
print(
f"Service Address Recipient: {service_address_recipient.get('content')} has confidence: {service_address_recipient.get('confidence')}"
)
remittance_address = invoice.fields.get("RemittanceAddress")
if remittance_address:
print(
f"Remittance Address: {remittance_address.get('content')} has confidence: {remittance_address.get('confidence')}"
)
remittance_address_recipient = invoice.fields.get(
"RemittanceAddressRecipient"
)
if remittance_address_recipient:
print(
f"Remittance Address Recipient: {remittance_address_recipient.get('content')} has confidence: {remittance_address_recipient.get('confidence')}"
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_invoice()
Exécuter l’application
Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier dans lequel vous disposez de votre fichier doc_intel_quickstart.py .
Tapez la commande suivante dans votre terminal :
python doc_intel_quickstart.py
Pour analyser un fichier donné à un URI, utilisez la begin_analyze_document_from_url méthode et passez prebuilt-invoice comme ID de modèle. La valeur retournée est un result objet contenant des données sur le document soumis.
Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.
# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
def format_bounding_region(bounding_regions):
if not bounding_regions:
return "N/A"
return ", ".join(
"Page #{}: {}".format(region.page_number, format_polygon(region.polygon))
for region in bounding_regions
)
def format_polygon(polygon):
if not polygon:
return "N/A"
return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])
def analyze_invoice():
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
document_analysis_client = DocumentAnalysisClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-invoice", invoiceUrl
)
invoices = poller.result()
for idx, invoice in enumerate(invoices.documents):
print("--------Recognizing invoice #{}--------".format(idx + 1))
vendor_name = invoice.fields.get("VendorName")
if vendor_name:
print(
"Vendor Name: {} has confidence: {}".format(
vendor_name.value, vendor_name.confidence
)
)
vendor_address = invoice.fields.get("VendorAddress")
if vendor_address:
print(
"Vendor Address: {} has confidence: {}".format(
vendor_address.value, vendor_address.confidence
)
)
vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
if vendor_address_recipient:
print(
"Vendor Address Recipient: {} has confidence: {}".format(
vendor_address_recipient.value, vendor_address_recipient.confidence
)
)
customer_name = invoice.fields.get("CustomerName")
if customer_name:
print(
"Customer Name: {} has confidence: {}".format(
customer_name.value, customer_name.confidence
)
)
customer_id = invoice.fields.get("CustomerId")
if customer_id:
print(
"Customer Id: {} has confidence: {}".format(
customer_id.value, customer_id.confidence
)
)
customer_address = invoice.fields.get("CustomerAddress")
if customer_address:
print(
"Customer Address: {} has confidence: {}".format(
customer_address.value, customer_address.confidence
)
)
customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
if customer_address_recipient:
print(
"Customer Address Recipient: {} has confidence: {}".format(
customer_address_recipient.value,
customer_address_recipient.confidence,
)
)
invoice_id = invoice.fields.get("InvoiceId")
if invoice_id:
print(
"Invoice Id: {} has confidence: {}".format(
invoice_id.value, invoice_id.confidence
)
)
invoice_date = invoice.fields.get("InvoiceDate")
if invoice_date:
print(
"Invoice Date: {} has confidence: {}".format(
invoice_date.value, invoice_date.confidence
)
)
invoice_total = invoice.fields.get("InvoiceTotal")
if invoice_total:
print(
"Invoice Total: {} has confidence: {}".format(
invoice_total.value, invoice_total.confidence
)
)
due_date = invoice.fields.get("DueDate")
if due_date:
print(
"Due Date: {} has confidence: {}".format(
due_date.value, due_date.confidence
)
)
purchase_order = invoice.fields.get("PurchaseOrder")
if purchase_order:
print(
"Purchase Order: {} has confidence: {}".format(
purchase_order.value, purchase_order.confidence
)
)
billing_address = invoice.fields.get("BillingAddress")
if billing_address:
print(
"Billing Address: {} has confidence: {}".format(
billing_address.value, billing_address.confidence
)
)
billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
if billing_address_recipient:
print(
"Billing Address Recipient: {} has confidence: {}".format(
billing_address_recipient.value,
billing_address_recipient.confidence,
)
)
shipping_address = invoice.fields.get("ShippingAddress")
if shipping_address:
print(
"Shipping Address: {} has confidence: {}".format(
shipping_address.value, shipping_address.confidence
)
)
shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
if shipping_address_recipient:
print(
"Shipping Address Recipient: {} has confidence: {}".format(
shipping_address_recipient.value,
shipping_address_recipient.confidence,
)
)
print("Invoice items:")
for idx, item in enumerate(invoice.fields.get("Items").value):
print("...Item #{}".format(idx + 1))
item_description = item.value.get("Description")
if item_description:
print(
"......Description: {} has confidence: {}".format(
item_description.value, item_description.confidence
)
)
item_quantity = item.value.get("Quantity")
if item_quantity:
print(
"......Quantity: {} has confidence: {}".format(
item_quantity.value, item_quantity.confidence
)
)
unit = item.value.get("Unit")
if unit:
print(
"......Unit: {} has confidence: {}".format(
unit.value, unit.confidence
)
)
unit_price = item.value.get("UnitPrice")
if unit_price:
print(
"......Unit Price: {} has confidence: {}".format(
unit_price.value, unit_price.confidence
)
)
product_code = item.value.get("ProductCode")
if product_code:
print(
"......Product Code: {} has confidence: {}".format(
product_code.value, product_code.confidence
)
)
item_date = item.value.get("Date")
if item_date:
print(
"......Date: {} has confidence: {}".format(
item_date.value, item_date.confidence
)
)
tax = item.value.get("Tax")
if tax:
print(
"......Tax: {} has confidence: {}".format(tax.value, tax.confidence)
)
amount = item.value.get("Amount")
if amount:
print(
"......Amount: {} has confidence: {}".format(
amount.value, amount.confidence
)
)
subtotal = invoice.fields.get("SubTotal")
if subtotal:
print(
"Subtotal: {} has confidence: {}".format(
subtotal.value, subtotal.confidence
)
)
total_tax = invoice.fields.get("TotalTax")
if total_tax:
print(
"Total Tax: {} has confidence: {}".format(
total_tax.value, total_tax.confidence
)
)
previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
if previous_unpaid_balance:
print(
"Previous Unpaid Balance: {} has confidence: {}".format(
previous_unpaid_balance.value, previous_unpaid_balance.confidence
)
)
amount_due = invoice.fields.get("AmountDue")
if amount_due:
print(
"Amount Due: {} has confidence: {}".format(
amount_due.value, amount_due.confidence
)
)
service_start_date = invoice.fields.get("ServiceStartDate")
if service_start_date:
print(
"Service Start Date: {} has confidence: {}".format(
service_start_date.value, service_start_date.confidence
)
)
service_end_date = invoice.fields.get("ServiceEndDate")
if service_end_date:
print(
"Service End Date: {} has confidence: {}".format(
service_end_date.value, service_end_date.confidence
)
)
service_address = invoice.fields.get("ServiceAddress")
if service_address:
print(
"Service Address: {} has confidence: {}".format(
service_address.value, service_address.confidence
)
)
service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
if service_address_recipient:
print(
"Service Address Recipient: {} has confidence: {}".format(
service_address_recipient.value,
service_address_recipient.confidence,
)
)
remittance_address = invoice.fields.get("RemittanceAddress")
if remittance_address:
print(
"Remittance Address: {} has confidence: {}".format(
remittance_address.value, remittance_address.confidence
)
)
remittance_address_recipient = invoice.fields.get("RemittanceAddressRecipient")
if remittance_address_recipient:
print(
"Remittance Address Recipient: {} has confidence: {}".format(
remittance_address_recipient.value,
remittance_address_recipient.confidence,
)
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_invoice()
Exécuter l’application
Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier dans lequel vous disposez de votre fichier form_recognizer_quickstart.py .
Tapez la commande suivante dans votre terminal :
python form_recognizer_quickstart.py
Sortie du modèle prédéfini
Voici un extrait de code de la sortie attendue :
--------Recognizing invoice #1--------
Vendor Name: CONTOSO LTD. has confidence: 0.919
Vendor Address: 123 456th St New York, NY, 10001 has confidence: 0.907
Vendor Address Recipient: Contoso Headquarters has confidence: 0.919
Customer Name: MICROSOFT CORPORATION has confidence: 0.84
Customer Id: CID-12345 has confidence: 0.956
Customer Address: 123 Other St, Redmond WA, 98052 has confidence: 0.909
Customer Address Recipient: Microsoft Corp has confidence: 0.917
Invoice Id: INV-100 has confidence: 0.972
Invoice Date: 2019-11-15 has confidence: 0.971
Invoice Total: CurrencyValue(amount=110.0, symbol=$) has confidence: 0.97
Due Date: 2019-12-15 has confidence: 0.973
Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples de Azure sur GitHub pour afficher la sortie du modèle de facture prebuilt.
Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.
# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
def format_polygon(polygon):
if not polygon:
return "N/A"
return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])
def analyze_layout():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
document_analysis_client = DocumentAnalysisClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-layout", formUrl
)
result = poller.result()
for idx, style in enumerate(result.styles):
print(
"Document contains {} content".format(
"handwritten" if style.is_handwritten else "no handwritten"
)
)
for page in result.pages:
print("----Analyzing layout from page #{}----".format(page.page_number))
print(
"Page has width: {} and height: {}, measured with unit: {}".format(
page.width, page.height, page.unit
)
)
for line_idx, line in enumerate(page.lines):
words = line.get_words()
print(
"...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
line_idx,
len(words),
line.content,
format_polygon(line.polygon),
)
)
for word in words:
print(
"......Word '{}' has a confidence of {}".format(
word.content, word.confidence
)
)
for selection_mark in page.selection_marks:
print(
"...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
selection_mark.state,
format_polygon(selection_mark.polygon),
selection_mark.confidence,
)
)
for table_idx, table in enumerate(result.tables):
print(
"Table # {} has {} rows and {} columns".format(
table_idx, table.row_count, table.column_count
)
)
for region in table.bounding_regions:
print(
"Table # {} location on page: {} is {}".format(
table_idx,
region.page_number,
format_polygon(region.polygon),
)
)
for cell in table.cells:
print(
"...Cell[{}][{}] has content '{}'".format(
cell.row_index,
cell.column_index,
cell.content,
)
)
for region in cell.bounding_regions:
print(
"...content on page {} is within bounding polygon '{}'".format(
region.page_number,
format_polygon(region.polygon),
)
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_layout()
Exécuter l’application
Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier dans lequel vous disposez de votre fichier form_recognizer_quickstart.py .
Tapez la commande suivante dans votre terminal :
python form_recognizer_quickstart.py
API REST | Document Intelligence | Supported Azure SDKS
API REST | Document Intelligence | Supported Azure SDKS |
API REST | Document Intelligence | Supported Azure SDKS |
Dans ce guide de démarrage rapide, découvrez comment utiliser l’API REST Document Intelligence pour analyser et extraire des données et des valeurs à partir de documents :
Conditions préalables
Abonnement Azure - Créez-en un gratuitement
L'outil en ligne de commande
cURLinstallé.PowerShell version 7.*+ (ou une application de ligne de commande similaire.) :
Pour vérifier votre version de PowerShell, tapez la commande suivante par rapport à votre système d’exploitation :
- Windows :
Get-Host | Select-Object Version - macOS ou Linux :
$PSVersionTable
- Windows :
Ressource Document Intelligence (mono-service) ou Foundry Tools (multi-services). Une fois que vous avez votre abonnement Azure, créez une ressource Document Intelligence à service unique ou à service multiple dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (
F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.
Conseil
Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.
Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :
Analyser des documents et obtenir des résultats
Une requête POST est utilisée pour analyser des documents avec un modèle prédéfini ou personnalisé. Une requête GET est utilisée pour récupérer le résultat d’un appel d’analyse de document. Il modelId est utilisé avec POST et resultId avec les opérations GET.
Analyser le document (demande POST)
Avant d’exécuter la commande cURL, apportez les modifications suivantes à la demande de publication :
Remplacez
{endpoint}par la valeur du point de terminaison de votre instance Document Intelligence du portail Azure.Remplacez
{key}par la valeur de clé de votre instance Document Intelligence du portail Azure.En utilisant le tableau suivant comme référence, remplacez
{modelID}et{your-document-url}par vos valeurs souhaitées.Vous avez besoin d’un fichier de document à l’URL. Pour ce guide de démarrage rapide, vous pouvez utiliser les exemples de formulaires fournis dans le tableau suivant pour chaque fonctionnalité :
Exemples de documents
| Fonctionnalité | {modelID} | {your-document-url} |
|---|---|---|
| Lire | prebuilt-read |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
| Disposition | prebuilt-layout |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
| Carte d’assurance maladie | prebuilt-healthInsuranceCard.us |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png |
| W-2 | prebuilt-tax.us.w2 |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png |
| Facture | prebuilt-invoice |
https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
| Reçu | prebuilt-receipt |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
| Document d’ID | prebuilt-idDocument |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Exemples de documents
| Fonctionnalité | {modelID} | {your-document-url} |
|---|---|---|
| Document général | prebuilt-document |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf |
| Lire | prebuilt-read |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
| Disposition | prebuilt-layout |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
| Carte d’assurance maladie | prebuilt-healthInsuranceCard.us |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png |
| W-2 | prebuilt-tax.us.w2 |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png |
| Facture | prebuilt-invoice |
https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
| Reçu | prebuilt-receipt |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
| Document d’ID | prebuilt-idDocument |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
| Carte de visite | prebuilt-businessCard |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg |
Important
N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultezSécurité des outils Foundry.
Requête POST
curl -v -i -X POST "{endpoint}/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-11-30" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelID}:analyze?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelId}:analyze?api-version=2022-08-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
Réponse POST (resultID)
Vous recevez une 202 (Success) réponse qui inclut un en-tête Operation-Location en lecture seule. La valeur de cet en-tête contient un resultID qui peut être interrogé pour obtenir l’état de l’opération asynchrone et récupérer les résultats à l’aide d’une requête GET avec la même clé d’abonnement à la ressource :
Obtenir les résultats d’analyse (requête GET)
Après avoir appelé l’API Analyze document , appelez l’API Obtenir le résultat d’analyse pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez ces modifications :
Après avoir appelé l’API Analyze document , appelez l’API Obtenir le résultat d’analyse pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez ces modifications :
Après avoir appelé l’API Analyze document , appelez l’API Obtenir le résultat d’analyse pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez ces modifications :
Remplacez l'en-tête Operation-Location de la réponse POST.
Remplacez
{key}par la valeur de clé de votre instance Document Intelligence dans le portail Azure.
Requête GET
curl -v -X GET "{endpoint}/documentintelligence/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2024-11-30" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2023-07-31" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2022-08-31" -H "Ocp-Apim-Subscription-Key: {key}"
Examiner la réponse
Vous recevez une réponse 200 (Success) avec une sortie JSON. Le premier champ, "status"indique l’état de l’opération. Si l’opération n’est pas terminée, la valeur est "status""running" ou "notStarted", et vous devez appeler à nouveau l’API, manuellement ou via un script. Nous vous recommandons de respecter un intervalle d'une seconde ou plus entre les appels.
Exemple de réponse pour la facture prédéfinie
{
"status": "succeeded",
"createdDateTime": "2024-03-25T19:31:37Z",
"lastUpdatedDateTime": "2024-03-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2024-11-30",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
{
"status": "succeeded",
"createdDateTime": "2023-08-25T19:31:37Z",
"lastUpdatedDateTime": "2023-08-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2023-07-31",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
{
"status": "succeeded",
"createdDateTime": "2022-09-25T19:31:37Z",
"lastUpdatedDateTime": "2022-09-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2022-08-31",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
Champs de document pris en charge
Les modèles prédéfinis extraient des ensembles prédéfinis de champs de document. Consultez l’extraction des données de modèle pour obtenir des noms de champs, des types, des descriptions et des exemples extraits.
C’est ça, félicitations !
Dans ce guide de démarrage rapide, vous avez utilisé un modèle Document Intelligence pour analyser différents formulaires et documents. Ensuite, explorez Document Intelligence Studio et consultez la documentation de référence pour en savoir plus sur l’API Document Intelligence.
Étapes suivantes
Pour une expérience améliorée et une qualité de modèle avancée, essayez Document Intelligence Studio
Pour la migration v3.1 vers v4.0, consultez les guides de migration du journal des modifications.
Ce contenu s’applique à :
v2.1 | Dernière version :
v4.0 (GA)
Commencez à utiliser Azure Document Intelligence à l’aide du langage de programmation de votre choix ou de l’API REST. Document Intelligence est un service Foundry Tools basé sur le cloud qui utilise le Machine Learning pour extraire des paires clé-valeur, du texte et des tables à partir de vos documents. Nous vous recommandons d’utiliser le service gratuit lorsque vous apprenez la technologie. N’oubliez pas que le nombre de pages gratuites est limité à 500 par mois.
Pour en savoir plus sur les fonctionnalités et les options de développement Document Intelligence, consultez notre page Vue d’ensemble .
Documentation de référence | Code source de la bibliothèque | Package (NuGet) | Exemples
Dans ce guide de démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées à partir de formulaires et de documents :
Conditions préalables
abonnement Azure - Créez-en un gratuitement.
Version actuelle de IDE Visual Studio.
Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource de Document Intelligence à service unique ou multi-service dans le portail Azure afin d'obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (
F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.Conseil
Créez une ressource de fonderie si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison ou clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Notez que vous aurez besoin d'une ressource à service unique si vous envisagez d'utiliser l'authentification Microsoft Entra.
Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :
Configurer
Commencez Visual Studio 2019.
Dans la page de démarrage, choisissez Créer un projet.
Dans la page Créer un projet, entrez la console dans la zone de recherche. Choisissez le modèle d’application console , puis choisissez Suivant.
Dans la fenêtre de boîte de dialogue Configurer votre nouvelle boîte de dialogue project, entrez
formRecognizer_quickstartdans la zone nom du Project. Ensuite, choisissez Suivant.
Dans la fenêtre de dialogue Additional information, sélectionnez .NET 5.0 (Actuel), puis sélectionnez Create.
Installer la bibliothèque cliente avec NuGet
Cliquez avec le bouton droit sur votre projet formRecognizer_quickstart , puis sélectionnez Gérer les packages NuGet... .
Sélectionnez l’onglet Parcourir et tapez Azure. IA. FormRecognizer.
Sélectionnez la version 3.1.1 dans le menu déroulant, puis sélectionnez Installer.
Créer votre application
Pour interagir avec le service Document Intelligence, vous devez créer une instance de la FormRecognizerClient classe. Pour ce faire, vous créez un AzureKeyCredential associé à votre clé et une instance FormRecognizerClient avec le AzureKeyCredential et votre Document Intelligence endpoint.
Note
- À compter de .NET 6, de nouveaux projets utilisant le modèle
consolegénèrent un nouveau style de programme qui diffère des versions précédentes. - La nouvelle sortie utilise des fonctionnalités C# récentes qui simplifient le code que vous devez écrire.
- Lorsque vous utilisez la version la plus récente, vous devez uniquement écrire le corps de la
Mainméthode. Vous n’avez pas besoin d’inclure des instructions de niveau supérieur, des directives using globales ou des directives using implicites. - Pour plus d’informations, consultezLes nouveaux modèles C# génèrent des instructions de niveau supérieur.
Ouvrez le fichier Program.cs .
Incluez les directives using suivantes :
using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
- Définissez vos variables d’environnement
endpointetkey, puis créez votre instanceAzureKeyCredentialetFormRecognizerClient.
private static readonly string endpoint = "your-form-recognizer-endpoint";
private static readonly string key = "your-api-key";
private static readonly AzureKeyCredential credential = new AzureKeyCredential(key);
Supprimez la ligne,
Console.Writeline("Hello World!");et ajoutez l’un des exemples de code Try It au fichier Program.cs :
Sélectionnez un exemple de code à copier et coller dans la méthode Main de votre application :
Important
N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultez l’article de sécurité des outils Foundry.
Essayez-le : modèle de disposition
Extrayez du texte, des marques de sélection, des styles de texte et des structures de tableau, ainsi que leurs coordonnées de région englobante à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URI du fichier à la
formUrivariable. - Pour extraire la disposition à partir d’un fichier donné à un URI, utilisez la
StartRecognizeContentFromUriAsyncméthode.
Ajoutez le code suivant à votre application de disposition dans le fichier Program.cs :
FormRecognizerClient recognizerClient = AuthenticateClient();
Task recognizeContent = RecognizeContent(recognizerClient);
Task.WaitAll(recognizeContent);
private static FormRecognizerClient AuthenticateClient()
{
var credential = new AzureKeyCredential(key);
var client = new FormRecognizerClient(new Uri(endpoint), credential);
return client;
}
private static async Task RecognizeContent(FormRecognizerClient recognizerClient)
{
string formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
FormPageCollection formPages = await recognizerClient
.StartRecognizeContentFromUri(new Uri(formUrl))
.WaitForCompletionAsync();
foreach (FormPage page in formPages)
{
Console.WriteLine($"Form Page {page.PageNumber} has {page.Lines.Count} lines.");
for (int i = 0; i < page.Lines.Count; i++)
{
FormLine line = page.Lines[i];
Console.WriteLine($" Line {i} has {line.Words.Count} word{(line.Words.Count > 1 ? "s" : "")}, and text: '{line.Text}'.");
}
for (int i = 0; i < page.Tables.Count; i++)
{
FormTable table = page.Tables[i];
Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (FormTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) contains text: '{cell.Text}'.");
}
}
}
}
}
}
Essayez-le : modèle prédéfini
Cet exemple montre comment analyser des données de certains types de documents communs avec des modèles préentraînés, à l’aide d’une facture comme exemple.
- Pour cet exemple, nous allons analyser un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur de l’URI de fichier à la
invoiceUrivariable en haut de la méthode Main. - Pour analyser un fichier donné à un URI, utilisez la
StartRecognizeInvoicesFromUriAsyncméthode. - Par souci de simplicité, tous les champs retournés par le service ne sont pas affichés ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .
Choisir un modèle prédéfini
Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération d’analyse dépend du type de document à analyser. Voici les modèles prédéfinis actuellement pris en charge par le service Document Intelligence :
- Facture : extrait le texte, les marques de sélection, les tables, les champs et les informations clés des factures.
- Reçu: extrait le texte et les informations clés des reçus.
- Document d’identification : extrait le texte et les informations clés des permis de conduire et des passeports internationaux.
- Carte de visite : extrait le texte et les informations clés des cartes de visite.
Ajoutez le code suivant à votre application de facturation préétablie dans la méthode du fichier Program.cs
FormRecognizerClient recognizerClient = AuthenticateClient();
Task analyzeinvoice = AnalyzeInvoice(recognizerClient, invoiceUrl);
Task.WaitAll(analyzeinvoice);
private static FormRecognizerClient AuthenticateClient() {
var credential = new AzureKeyCredential(key);
var client = new FormRecognizerClient(new Uri(endpoint), credential);
return client;
}
static string invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
private static async Task AnalyzeInvoice(FormRecognizerClient recognizerClient, string invoiceUrl) {
var options = new RecognizeInvoicesOptions() {
Locale = "en-US"
};
RecognizedFormCollection invoices = await recognizerClient.StartRecognizeInvoicesFromUriAsync(new Uri(invoiceUrl), options).WaitForCompletionAsync();
RecognizedForm invoice = invoices[0];
FormField invoiceIdField;
if (invoice.Fields.TryGetValue("InvoiceId", out invoiceIdField)) {
if (invoiceIdField.Value.ValueType == FieldValueType.String) {
string invoiceId = invoiceIdField.Value.AsString();
Console.WriteLine($" Invoice Id: '{invoiceId}', with confidence {invoiceIdField.Confidence}");
}
}
FormField invoiceDateField;
if (invoice.Fields.TryGetValue("InvoiceDate", out invoiceDateField)) {
if (invoiceDateField.Value.ValueType == FieldValueType.Date) {
DateTime invoiceDate = invoiceDateField.Value.AsDate();
Console.WriteLine($" Invoice Date: '{invoiceDate}', with confidence {invoiceDateField.Confidence}");
}
}
FormField dueDateField;
if (invoice.Fields.TryGetValue("DueDate", out dueDateField)) {
if (dueDateField.Value.ValueType == FieldValueType.Date) {
DateTime dueDate = dueDateField.Value.AsDate();
Console.WriteLine($" Due Date: '{dueDate}', with confidence {dueDateField.Confidence}");
}
}
FormField vendorNameField;
if (invoice.Fields.TryGetValue("VendorName", out vendorNameField)) {
if (vendorNameField.Value.ValueType == FieldValueType.String) {
string vendorName = vendorNameField.Value.AsString();
Console.WriteLine($" Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
}
FormField vendorAddressField;
if (invoice.Fields.TryGetValue("VendorAddress", out vendorAddressField)) {
if (vendorAddressField.Value.ValueType == FieldValueType.String) {
string vendorAddress = vendorAddressField.Value.AsString();
Console.WriteLine($" Vendor Address: '{vendorAddress}', with confidence {vendorAddressField.Confidence}");
}
}
FormField customerNameField;
if (invoice.Fields.TryGetValue("CustomerName", out customerNameField)) {
if (customerNameField.Value.ValueType == FieldValueType.String) {
string customerName = customerNameField.Value.AsString();
Console.WriteLine($" Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
}
FormField customerAddressField;
if (invoice.Fields.TryGetValue("CustomerAddress", out customerAddressField)) {
if (customerAddressField.Value.ValueType == FieldValueType.String) {
string customerAddress = customerAddressField.Value.AsString();
Console.WriteLine($" Customer Address: '{customerAddress}', with confidence {customerAddressField.Confidence}");
}
}
FormField customerAddressRecipientField;
if (invoice.Fields.TryGetValue("CustomerAddressRecipient", out customerAddressRecipientField)) {
if (customerAddressRecipientField.Value.ValueType == FieldValueType.String) {
string customerAddressRecipient = customerAddressRecipientField.Value.AsString();
Console.WriteLine($" Customer address recipient: '{customerAddressRecipient}', with confidence {customerAddressRecipientField.Confidence}");
}
}
FormField invoiceTotalField;
if (invoice.Fields.TryGetValue("InvoiceTotal", out invoiceTotalField)) {
if (invoiceTotalField.Value.ValueType == FieldValueType.Float) {
float invoiceTotal = invoiceTotalField.Value.AsFloat();
Console.WriteLine($" Invoice Total: '{invoiceTotal}', with confidence {invoiceTotalField.Confidence}");
}
}
}
}
}
Exécuter votre application
Choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.
Documentation de référence | Code source de la bibliothèque | Package (Maven) | Exemples
Dans ce guide de démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées à partir de formulaires et de documents :
Conditions préalables
abonnement Azure - Créez-en un gratuitement.
Un kit de développement Java (JDK) version 8 ou ultérieure. Pour plus d’informations, voirles versions de Java prises en charge et le calendrier des mises à jour.
Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource de Document Intelligence à service unique ou multi-service dans le portail Azure afin d'obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (
F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :
Configurer
Créer un projet Gradle
Dans une fenêtre de console (par exemple, cmd, PowerShell ou Bash), créez un répertoire pour votre application appelée form-recognizer-app, puis accédez-y.
mkdir form-recognizer-app && form-recognizer-app
Exécutez la
gradle initcommande à partir de votre répertoire de travail. Cette commande crée des fichiers de build essentiels pour Gradle, notamment build.gradle.kts, qui est utilisé lors de l’exécution pour créer et configurer votre application.gradle init --type basicLorsque vous êtes invité à choisir une DSL, sélectionnez Kotlin.
Accepter le nom du projet par défaut (form-recognizer-app)
Installer la bibliothèque cliente
Ce guide de démarrage rapide utilise le gestionnaire de dépendances Gradle. Vous trouverez la bibliothèque cliente et les informations pour d’autres gestionnaires de dépendances sur le référentiel central Maven.
Dans le fichier build.gradle.kts de votre projet, incluez la bibliothèque cliente en tant qu’instruction implementation , ainsi que les plug-ins et paramètres requis.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}
Créer un fichier Java
À partir de votre répertoire de travail, exécutez la commande suivante :
mkdir -p src/main/java
Vous créez la structure de répertoires suivante :
Accédez au répertoire Java et créez un fichier appelé FormRecognizer.java. Ouvrez-le dans votre éditeur ou IDE préféré et ajoutez la déclaration de package suivante et les instructions import.
import com.azure.ai.formrecognizer.*;
import com.azure.ai.formrecognizer.models.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.Context;
import com.azure.core.util.polling.SyncPoller;
Sélectionnez un exemple de code à copier et coller dans la méthode principale de votre application :
Important
N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultezSécurité des outils Foundry.
Essayez-le : modèle de disposition
Extrayez du texte, des marques de sélection, des styles de texte et des structures de tableau, ainsi que leurs coordonnées de région englobante à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
- Pour analyser un fichier donné à un URI, vous allez utiliser la
beginRecognizeContentFromUrlméthode. - Nous avons ajouté la valeur d’URI de fichier à la
formUrlvariable dans la méthode principale.
Mettez à jour la classe FormRecognizer de votre application, avec le code suivant (veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs de votre instance Document Intelligence du portail Azure) :
static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
public static void main(String[] args) {FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder()
.credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();
String formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
System.out.println("Get form content...");
GetContent(recognizerClient, formUrl);
}
private static void GetContent(FormRecognizerClient recognizerClient, String invoiceUri) {
String analyzeFilePath = invoiceUri;
SyncPoller<FormRecognizerOperationResult, List<FormPage>> recognizeContentPoller = recognizerClient
.beginRecognizeContentFromUrl(analyzeFilePath);
List<FormPage> contentResult = recognizeContentPoller.getFinalResult();
// </snippet_getcontent_call>
// <snippet_getcontent_print>
contentResult.forEach(formPage -> {
// Table information
System.out.println("----Recognizing content ----");
System.out.printf("Has width: %f and height: %f, measured with unit: %s.%n", formPage.getWidth(),
formPage.getHeight(), formPage.getUnit());
formPage.getTables().forEach(formTable -> {
System.out.printf("Table has %d rows and %d columns.%n", formTable.getRowCount(),
formTable.getColumnCount());
formTable.getCells().forEach(formTableCell -> {
System.out.printf("Cell has text %s.%n", formTableCell.getText());
});
System.out.println();
});
});
}
Essayez-le : modèle prédéfini
Cet exemple montre comment analyser des données de certains types de documents communs avec des modèles préentraînés, à l’aide d’une facture comme exemple.
- Pour cet exemple, nous allons analyser un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
- Pour analyser un fichier donné à une URI, vous utiliserez le
beginRecognizeInvoicesFromUrl. - Nous avons ajouté la valeur d’URI de fichier à la
invoiceUrlvariable dans la méthode principale. - Par souci de simplicité, tous les champs retournés par le service ne sont pas affichés ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .
Choisir un modèle prédéfini
Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Voici les modèles prédéfinis actuellement pris en charge par le service Document Intelligence :
- Facture : extrait le texte, les marques de sélection, les tables, les champs et les informations clés des factures.
- Reçu: extrait le texte et les informations clés des reçus.
- Document d’identification : extrait le texte et les informations clés des permis de conduire et des passeports internationaux.
- Carte de visite : extrait le texte et les informations clés des cartes de visite.
Mettez à jour la classe FormRecognizer de votre application, avec le code suivant (veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs de votre instance Document Intelligence du portail Azure) :
static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
public static void main(String[] args) {
FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder().credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
System.out.println("Analyze invoice...");
AnalyzeInvoice(recognizerClient, invoiceUrl);
}
private static void AnalyzeInvoice(FormRecognizerClient recognizerClient, String invoiceUrl) {
SyncPoller < FormRecognizerOperationResult,
List < RecognizedForm >> recognizeInvoicesPoller = recognizerClient.beginRecognizeInvoicesFromUrl(invoiceUrl);
List < RecognizedForm > recognizedInvoices = recognizeInvoicesPoller.getFinalResult();
for (int i = 0; i < recognizedInvoices.size(); i++) {
RecognizedForm recognizedInvoice = recognizedInvoices.get(i);
Map < String,
FormField > recognizedFields = recognizedInvoice.getFields();
System.out.printf("----------- Recognized invoice info for page %d -----------%n", i);
FormField vendorNameField = recognizedFields.get("VendorName");
if (vendorNameField != null) {
if (FieldValueType.STRING == vendorNameField.getValue().getValueType()) {
String merchantName = vendorNameField.getValue().asString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n", merchantName, vendorNameField.getConfidence());
}
}
FormField vendorAddressField = recognizedFields.get("VendorAddress");
if (vendorAddressField != null) {
if (FieldValueType.STRING == vendorAddressField.getValue().getValueType()) {
String merchantAddress = vendorAddressField.getValue().asString();
System.out.printf("Vendor address: %s, confidence: %.2f%n", merchantAddress, vendorAddressField.getConfidence());
}
}
FormField customerNameField = recognizedFields.get("CustomerName");
if (customerNameField != null) {
if (FieldValueType.STRING == customerNameField.getValue().getValueType()) {
String merchantAddress = customerNameField.getValue().asString();
System.out.printf("Customer Name: %s, confidence: %.2f%n", merchantAddress, customerNameField.getConfidence());
}
}
FormField customerAddressRecipientField = recognizedFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (FieldValueType.STRING == customerAddressRecipientField.getValue().getValueType()) {
String customerAddr = customerAddressRecipientField.getValue().asString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n", customerAddr, customerAddressRecipientField.getConfidence());
}
}
FormField invoiceIdField = recognizedFields.get("InvoiceId");
if (invoiceIdField != null) {
if (FieldValueType.STRING == invoiceIdField.getValue().getValueType()) {
String invoiceId = invoiceIdField.getValue().asString();
System.out.printf("Invoice Id: %s, confidence: %.2f%n", invoiceId, invoiceIdField.getConfidence());
}
}
FormField invoiceDateField = recognizedFields.get("InvoiceDate");
if (customerNameField != null) {
if (FieldValueType.DATE == invoiceDateField.getValue().getValueType()) {
LocalDate invoiceDate = invoiceDateField.getValue().asDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n", invoiceDate, invoiceDateField.getConfidence());
}
}
FormField invoiceTotalField = recognizedFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (FieldValueType.FLOAT == invoiceTotalField.getValue().getValueType()) {
Float invoiceTotal = invoiceTotalField.getValue().asFloat();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n", invoiceTotal, invoiceTotalField.getConfidence());
}
}
}
}
Générer et exécuter votre application
Revenez au répertoire de votre projet principal : form-recognizer-app.
- Générez votre application avec la
buildcommande :
gradle build
- Exécutez votre application avec la
runcommande :
gradle run
Documentation de référence | Code source de la bibliothèque | Paquet (npm) | Exemples
Dans ce guide de démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées à partir de formulaires et de documents :
Conditions préalables
abonnement Azure - Créez-en un gratuitement.
La dernière version de Visual Studio Code ou votre IDE préféré.
La dernière
LTSversion de Node.jsRessource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource de Document Intelligence à service unique ou multi-service dans le portail Azure afin d'obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (
F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.Conseil
Créez une ressource de fonderie si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison ou clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Notez que vous aurez besoin d'une ressource à service unique si vous envisagez d'utiliser l'authentification Microsoft Entra.
Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :
Configurer
Créez une application Node.js. Dans une fenêtre de console (par exemple, cmd, PowerShell ou Bash), créez un répertoire pour votre application et accédez-y.
mkdir form-recognizer-app && cd form-recognizer-appExécutez la
npm initcommande pour créer une application de nœud avec unpackage.jsonfichier.npm initInstallez le package npm de la
ai-form-recognizerbibliothèque cliente :npm install @azure/ai-form-recognizerLe fichier de l'application
package.jsonest mis à jour avec les dépendances.Créez un fichier nommé
index.js, ouvrez-le et importez les bibliothèques suivantes :const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");Créez des variables pour le point de terminaison et la clé Azure de votre ressource :
const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE"; const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";À ce stade, votre application JavaScript doit contenir les lignes de code suivantes :
const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer"); const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"; const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
Sélectionnez un exemple de code à copier et coller dans votre application :
Important
N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultezSécurité des outils Foundry.
Essayez-le : modèle de disposition
- Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URI du fichier à la
formUrlvariable en haut du fichier. - Pour analyser un fichier donné à un URI, vous allez utiliser la
beginRecognizeContentméthode.
Ajoutez le code suivant à votre application de disposition sur la ligne située sous la key variable
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
async function recognizeContent() {
const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginRecognizeContentFromUrl(formUrl);
const pages = await poller.pollUntilDone();
if (!pages || pages.length === 0) {
throw new Error("Expecting non-empty list of pages!");
}
for (const page of pages) {
console.log(
`Page ${page.pageNumber}: width ${page.width} and height ${page.height} with unit ${page.unit}`
);
for (const table of page.tables) {
for (const cell of table.cells) {
console.log(`cell [${cell.rowIndex},${cell.columnIndex}] has text ${cell.text}`);
}
}
}
}
recognizeContent().catch((err) => {
console.error("The sample encountered an error:", err);
});
Essayez-le : modèle prédéfini
Cet exemple montre comment analyser des données de certains types de documents communs avec des modèles préentraînés, à l’aide d’une facture comme exemple. Consultez notre page de concept prédéfinie pour obtenir la liste complète des champs de facture
- Pour cet exemple, nous allons analyser un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URI du fichier à la
invoiceUrlvariable en haut du fichier. - Pour analyser un fichier donné à un URI, vous allez utiliser la
beginRecognizeInvoicesméthode. - Par souci de simplicité, tous les champs retournés par le service ne sont pas affichés ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .
Choisir un modèle prédéfini
Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Voici les modèles prédéfinis actuellement pris en charge par le service Document Intelligence :
- Facture : extrait le texte, les marques de sélection, les tables, les champs et les informations clés des factures.
- Reçu: extrait le texte et les informations clés des reçus.
- Document d’identification : extrait le texte et les informations clés des permis de conduire et des passeports internationaux.
- Carte de visite : extrait le texte et les informations clés des cartes de visite.
Ajoutez le code suivant à votre application de facture prédéfinie sous la key variable
const invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
async function recognizeInvoices() {
const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginRecognizeInvoicesFromUrl(invoiceUrl);
const [invoice] = await poller.pollUntilDone();
if (invoice === undefined) {
throw new Error("Failed to extract data from at least one invoice.");
}
/**
* This is a helper function for printing a simple field with an elemental type.
*/
function fieldToString(field) {
const {
name,
valueType,
value,
confidence
} = field;
return `${name} (${valueType}): '${value}' with confidence ${confidence}'`;
}
console.log("Invoice fields:");
/**
* Invoices contain a lot of optional fields, but they are all of elemental types
* such as strings, numbers, and dates, so we will just enumerate them all.
*/
for (const [name, field] of Object.entries(invoice.fields)) {
if (field.valueType !== "array" && field.valueType !== "object") {
console.log(`- ${name} ${fieldToString(field)}`);
}
}
// Invoices also support nested line items, so we can iterate over them.
let idx = 0;
console.log("- Items:");
const items = invoice.fields["Items"]?.value;
for (const item of items ?? []) {
const value = item.value;
// Each item has several subfields that are nested within the item. We'll
// map over this list of the subfields and filter out any fields that
// weren't found. Not all fields will be returned every time, only those
// that the service identified for the particular document in question.
const subFields = [
"Description",
"Quantity",
"Unit",
"UnitPrice",
"ProductCode",
"Date",
"Tax",
"Amount"
]
.map((fieldName) => value[fieldName])
.filter((field) => field !== undefined);
console.log(
[
` - Item #${idx}`,
// Now we will convert those fields into strings to display
...subFields.map((field) => ` - ${fieldToString(field)}`)
].join("\n")
);
}
}
recognizeInvoices().catch((err) => {
console.error("The sample encountered an error:", err);
});
Documentation de référence | Code source de la bibliothèque | Package (PyPi) | Exemples
Dans ce guide de démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées à partir de formulaires et de documents :
Conditions préalables
Abonnement Azure - Créez-en un gratuitement
-
- Votre installation de Python doit inclure pip. Vous pouvez vérifier si pip est installé en exécutant
pip --versionla ligne de commande. Obtenez pip en installant la dernière version de Python.
- Votre installation de Python doit inclure pip. Vous pouvez vérifier si pip est installé en exécutant
Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource de Document Intelligence à service unique ou multi-service dans le portail Azure afin d'obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (
F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.Conseil
Créez une ressource de fonderie si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison ou clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Notez que vous aurez besoin d'une ressource à service unique si vous envisagez d'utiliser l'authentification Microsoft Entra.
Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :
Configurer
Ouvrez une fenêtre de terminal dans votre environnement local et installez la bibliothèque cliente Azure Document Intelligence dans Foundry Tools pour Python avec pip :
pip install azure-ai-formrecognizer
Créer une application Python
Créez une application Python appelée form_recognizer_quickstart.py dans votre éditeur ou IDE préféré. Importez ensuite les bibliothèques suivantes :
import os
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential
Créer des variables pour le point de terminaison et la clé de votre ressource Azure
endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"
À ce stade, votre application Python doit contenir les lignes de code suivantes :
import os
from azure.core.exceptions import ResourceNotFoundError
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"
Sélectionnez un exemple de code à copier et coller dans votre application :
Important
N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultezSécurité des outils Foundry.
Essayez-le : modèle de disposition
- Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URI du fichier à la
formUrlvariable en haut du fichier. - Pour analyser un fichier donné à un URI, vous allez utiliser la
begin_recognize_content_from_urlméthode.
Ajoutez le code suivant à votre application de disposition sur la ligne située sous la key variable
def format_bounding_box(bounding_box):
if not bounding_box:
return "N/A"
return ", ".join(["[{}, {}]".format(p.x, p.y) for p in bounding_box])
def recognize_content():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = form_recognizer_client.begin_recognize_content_from_url(formUrl)
form_pages = poller.result()
for idx, content in enumerate(form_pages):
print(
"Page has width: {} and height: {}, measured with unit: {}".format(
content.width, content.height, content.unit
)
)
for table_idx, table in enumerate(content.tables):
print(
"Table # {} has {} rows and {} columns".format(
table_idx, table.row_count, table.column_count
)
)
print(
"Table # {} location on page: {}".format(
table_idx, format_bounding_box(table.bounding_box)
)
)
for cell in table.cells:
print(
"...Cell[{}][{}] has text '{}' within bounding box '{}'".format(
cell.row_index,
cell.column_index,
cell.text,
format_bounding_box(cell.bounding_box),
)
)
for line_idx, line in enumerate(content.lines):
print(
"Line # {} has word count '{}' and text '{}' within bounding box '{}'".format(
line_idx,
len(line.words),
line.text,
format_bounding_box(line.bounding_box),
)
)
if line.appearance:
if (
line.appearance.style_name == "handwriting"
and line.appearance.style_confidence > 0.8
):
print(
"Text line '{}' is handwritten and might be a signature.".format(
line.text
)
)
for word in line.words:
print(
"...Word '{}' has a confidence of {}".format(
word.text, word.confidence
)
)
for selection_mark in content.selection_marks:
print(
"Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
selection_mark.state,
format_bounding_box(selection_mark.bounding_box),
selection_mark.confidence,
)
)
print("----------------------------------------")
if __name__ == "__main__":
recognize_content()
Essayez-le : modèle prédéfini
Cet exemple montre comment analyser des données de certains types de documents communs avec des modèles préentraînés, à l’aide d’une facture comme exemple. Consultez notre page de concept prédéfinie pour obtenir la liste complète des champs de facture
- Pour cet exemple, nous allons analyser un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URI du fichier à la variable « formUrl » en haut du fichier.
- Pour analyser un fichier à une URI donnée, utilisez la méthode `begin_recognize_invoices_from_url`.
- Par souci de simplicité, tous les champs retournés par le service ne sont pas affichés ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .
Choisir un modèle prédéfini
Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Voici les modèles prédéfinis actuellement pris en charge par le service Document Intelligence :
- Facture : extrait le texte, les marques de sélection, les tables, les champs et les informations clés des factures.
- Reçu: extrait le texte et les informations clés des reçus.
- Document d’identification : extrait le texte et les informations clés des permis de conduire et des passeports internationaux.
- Carte de visite : extrait le texte et les informations clés des cartes de visite.
Ajoutez le code suivant à votre application de facture prédéfinie sous la key variable
def recognize_invoice():
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = form_recognizer_client.begin_recognize_invoices_from_url(
invoiceUrl, locale="en-US"
)
invoices = poller.result()
for idx, invoice in enumerate(invoices):
vendor_name = invoice.fields.get("VendorName")
if vendor_name:
print(
"Vendor Name: {} has confidence: {}".format(
vendor_name.value, vendor_name.confidence
)
)
vendor_address = invoice.fields.get("VendorAddress")
if vendor_address:
print(
"Vendor Address: {} has confidence: {}".format(
vendor_address.value, vendor_address.confidence
)
)
vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
if vendor_address_recipient:
print(
"Vendor Address Recipient: {} has confidence: {}".format(
vendor_address_recipient.value, vendor_address_recipient.confidence
)
)
customer_name = invoice.fields.get("CustomerName")
if customer_name:
print(
"Customer Name: {} has confidence: {}".format(
customer_name.value, customer_name.confidence
)
)
customer_id = invoice.fields.get("CustomerId")
if customer_id:
print(
"Customer Id: {} has confidence: {}".format(
customer_id.value, customer_id.confidence
)
)
customer_address = invoice.fields.get("CustomerAddress")
if customer_address:
print(
"Customer Address: {} has confidence: {}".format(
customer_address.value, customer_address.confidence
)
)
customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
if customer_address_recipient:
print(
"Customer Address Recipient: {} has confidence: {}".format(
customer_address_recipient.value,
customer_address_recipient.confidence,
)
)
invoice_id = invoice.fields.get("InvoiceId")
if invoice_id:
print(
"Invoice Id: {} has confidence: {}".format(
invoice_id.value, invoice_id.confidence
)
)
invoice_date = invoice.fields.get("InvoiceDate")
if invoice_date:
print(
"Invoice Date: {} has confidence: {}".format(
invoice_date.value, invoice_date.confidence
)
)
invoice_total = invoice.fields.get("InvoiceTotal")
if invoice_total:
print(
"Invoice Total: {} has confidence: {}".format(
invoice_total.value, invoice_total.confidence
)
)
due_date = invoice.fields.get("DueDate")
if due_date:
print(
"Due Date: {} has confidence: {}".format(
due_date.value, due_date.confidence
)
)
purchase_order = invoice.fields.get("PurchaseOrder")
if purchase_order:
print(
"Purchase Order: {} has confidence: {}".format(
purchase_order.value, purchase_order.confidence
)
)
billing_address = invoice.fields.get("BillingAddress")
if billing_address:
print(
"Billing Address: {} has confidence: {}".format(
billing_address.value, billing_address.confidence
)
)
billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
if billing_address_recipient:
print(
"Billing Address Recipient: {} has confidence: {}".format(
billing_address_recipient.value,
billing_address_recipient.confidence,
)
)
shipping_address = invoice.fields.get("ShippingAddress")
if shipping_address:
print(
"Shipping Address: {} has confidence: {}".format(
shipping_address.value, shipping_address.confidence
)
)
shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
if shipping_address_recipient:
print(
"Shipping Address Recipient: {} has confidence: {}".format(
shipping_address_recipient.value,
shipping_address_recipient.confidence,
)
)
print("Invoice items:")
for idx, item in enumerate(invoice.fields.get("Items").value):
item_description = item.value.get("Description")
if item_description:
print(
"......Description: {} has confidence: {}".format(
item_description.value, item_description.confidence
)
)
item_quantity = item.value.get("Quantity")
if item_quantity:
print(
"......Quantity: {} has confidence: {}".format(
item_quantity.value, item_quantity.confidence
)
)
unit = item.value.get("Unit")
if unit:
print(
"......Unit: {} has confidence: {}".format(
unit.value, unit.confidence
)
)
unit_price = item.value.get("UnitPrice")
if unit_price:
print(
"......Unit Price: {} has confidence: {}".format(
unit_price.value, unit_price.confidence
)
)
product_code = item.value.get("ProductCode")
if product_code:
print(
"......Product Code: {} has confidence: {}".format(
product_code.value, product_code.confidence
)
)
item_date = item.value.get("Date")
if item_date:
print(
"......Date: {} has confidence: {}".format(
item_date.value, item_date.confidence
)
)
tax = item.value.get("Tax")
if tax:
print(
"......Tax: {} has confidence: {}".format(tax.value, tax.confidence)
)
amount = item.value.get("Amount")
if amount:
print(
"......Amount: {} has confidence: {}".format(
amount.value, amount.confidence
)
)
subtotal = invoice.fields.get("SubTotal")
if subtotal:
print(
"Subtotal: {} has confidence: {}".format(
subtotal.value, subtotal.confidence
)
)
total_tax = invoice.fields.get("TotalTax")
if total_tax:
print(
"Total Tax: {} has confidence: {}".format(
total_tax.value, total_tax.confidence
)
)
previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
if previous_unpaid_balance:
print(
"Previous Unpaid Balance: {} has confidence: {}".format(
previous_unpaid_balance.value, previous_unpaid_balance.confidence
)
)
amount_due = invoice.fields.get("AmountDue")
if amount_due:
print(
"Amount Due: {} has confidence: {}".format(
amount_due.value, amount_due.confidence
)
)
service_start_date = invoice.fields.get("ServiceStartDate")
if service_start_date:
print(
"Service Start Date: {} has confidence: {}".format(
service_start_date.value, service_start_date.confidence
)
)
service_end_date = invoice.fields.get("ServiceEndDate")
if service_end_date:
print(
"Service End Date: {} has confidence: {}".format(
service_end_date.value, service_end_date.confidence
)
)
service_address = invoice.fields.get("ServiceAddress")
if service_address:
print(
"Service Address: {} has confidence: {}".format(
service_address.value, service_address.confidence
)
)
service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
if service_address_recipient:
print(
"Service Address Recipient: {} has confidence: {}".format(
service_address_recipient.value,
service_address_recipient.confidence,
)
)
remittance_address = invoice.fields.get("RemittanceAddress")
if remittance_address:
print(
"Remittance Address: {} has confidence: {}".format(
remittance_address.value, remittance_address.confidence
)
)
remittance_address_recipient = invoice.fields.get("RemittanceAddressRecipient")
if remittance_address_recipient:
print(
"Remittance Address Recipient: {} has confidence: {}".format(
remittance_address_recipient.value,
remittance_address_recipient.confidence,
)
)
if __name__ == "__main__":
recognize_invoice()
Exécuter votre application
Accédez au dossier dans lequel vous disposez de votre fichier form_recognizer_quickstart.py .
Tapez la commande suivante dans votre terminal :
python form_recognizer_quickstart.py
API REST | Document Intelligence | Référence de l'API REST Azure |
Dans ce guide de démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées à partir de formulaires et de documents :
Conditions préalables
Abonnement Azure - Créez-en un gratuitement
cURL installé.
PowerShell version 6.0+, ou une application de ligne de commande similaire.
Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource de Document Intelligence à service unique ou multi-service dans le portail Azure afin d'obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (
F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.Conseil
Créez une ressource de fonderie si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison ou clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Notez que vous aurez besoin d'une ressource à service unique si vous envisagez d'utiliser l'authentification Microsoft Entra.
Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :
Sélectionnez un exemple de code à copier et coller dans votre application :
Important
N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultezSécurité des outils Foundry.
Essayez-le : modèle de disposition
- Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
- Remplacez
{endpoint}par le point de terminaison que vous avez obtenu par votre abonnement Document Intelligence. - Remplacez
{key}par la clé que vous avez copiée à l’étape précédente. - Remplacez par
\"{your-document-url}un exemple d’URL de document :
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Demande
curl -v -i POST "https://{endpoint}/formrecognizer/v2.1/layout/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
Operation-Location
Vous recevez une 202 (Success) réponse qui inclut un en-tête "Operation-Location" . La valeur de cet en-tête contient un ID de résultat que vous pouvez utiliser pour interroger l’état de l’opération asynchrone et obtenir les résultats :
https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.
Dans l’exemple suivant, dans le cadre de l’URL, la chaîne après analyzeResults/ est l’ID de résultat.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Obtenir les résultats de mise en page
Après avoir appelé l’API Analyze Layout , vous appelez l’API Get Analyze Layout Result pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez ces modifications :
- Remplacez
{endpoint}par le point de terminaison que vous avez obtenu par votre abonnement Document Intelligence. - Remplacez
{key}par la clé que vous avez copiée à l’étape précédente. - Remplacez
{resultId}par l’ID de résultat de l’étape précédente.
Demande
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Examiner les résultats
Vous recevez une réponse contenant du contenu JSON 200 (success).
Consultez l’image de facture suivante et sa sortie JSON correspondante.
- Le
"readResults"nœud contient chaque ligne de texte avec son positionnement de zone englobante respective sur la page. - Le
selectionMarksnœud affiche chaque marque de sélection (case à cocher, case d’option) et indique si son état estselectedouunselected. - La
"pageResults"section inclut les tables extraites. Pour chaque tableau, le texte, l'index de ligne et de colonne, l'étendue de lignes et de colonnes, la boîte englobante, et plus encore sont extraits.
Corps de la réponse
Vous pouvez afficher le résultat d'exemple complet sur GitHub.
Essayez-le : modèle prédéfini
- Pour cet exemple, nous allons analyser un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
Choisir un modèle prédéfini
Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Voici les modèles prédéfinis actuellement pris en charge par le service Document Intelligence :
- Facture : extrait le texte, les marques de sélection, les tables, les champs et les informations clés des factures.
- Reçu: extrait le texte et les informations clés des reçus.
- Document d’identification : extrait le texte et les informations clés des permis de conduire et des passeports internationaux.
- Carte de visite : extrait le texte et les informations clés des cartes de visite.
Avant d’exécuter la commande, apportez ces modifications :
Remplacez
{endpoint}par le point de terminaison que vous avez obtenu par votre abonnement Document Intelligence.Remplacez
{key}par la clé que vous avez copiée à l’étape précédente.Remplacez
\"{your-document-url}par un exemple d'URL de facture :https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf
Demande
curl -v -i POST https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your invoice URL}'}"
Operation-Location
Vous recevez une 202 (Success) réponse qui inclut un en-tête "Operation-Location" . La valeur de cet en-tête contient un ID de résultat que vous pouvez utiliser pour interroger l’état de l’opération asynchrone et obtenir les résultats :
https:// cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}
Dans l’exemple suivant, dans le cadre de l’URL, la chaîne après analyzeResults/ est l’ID de résultat :
https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Obtenir les résultats de la facture
Après avoir appelé l’API Analyze Invoice , vous appelez l’API Get Analyze Invoice Result pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez ces modifications :
- Remplacez
{endpoint}par le point de terminaison que vous avez obtenu par votre clé Document Intelligence. Vous pouvez le trouver sous l’onglet Vue d’ensemble de votre ressource Document Intelligence. - Remplacez
{resultId}par l’ID de résultat de l’étape précédente. - Remplacez
{key}par votre clé.
Demande
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Examiner la réponse
Vous recevez une réponse 200 (Success) avec une sortie JSON.
- Le
"readResults"champ contient chaque ligne de texte extraite de la facture. - Inclut les tableaux et les marques de sélection extraites de la facture
"pageResults". - Le
"documentResults"champ contient des informations clé/valeur pour les parties les plus pertinentes de la facture.
Consultez le document Facture d'exemple.
Corps de la réponse
Consultez l’exemple de sortie full sur GitHub.
C’est ça, bien fait !
Étapes suivantes
Pour une expérience améliorée et une qualité de modèle avancée, essayez Document Intelligence Studio.
Le Studio prend en charge tout modèle entraîné avec les données étiquetées v2.1.
Les journaux de modification fournissent des informations détaillées sur la migration de la version 3.1 vers la version 4.0.