Prise en main d’Intelligence documentaire
Important
- Azure Cognitive Services Form Recognizer est désormais Azure AI Intelligence documentaire.
- Certaines plateformes attendent toujours la mise à jour du changement de nom.
- Toutes les mention de Form Recognizer ou Intelligence documentaire dans notre documentation font référence au même service Azure.
Ce contenu s’applique à : v4.0 (préversion) Versions précédentes : v3.1 (GA) v3.0 (GA)
- Prise en main de la dernière préversion d’Azure AI Document Intelligence (2024-07-31-preview).
Ce contenu s’applique à : v3.1 (GA) Versions précédentes : v3.0 v2.1
- Bien démarrer avec la dernière version en disponibilité générale d’Azure Form Recognizer (
2023-07-31
).
Ce contenu s’applique à : v3.0 (GA) Nouvelles versions : v3.1 v2.1
- Bien démarrer avec la version en disponibilité générale précédente d’Azure Form Recognizer (
2022-08-31
).
Azure AI Intelligence documentaire / Form Recognizer est un service informatique Azure AI qui utilise l’apprentissage automatique pour extraire de vos documents des paires clé-valeur, du texte, des tableaux et des données clés.
Vous pouvez intégrer facilement des modèles de traitement des documents dans vos workflows et vos applications en utilisant un SDK de langage de programmation ou en appelant l’API REST.
Dans le cadre de ce guide de démarrage rapide, nous vous recommandons d’utiliser le service gratuit pendant que vous vous familiarisez avec 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 de l’API, consultez notre page Vue d’ensemble.
Bibliothèque de client | Référence du kit de développement logiciel (SDK) | Référence de l’API REST | Package| Exemples|Version de l’API REST prise en charge
Bibliothèque de client | Référence du kit de développement logiciel (SDK) | Référence de l’API | Package (NuGet) | Exemples | Version de l’API REST prise en charge
Bibliothèque de client | Référence du kit de développement logiciel (SDK) | Référence de l’API REST | Package | 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 de formulaires et de documents :
Modèle de mise en page—Analysez et extrayez les tableaux, les lignes, les mots et les marques de sélection comme les boutons radio et les cases à cocher dans les documents, sans avoir à former un modèle.
Modèle prédéfini – Analyser et extraire les champs communs de types de documents spécifiques à l’aide d’un modèle prédéfini.
Prérequis
Abonnement Azure : créez-en un gratuitement.
La version actuelle de l’IDE Visual Studio.
Une ressource Azure AI services ou Intelligence documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource monoservice ou multiservice Azure AI dans le portail Azure pour obtenir votre clé et votre point de terminaison.
Vous pouvez utiliser le niveau tarifaire Gratuit (
F0
) pour tester le service, puis passer par la suite à un niveau payant pour la production.
Conseil
Créez une ressource Azure AI services si vous envisagez d’accéder à plusieurs services Azure AI services sous un seul point de terminaison/une seule clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Veuillez noter que vous aurez besoin d’une ressource à service unique si vous avez l’intention d’utiliser l’authentification Microsoft Entra.
Après le déploiement de votre ressource, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison de la ressource que vous créez pour connecter votre application à l’API Azure AI Intelligence documentaire. Vous collez votre clé et votre point de terminaison dans le code plus loin dans ce guide de démarrage rapide :
Une ressource Azure AI services ou Form Recognizer. Une fois que vous avez votre abonnement Azure, créez une ressource monoservice ou multiservice Azure AI dans le portail Azure pour obtenir votre clé et votre point de terminaison.
Vous pouvez utiliser le niveau tarifaire Gratuit (
F0
) pour tester le service, puis passer par la suite à un niveau payant pour la production.
Conseil
Créez une ressource Azure AI services si vous envisagez d’accéder à plusieurs services Azure AI services sous un seul point de terminaison/une seule clé. Pour l’accès à Form Recognizer uniquement, créez une ressource Form Recognizer. Veuillez noter que vous aurez besoin d’une ressource à service unique si vous avez l’intention d’utiliser l’authentification Microsoft Entra.
Après le déploiement de votre ressource, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison 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 ce 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 nouveau projet, entrez console dans la zone de recherche. Choisissez le modèle Application console, puis choisissez Suivant.
- Dans la fenêtre de dialogue Configurer votre nouveau projet, entrez
doc_intel_quickstart
dans la zone Nom de projet. Ensuite, choisissez Suivant.
- Dans la fenêtre de dialogue Configurer votre nouveau projet, entrez
form_recognizer_quickstart
dans la zone Nom de projet. Ensuite, choisissez Suivant.
Dans la fenêtre de dialogue Informations supplémentaires, sélectionnez .NET 8.0 (Actuel), puis sélectionnez Créer.
Installer la bibliothèque de client 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 Parcourir, puis tapez Azure.AI.FormRecognizer.
Cochez la case
Include prerelease
.Choisissez une version dans le menu déroulant, puis 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, puis tapez Azure.AI.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, puis tapez Azure.AI.FormRecognizer. Sélectionnez la version 4.0.0 dans le menu déroulant.
Générer votre application
Pour interagir avec le service d’Intelligence documentaire, vous devez créer une instance de classe DocumentIntelligenceClient
. Pour ce faire, vous créez un AzureKeyCredential
avec votre key
depuis le portail Azure et une instance DocumentIntelligenceClient
avec le AzureKeyCredential
et votre endpoint
d’Intelligence documentaire.
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
depuis le portail Azure et une instance DocumentAnalysisClient
avec le AzureKeyCredential
et votre endpoint
Form Recognizer.
Notes
- À compter de .NET 6, de nouveaux projets utilisant le modèle
console
gé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
Main
méthode. Vous n’avez pas besoin d’inclure des instructions de niveau supérieur, des directives globales à l’aide de directives ou des directives implicites. - Pour plus d’informations, consultez Les nouveaux modèles C# génèrent des instructions de plus haut niveau.
Ouvrez le fichier Program.cs.
Supprimez le code préexistant, y compris la ligne
Console.Writeline("Hello World!")
, puis sélectionnez l’un des exemples de code suivants à copier et coller dans le fichier Program.cs de votre application :
Important
N’oubliez pas de supprimer la clé de votre code une fois que vous avez terminé, et ne la postez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Si vous souhaitez en savoir plus, veuillez consulter la rubriqueSécurité Azure AI services.
Modèle de disposition
Extrayez le texte, les marques de sélection, les styles de texte et les structures de tableaux, ainsi que les coordonnées de leurs cadres de limitation, à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document au niveau d’un URL. Vous pouvez utiliser notre exemple de document pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur de l’URI du fichier à la variable
Uri fileUri
en haut du fichier. - Pour extraire la disposition d’un fichier donné au niveau d’un URI, utilisez la méthode
StartAnalyzeDocumentFromUri
et transmettezprebuilt-layout
comme ID de modèle. La valeur retournée est un objetAnalyzeResult
contenant des données provenant du document envoyé.
Ajoutez l’exemple de code suivant au fichier Program.cs. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire 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 ajoutez un exemple de code à votre application, choisissez le bouton vert Démarrer 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 point de terminaison et de clé avec les valeurs de votre instance Form Recognizer dans 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 box is:");
Console.WriteLine($" Upper left => X: {line.BoundingPolygon[0].X}, Y= {line.BoundingPolygon[0].Y}");
Console.WriteLine($" Upper right => X: {line.BoundingPolygon[1].X}, Y= {line.BoundingPolygon[1].Y}");
Console.WriteLine($" Lower right => X: {line.BoundingPolygon[2].X}, Y= {line.BoundingPolygon[2].Y}");
Console.WriteLine($" Lower left => X: {line.BoundingPolygon[3].X}, Y= {line.BoundingPolygon[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.BoundingPolygon[0].X}, Y= {selectionMark.BoundingPolygon[0].Y}");
Console.WriteLine($" Upper right => X: {selectionMark.BoundingPolygon[1].X}, Y= {selectionMark.BoundingPolygon[1].Y}");
Console.WriteLine($" Lower right => X: {selectionMark.BoundingPolygon[2].X}, Y= {selectionMark.BoundingPolygon[2].Y}");
Console.WriteLine($" Lower left => X: {selectionMark.BoundingPolygon[3].X}, Y= {selectionMark.BoundingPolygon[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 ajoutez un exemple de code à votre application, choisissez le bouton vert Démarrer en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.
Sortie du modèle de disposition
Voici un extrait 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, consultez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de disposition.
Ajoutez l’exemple de code suivant au fichier Program.cs. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance Form Recognizer dans 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.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.BoundingPolygon[j].X}, Y: {line.BoundingPolygon[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.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.BoundingPolygon[j].X}, Y: {selectionMark.BoundingPolygon[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.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.BoundingPolygon[j].X}, Y: {line.BoundingPolygon[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.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.BoundingPolygon[j].X}, Y: {selectionMark.BoundingPolygon[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 ajoutez un exemple de code à votre application, choisissez le bouton vert Démarrer 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 les champs communs 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 de facture prédéfini.
Conseil
Vous n’êtes pas limité aux factures. Il existe plusieurs modèles prédéfinis ayant chacun leur propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze
dépend du type de document à analyser. Consultez Extraction de données de modèle.
- Analysez une facture à l’aide du modèle de facture prédéfini. Vous pouvez utiliser notre exemple de facture pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur de l’URI du fichier à la variable
Uri invoiceUri
en haut du fichier. - Pour analyser un fichier donné au niveau d’un URI, utilisez la méthode
StartAnalyzeDocumentFromUri
et transmettez-luiprebuilt-invoice
comme ID de modèle. La valeur retournée est un objetAnalyzeResult
contenant des données provenant du document envoyé. - Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas indiquées ici. Pour afficher la liste de tous les champs pris en charge et les types correspondants, consultez notre page conceptuelle Facture.
Ajoutez l’exemple de code suivant au fichier Program.cs. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire 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.Type == DocumentFieldType.String)
{
string vendorName = vendorNameField.ValueString;
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField)
&& customerNameField.Type == DocumentFieldType.String)
{
string customerName = customerNameField.ValueString;
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
&& itemsField.Type == DocumentFieldType.Array)
{
foreach (DocumentField itemField in itemsField.ValueArray)
{
Console.WriteLine("Item:");
if (itemField.Type == DocumentFieldType.Object)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueObject;
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField)
&& itemDescriptionField.Type == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.ValueString;
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField)
&& itemAmountField.Type == 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.Type == 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.Type == 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.Type == 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 ajoutez un exemple de code à votre application, choisissez le bouton vert Démarrer 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 point de terminaison et de clé avec les valeurs de votre instance Form Recognizer dans 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 `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 ajoutez un exemple de code à votre application, choisissez le bouton vert Démarrer 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 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, consultez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de facture prédéfini.
Ajoutez l’exemple de code suivant au fichier Program.cs. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance Form Recognizer dans 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 `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 ajoutez un exemple de code à votre application, choisissez le bouton vert Démarrer en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.
Bibliothèque de client | Référence du kit de développement logiciel (SDK) | Référence de l’API REST | Package (Maven) | Exemples |Version de l’API REST prise en charge
Bibliothèque de client | Référence du kit de développement logiciel (SDK) | Référence de l’API REST | Package (Maven) | Exemples| Version de l’API REST prise en charge
Bibliothèque de client | Référence du kit de développement logiciel (SDK) | 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 de formulaires et de documents :
Disposition – Analysez et extrayez les tableaux, les lignes, les mots et les marques de sélection telles que les cases d’option et les cases à cocher, sans avoir besoin d’entraîner un modèle.
Facture préétablie : Analyser et extraire les champs communs des types de documents spécifiques à l’aide d’un modèle préentraîné.
Prérequis
Abonnement Azure : créez-en un gratuitement.
Dernière version de Visual Studio Code ou de votre IDE préféré. Consultez Java dans Visual Studio Code.
Conseil
- Visual Studio Code offre un pack de programmation pour Java pour Windows et macOS. Le pack de programmation est un bundle de VS Code, le Kit de développement Java (JDK) et une collection d’extensions suggérées par Microsoft. Le Pack de programmation peut également être utilisé pour corriger un environnement de développement existant.
- Si vous utilisez VS Code et le Pack de programmation pour Java, installez l’extension Gradle pour Java.
Si vous n’utilisez pas Visual Studio Code, vérifiez que les éléments suivants sont installés dans votre environnement de développement :
Un Kit de développement Java (JDK) version 8 ou ultérieure. Pour plus d’informations, consultez Build Microsoft d’OpenJDK.
Gradle, version 6.8 ou ultérieure.
Une ressource Azure AI services ou Intelligence documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource d’Intelligence documentaire monoservice ou multiservice dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire Gratuit (
F0
) pour tester le service, puis passer par la suite à un niveau payant pour la production.Conseil
Créez une ressource Azure AI services si vous envisagez d’accéder à plusieurs services Azure AI services sous un seul point de terminaison/une seule clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Veuillez noter que vous aurez besoin d’une ressource à service unique si vous avez l’intention d’utiliser l’authentification Microsoft Entra.
Après le déploiement de votre ressource, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison de la ressource que vous créez pour connecter votre application à l’API Azure AI Intelligence documentaire. Plus loin, vous collez votre clé et votre point de terminaison dans le code :
Configurer
Créer un projet Gradle
Dans une fenêtre de console (par exemple, cmd, PowerShell ou Bash), créez un nouveau répertoire doc-intel-app pour votre application et accédez-y.
mkdir doc-intel-app && doc-intel-app
mkdir doc-intel-app; cd doc-intel-app
Exécutez la commande
gradle init
à 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é au moment de l’exécution pour créer et configurer votre application.gradle init --type basic
Quand vous êtes invité à choisir un DSL, sélectionnez Kotlin.
Acceptez le nom du projet par défaut (doc-intel-app) en sélectionnant Retour ou Entrée.
Dans une fenêtre de console (comme cmd, PowerShell ou Bash), créez un répertoire pour votre application appelé form-recognize-app et accédez-y.
mkdir form-recognize-app && form-recognize-app
mkdir form-recognize-app; cd form-recognize-app
Exécutez la commande
gradle init
à 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é au moment de l’exécution pour créer et configurer votre application.gradle init --type basic
Quand vous êtes invité à choisir un DSL, sélectionnez Kotlin.
Acceptez le nom du projet par défaut (form-recognize-app) en sélectionnant Retour ou Entrée.
Installer la bibliothèque de client
Ce guide de démarrage rapide utilise le gestionnaire de dépendances Gradle. Vous trouverez la bibliothèque de client et des informations concernant 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 de client sous la forme d’une instruction implementation
, avec les plug-ins et les paramètres obligatoires.
plugins {
java
application
}
application {
mainClass.set("DocIntelligence")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0-beta.4'
}
Ce guide de démarrage rapide utilise le gestionnaire de dépendances Gradle. Vous trouverez la bibliothèque de client et des informations concernant 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 de client sous la forme d’une instruction implementation
, avec les plug-ins et les paramètres obligatoires.
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 de client et des informations concernant 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 de client sous la forme d’une instruction implementation
, avec les plug-ins et les paramètres obligatoires.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'
}
Création d’une application Java
Pour interagir avec le service d’Intelligence documentaire, vous devez créer une instance de classe DocumentIntelligenceClient
. Pour ce faire, vous créez un AzureKeyCredential
avec votre key
depuis le portail Azure et une instance DocumentIntelligenceClient
avec le AzureKeyCredential
et votre endpoint
d’Intelligence documentaire.
Pour interagir avec le service d’Intelligence documentaire, vous devez créer une instance de classe DocumentAnalysisClient
. Pour ce faire, vous créez un AzureKeyCredential
avec votre key
depuis le portail Azure et une instance DocumentAnalysisClient
avec le AzureKeyCredential
et votre endpoint
d’Intelligence documentaire.
À partir du répertoire doc-intel-app, 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 nomméDocIntelligence.java
.Conseil
- Vous pouvez créer un nouveau fichier à l’aide de PowerShell.
- Ouvrez une fenêtre PowerShell dans le répertoire de votre 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 fichier
DocIntelligence.java
. Copiez et collez l’un des exemples de code suivants dans votre application :
Accédez au répertoire
java
et créez un fichier nomméFormRecognizer.java
.Conseil
- Vous pouvez créer un nouveau fichier à l’aide de PowerShell.
- Ouvrez une fenêtre PowerShell dans le répertoire de votre projet en maintenant la touche Maj enfoncée et en cliquant avec le bouton droit sur le dossier.
- Tapez la commande New-Item FormRecognizer.java.
Ouvrez le fichier
FormRecognizer.java
. Copiez et collez l’un des exemples de code suivants dans votre application :
Important
N’oubliez pas de supprimer la clé de votre code une fois que vous avez terminé, et ne la postez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Si vous souhaitez en savoir plus, veuillez consulter la rubriqueSécurité Azure AI services.
Modèle de disposition
Extrayez le texte, les marques de sélection, les styles de texte et les structures de tableaux, ainsi que les coordonnées de leurs cadres de limitation, à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document au niveau d’un URL. Vous pouvez utiliser notre exemple de document pour ce guide de démarrage rapide.
- Pour analyser un fichier donné au niveau d’un URI, vous utilisez la méthode
beginAnalyzeDocumentFromUrl
et passezprebuilt-layout
comme ID de modèle. La valeur retournée est un objetAnalyzeResult
contenant des données sur le document envoyé. - Nous avons ajouté la valeur de l’URI du fichier à la variable
documentUrl
en haut de la méthode main.
Ajoutez le code suivant au fichier DocIntelligence.java
. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire du Portail Azure :
import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
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";
SyncPoller <AnalyzeResultOperation, AnalyzeResultOperation> analyzeLayoutPoller =
client.beginAnalyzeDocument(modelId,
null,
null,
null,
null,
null,
null,
new AnalyzeDocumentRequest().setUrlSource(documentUrl));
AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult().getAnalyzeResult();
// 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ération et exécution de l’application
Une fois que vous avez 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 commande
build
:gradle build
Exécutez votre application avec la commande
run
:gradle run
Ajoutez le code suivant au fichier FormRecognizer.java
. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire 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.getBoundingPolygon().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.getBoundingPolygon().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 > boundingPolygon) {
return boundingPolygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Génération et exécution de l’application
Une fois que vous avez ajouté un exemple de code à votre application, revenez au répertoire de votre projet principal, form-recognize-app.
Générez votre application avec la commande
build
:gradle build
Exécutez votre application avec la commande
run
:gradle run
Sortie du modèle de disposition
Voici un extrait 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, consultez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de disposition.
Ajoutez le code suivant au fichier FormRecognizer.java
. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire 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.getBoundingPolygon())));
// 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.getBoundingPolygon()),
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 > boundingPolygon) {
return boundingPolygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Génération et exécution de l’application
Une fois que vous avez ajouté un exemple de code à votre application, revenez au répertoire de votre projet principal, form-recognize-app.
Générez votre application avec la commande
build
:gradle build
Exécutez votre application avec la commande
run
:gradle run
Modèle prédéfini
Analysez et extrayez les champs communs 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 de facture prédéfini.
Conseil
Vous n’êtes pas limité aux factures. Il existe plusieurs modèles prédéfinis ayant chacun leur propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze
dépend du type de document à analyser. Consultez Extraction de données de modèle.
- Analysez une facture à l’aide du modèle de facture prédéfini. Vous pouvez utiliser notre exemple de facture pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URL du fichier à la variable
invoiceUrl
en haut du fichier. - Pour analyser un fichier donné au niveau d’un URI, vous utilisez la méthode
beginAnalyzeDocuments
et passezPrebuiltModels.Invoice
comme ID de modèle. La valeur retournée est un objetresult
contenant des données sur le document envoyé. - Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas indiquées ici. Pour afficher la liste de tous les champs pris en charge et les types correspondants, consultez notre page conceptuelle Facture.
Ajoutez le code suivant au fichier DocIntelligence.java
. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire du Portail Azure :
import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
import com.azure.ai.documentintelligence.models.Document;
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.io.IOException;
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) {
// 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";
public static void main(final String[] args) throws IOException {
// Instantiate a client that will be used to call the service.
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
SyncPoller<AnalyzeResultOperation, AnalyzeResultOperation > analyzeInvoicesPoller =
client.beginAnalyzeDocument(modelId,
null,
null,
null,
null,
null,
null,
new AnalyzeDocumentRequest().setUrlSource(invoiceUrl));
AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult().getAnalyzeResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
Document 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.getValueString();
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.getValueString();
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.getValueString();
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.getValueString();
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.getValueString();
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.getValueDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.NUMBER == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueNumber();
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.ARRAY == invoiceItemsField.getType()) {
List < DocumentField > invoiceItems = invoiceItemsField.getValueArray();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.OBJECT == invoiceItem.getType())
.map(documentField -> documentField.getValueObject())
.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.getValueString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double quantity = documentField.getValueNumber();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double unitPrice = documentField.getValueNumber();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double productCode = documentField.getValueNumber();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
}
Génération et exécution de l’application
Une fois que vous avez 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 commande
build
:gradle build
Exécutez votre application avec la commande
run
:gradle run
Ajoutez le code suivant au fichier FormRecognizer.java
. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire 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ération et exécution de l’application
Une fois que vous avez 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 commande
build
:gradle build
Exécutez votre application avec la commande
run
:gradle run
Sortie du modèle prédéfini
Voici un extrait 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, consultez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de facture prédéfini.
Ajoutez le code suivant au fichier FormRecognizer.java
. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire 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ération et exécution de l’application
Une fois que vous avez 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 commande
build
:gradle build
Exécutez votre application avec la commande
run
:gradle run
Bibliothèque de client | Référence de l’API REST | Package (npm) | Exemples |Version de l’API REST prise en charge
Bibliothèque de client | Référence du kit de développement logiciel (SDK) | Référence de l’API REST | Package (npm) | Exemples |Version de l’API REST prise en charge
Bibliothèque de client | Référence du kit de développement logiciel (SDK) | Référence de l’API REST | Package (npm) | 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 de formulaires et de documents :
Disposition – Analysez et extrayez les tableaux, les lignes, les mots et les marques de sélection telles que les cases d’option et les cases à cocher, sans avoir besoin d’entraîner un modèle.
Facture préétablie : Analyser et extraire les champs communs de types de documents spécifiques à l’aide d’un modèle préentraîné de facture.
Prérequis
Abonnement Azure : créez-en un gratuitement.
Dernière version de Visual Studio Code ou de votre IDE préféré. Pour plus d’informations, consultez Node.js dans Visual Studio Code.
La dernière version
LTS
de Node.js.Une ressource Azure AI services ou Intelligence documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource d’Intelligence documentaire monoservice ou multiservice dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire Gratuit (
F0
) pour tester le service, puis passer par la suite à un niveau payant pour la production.Conseil
Créez une ressource Azure AI services si vous envisagez d’accéder à plusieurs services Azure AI services sous un seul point de terminaison/une seule clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Veuillez noter que vous aurez besoin d’une ressource à service unique si vous avez l’intention d’utiliser l’authentification Microsoft Entra.
Après le déploiement de votre ressource, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison de la ressource que vous créez pour connecter votre application à l’API Azure AI Intelligence documentaire. Vous collez votre clé et votre point de terminaison dans le code plus loin dans ce guide de démarrage rapide :
Configurer
Créer une application Node.js Express : dans une fenêtre de console (telle que cmd, PowerShell ou Bash), créez un répertoire nommé
doc-intel-app
pour votre application et accédez-y.mkdir doc-intel-app && cd doc-intel-app
Exécutez la commande
npm init
pour initialiser l’application et échafauder votre projet.npm init
Spécifiez les attributs de votre projet à l’aide des invites qui s’affichent 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.js
comme 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. Vous pouvez les ignorer pour ce projet. - Acceptez les suggestions entre parenthèses en sélectionnant Retour ou Entrée.
- Une fois que vous avez répondu aux invites, un fichier
package.json
est créé dans votre répertoire doc-intel-app.
Installez le package de la bibliothèque de client
ai-document-intelligence
et le package npmazure/identity
:npm i @azure-rest/ai-document-intelligence@1.0.0-beta.3 @azure/core-auth
Le fichier
package.json
de votre application est mis à jour avec les dépendances.
Installez le package de la bibliothèque de client
ai-form-recognizer
et le package npmazure/identity
:npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
- Le fichier
package.json
de votre application est mis à jour avec les dépendances.
- Le fichier
Installez le package de la bibliothèque de client
ai-form-recognizer
et le package npmazure/identity
:npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
Créez un fichier nommé
index.js
dans le répertoire de l’application.Conseil
- Vous pouvez créer un nouveau fichier à l’aide de PowerShell.
- Ouvrez une fenêtre PowerShell dans le répertoire de votre projet en maintenant la touche Maj enfoncée et en cliquant avec le bouton droit sur le dossier.
- Tapez la commande New-Item index.js.
Générer votre application
Pour interagir avec le service d’Intelligence documentaire, vous devez créer une instance de classe DocumentIntelligenceClient
. Pour ce faire, vous créez un AzureKeyCredential
avec votre key
depuis le portail Azure et une instance DocumentIntelligenceClient
avec le AzureKeyCredential
et votre endpoint
d’Intelligence documentaire.
Pour interagir avec le service d’Intelligence documentaire, vous devez créer une instance de classe DocumentAnalysisClient
. Pour ce faire, vous créez un AzureKeyCredential
avec votre key
depuis le portail Azure et une instance DocumentAnalysisClient
avec le AzureKeyCredential
et votre endpoint
Form Recognizer.
Ouvrez le fichier
index.js
dans Visual Studio Code ou dans l’IDE de votre choix. Copiez et collez l’un des exemples de code suivants dans votre application :
Important
N’oubliez pas de supprimer la clé de votre code une fois que vous avez terminé, et ne la postez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Si vous souhaitez en savoir plus, veuillez consulter la rubriqueSécurité Azure AI services.
Modèle de disposition
Extrayez le texte, les marques de sélection, les styles de texte et les structures de tableaux, ainsi que les coordonnées de leurs cadres de limitation, à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document au niveau d’un URL. Vous pouvez utiliser notre exemple de document pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URL du fichier à la variable
formUrl
en haut du fichier.- Pour analyser un fichier donné à partir d’une URL, utilisez la méthode
beginAnalyzeDocuments
et passez-luiprebuilt-layout
comme ID de modèle.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
const { AzureKeyCredential } = require("@azure/core-auth");
// 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, new AzureKeyCredential(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 = await getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const document = documents && documents[0];
if (!document) {
throw new Error("Expected at least one document in the result.");
}
console.log(
"Extracted document:",
document.docType,
`(confidence: ${document.confidence || "<undefined>"})`,
);
console.log("Fields:", document.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Exécuter votre application
Une fois que vous avez ajouté un exemple de code à votre application, exécutez votre programme :
Accédez au dossier contenant votre application d’Intelligence documentaire (doc-intel-app).
Tapez la commande suivante dans votre terminal :
node index.js
Ajoutez le code suivant au fichier index.js
. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire 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
Une fois que vous avez ajouté un exemple de code à votre application, exécutez votre programme :
Accédez au dossier contenant votre application d’Intelligence documentaire (doc-intel-app).
Tapez la commande suivante dans votre terminal :
node index.js
Sortie du modèle de disposition
Voici un extrait 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, consultez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de disposition.
Modèle prédéfini
Dans cet exemple, nous analysons une facture à l’aide du modèle de facture prédéfini.
Conseil
Vous n’êtes pas limité aux factures. Il existe plusieurs modèles prédéfinis ayant chacun leur propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze
dépend du type de document à analyser. Consultez Extraction de données de modèle.
- Analysez une facture à l’aide du modèle de facture prédéfini. Vous pouvez utiliser notre exemple de facture pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URL du fichier à la variable
invoiceUrl
en haut du fichier. - Pour analyser un fichier donné au niveau d’un URI, vous utilisez la méthode
beginAnalyzeDocuments
et passezPrebuiltModels.Invoice
comme ID de modèle. La valeur retournée est un objetresult
contenant des données sur le document envoyé. - Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas indiquées ici. Pour afficher la liste de tous les champs pris en charge et les types correspondants, consultez notre page conceptuelle Facture.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
const { AzureKeyCredential } = require("@azure/core-auth");
// 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, new AzureKeyCredential(key));
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
.post({
contentType: "application/json",
body: {
// The Document Intelligence service will access the URL to the invoice image and extract data from it
urlSource: invoiceUrl,
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = await getLongRunningPoller(client, initialResponse);
poller.onProgress((state) => console.log("Operation:", state.result, state.status));
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const result = documents && documents[0];
if (result) {
console.log(result.fields);
} else {
throw new Error("Expected at least one invoice in the result.");
}
console.log(
"Extracted invoice:",
document.docType,
`(confidence: ${document.confidence || "<undefined>"})`,
);
console.log("Fields:", document.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Exécuter votre application
Une fois que vous avez ajouté un exemple de code à votre application, exécutez votre programme :
Accédez au dossier contenant votre application d’Intelligence documentaire (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
Une fois que vous avez ajouté un exemple de code à votre application, exécutez votre programme :
Accédez au dossier contenant votre application d’Intelligence documentaire (doc-intel-app).
Tapez la commande suivante dans votre terminal :
node index.js
Sortie du modèle prédéfini
Voici un extrait 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, consultez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de facture prédéfini.
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
Une fois que vous avez ajouté un exemple de code à votre application, exécutez votre programme :
Accédez au dossier contenant votre application d’Intelligence documentaire (doc-intel-app).
Tapez la commande suivante dans votre terminal :
node index.js
Bibliothèque de client |Référence du kit de développement logiciel (SDK) | Référence de l’API REST | Package (PyPi) | Exemples | Version de l’API REST prise en charge
Bibliothèque de client |Référence du kit de développement logiciel (SDK) | Référence de l’API REST | Package (PyPi) | Exemples | Version de l’API REST prise en charge
Bibliothèque de client | Référence du kit de développement logiciel (SDK) | Référence de l’API REST | Package (PyPi) | 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 de formulaires et de documents :
Disposition : analysez et extrayez les tableaux, les lignes, les mots et les marques de sélection comme les cases d’option et les cases à cocher, et les paires clé-valeur, sans avoir besoin d’effectuer l’apprentissage d’un modèle.
Facture préétablie : Analyser et extraire les champs communs des types de documents spécifiques à l’aide d’un modèle préentraîné.
Prérequis
Abonnement Azure : créez-en un gratuitement.
-
- Votre installation Python doit inclure pip. Vous pouvez vérifier si pip est installé en exécutant
pip --version
sur la ligne de commande. Procurez-vous pip en installant la dernière version de Python.
- Votre installation Python doit inclure pip. Vous pouvez vérifier si pip est installé en exécutant
Dernière version de Visual Studio Code ou de votre IDE préféré. Pour plus d’informations, consultez Prise en main de Python dans Visual Studio Code.
Une ressource Azure AI services ou Intelligence documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource d’Intelligence documentaire monoservice ou multiservice dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire Gratuit (
F0
) pour tester le service, puis passer par la suite à un niveau payant pour la production.
Conseil
Créez une ressource Azure AI services si vous envisagez d’accéder à plusieurs services Azure AI services sous un seul point de terminaison/une seule clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Veuillez noter que vous aurez besoin d’une ressource à service unique si vous avez l’intention d’utiliser l’authentification Microsoft Entra.
Après le déploiement de votre ressource, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison de la ressource que vous créez pour connecter votre application à l’API Azure AI Intelligence documentaire. Vous collez votre clé et votre point de terminaison dans le code plus loin dans ce guide de démarrage rapide :
Configurer
Ouvrez une fenêtre de terminal dans votre environnement local et installez la bibliothèque de client Azure AI Intelligence documentaire pour Python avec pip :
pip install azure-ai-documentintelligence==1.0.0b4
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 d’Intelligence documentaire, vous devez créer une instance de classe DocumentIntelligenceClient
. Pour ce faire, vous créez un AzureKeyCredential
avec votre key
depuis le portail Azure et une instance DocumentIntelligenceClient
avec le AzureKeyCredential
et votre endpoint
d’Intelligence documentaire.
Créez un fichier Python nommé doc_intel_quickstart.py dans votre éditeur ou IDE favori.
Ouvrez le fichier doc_intel_quickstart.py, puis sélectionnez l’un des exemples de code suivants à copier et coller dans votre application :
Pour interagir avec le service d’Intelligence documentaire, vous devez créer une instance de classe DocumentAnalysisClient
. Pour ce faire, vous créez un AzureKeyCredential
avec votre key
depuis le portail Azure et une instance DocumentAnalysisClient
avec le AzureKeyCredential
et votre endpoint
d’Intelligence documentaire.
Créez une application Python nommée form_recognizer_quickstart.py dans votre éditeur ou IDE favori.
Ouvrez le fichier form_recognizer_quickstart.py et sélectionnez l’un des exemples de code suivants à copier et coller dans votre application :
Important
N’oubliez pas de supprimer la clé de votre code une fois que vous avez terminé, et ne la postez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Si vous souhaitez en savoir plus, veuillez consulter la rubriqueSécurité Azure AI services.
Modèle de disposition
Extrayez le texte, les marques de sélection, les styles de texte et les structures de tableaux, ainsi que les coordonnées de leurs cadres de limitation, à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document au niveau d’un URL. Vous pouvez utiliser notre exemple de document pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur de l'URL du fichier à la variable
formUrl
dans la fonctionanalyze_layout
.
Ajoutez l’exemple de code suivant à votre application doc_intel_quickstart.py. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire 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écution de l'application
Une fois que vous avez ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier contenant votre fichier doc_intel_quickstart.py.
Tapez la commande suivante dans votre terminal :
python doc_intel_quickstart.py
Pour analyser un fichier donné au niveau d’un URI, vous utilisez la méthode begin_analyze_document_from_url
et passez prebuilt-layout
comme ID de modèle. La valeur retournée est un objet result
contenant des données sur le document envoyé.
Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance Form Recognizer dans le 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écution de l'application
Une fois que vous avez ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier contenant votre fichier form_recognizer_quickstart.py.
Tapez la commande suivante dans votre terminal :
python form_recognizer_quickstart.py
Sortie du modèle de disposition
Voici un extrait 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, consultez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de disposition.
Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance Form Recognizer dans le 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écution de l'application
Une fois que vous avez ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier contenant 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 les champs communs 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 de facture prédéfini.
Conseil
Vous n’êtes pas limité aux factures. Il existe plusieurs modèles prédéfinis ayant chacun leur propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze
dépend du type de document à analyser. Consultez Extraction de données de modèle.
- Analysez une facture à l’aide du modèle de facture prédéfini. Vous pouvez utiliser notre exemple de facture pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur d’URL du fichier à la variable
invoiceUrl
en haut du fichier. - Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas indiquées ici. Pour afficher la liste de tous les champs pris en charge et les types correspondants, consultez notre page conceptuelle Facture.
Ajoutez l’exemple de code suivant à votre application doc_intel_quickstart.py. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire 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écution de l'application
Une fois que vous avez ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier contenant votre fichier doc_intel_quickstart.py.
Tapez la commande suivante dans votre terminal :
python doc_intel_quickstart.py
Pour analyser un fichier donné au niveau d’un URI, vous utilisez la méthode begin_analyze_document_from_url
et passez prebuilt-invoice
comme ID de modèle. La valeur retournée est un objet result
contenant des données sur le document envoyé.
Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance Form Recognizer dans le 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écution de l'application
Une fois que vous avez ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier contenant 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 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, consultez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de facture prédéfini.
Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance Form Recognizer dans le 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écution de l'application
Une fois que vous avez ajouté un exemple de code à votre application, générez et exécutez votre programme :
Accédez au dossier contenant votre fichier form_recognizer_quickstart.py.
Tapez la commande suivante dans votre terminal :
python form_recognizer_quickstart.py
Dans ce démarrage rapide, apprenez à utiliser l’API REST Intelligence documentaire pour analyser et extraire des données et des valeurs de documents :
Prérequis
Abonnement Azure - En créer un gratuitement
Outil en ligne de commande curl installé.
PowerShell version 7.*+ (ou une application en 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 :
Une ressource d’Intelligence documentaire (monoservice) ou Azure AI services (multiservice). Une fois que vous avez votre abonnement Azure, créez une ressource d’Intelligence documentaire monoservice ou multiservice dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire Gratuit (
F0
) pour tester le service, puis passer par la suite à un niveau payant pour la production.
Conseil
Créez une ressource Azure AI services si vous envisagez d’accéder à plusieurs services Azure AI services sous un seul point de terminaison/une seule clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Veuillez noter que vous aurez besoin d’une ressource à service unique si vous avez l’intention d’utiliser l’authentification Microsoft Entra.
Après le déploiement de votre ressource, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison de la ressource que vous créez pour connecter votre application à l’API Azure AI Intelligence documentaire. Vous collez votre clé et votre point de terminaison dans le code plus loin dans ce guide de démarrage rapide :
Analyser des documents et obtenir les 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. Le modelId
est utilisé avec les opérations POST et resultId
avec les opérations GET.
Analyser un 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 d’Intelligence documentaire du portail Azure.Remplacez
{key}
par la valeur de la clé de votre instance d’Intelligence documentaire du portail Azure.En vous servant du tableau suivant comme référence, remplacez
{modelID}
et{your-document-url}
par les valeurs souhaitées.Vous avez besoin d’un fichier de document au niveau d’une 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 | Facture prédéfinie | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Réception | prebuilt-receipt | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Document d’identité | 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 | Facture prédéfinie | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Réception | prebuilt-receipt | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Document d’identité | 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 une fois que vous avez terminé, et ne la postez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Si vous souhaitez en savoir plus, veuillez consulter la rubriqueSécurité Azure AI services.
requête POST
curl -v -i POST "{endpoint}/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-07-31-preview" -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 réponse 202 (Success)
incluant un en-tête en lecture seule Operation-Location. 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 votre même clé d’abonnement de ressource :
Obtenir les résultats d’analyse (demande GET)
Après avoir appelé l’API Analyze document
, appelez l’API Obtenir les résultats d’analyse pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez les modifications suivantes :
Après avoir appelé l’API Analyze document
, appelez l’API Obtenir les résultats d’analyse pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez les modifications suivantes :
Après avoir appelé l’API Analyze document
, appelez l’API Obtenir les résultats d’analyse pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez les modifications suivantes :
Remplacez l’en-tête Operation-Location
{resultID}
de la réponse POST.Remplacez
{key}
par la valeur de la clé de votre instance d’Intelligence documentaire dans le portail Azure.
Requête GET
curl -v -X GET "{endpoint}/documentintelligence/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2024-07-31-preview" -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 de "status"
est "running"
ou "notStarted"
. Vous devez alors rappeler l’API, manuellement ou via un script. Nous vous recommandons d’attendre une seconde ou plus entre chaque appel.
Exemple de réponse pour prebuilt-invoice
{
"status": "succeeded",
"createdDateTime": "2024-03-25T19:31:37Z",
"lastUpdatedDateTime": "2024-03-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2024-07-31-preview",
"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 Extraction des données de modèle pour connaître les noms de champs et les types extraits et obtenir des descriptions et des exemples.
Voilà, félicitations !
Dans ce démarrage rapide, vous avez utilisé un modèle d’Intelligence documentaire pour analyser divers formulaires et documents. Ensuite, explorez le Studio d’Intelligence documentaire et la documentation de référence pour découvrir plus en détail l’API d’Intelligence documentaire.
Étapes suivantes
Pour une expérience améliorée et une qualité de modèle avancée, essayez Intelligence Documentaire Studio
Pour une migration de la version v3.1 vers la version v4.0, consultez Guides de migration du journal des modifications.
Ce contenu s’applique à : v2.1 | Dernière version : v4.0 (préversion)
Prise en main d’Azure AI Intelligence documentaire en utilisant le langage de programmation de votre choix ou l’API REST. L’Intelligence documentaire est un service Azure AI basé sur le cloud qui utilise l’apprentissage automatique pour extraire des paires clé-valeur, du texte et des tableaux de vos documents. Nous vous recommandons d’utiliser le service gratuit pendant que 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 de l’Intelligence documentaire, visitez notre page de Présentation.
Documentation de référence | Code source de la bibliothèque | Package (NuGet) | Exemples
Dans ce démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées de formulaires et de documents :
Prérequis
Abonnement Azure : créez-en un gratuitement.
La version actuelle de l’IDE Visual Studio.
Une ressource Azure AI services ou Intelligence documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource d’Intelligence documentaire monoservice ou multiservice dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire Gratuit (
F0
) pour tester le service, puis passer par la suite à un niveau payant pour la production.Conseil
Créez une ressource Azure AI services si vous envisagez d’accéder à plusieurs services Azure AI services sous un seul point de terminaison/une seule clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Veuillez noter que vous aurez besoin d’une ressource à service unique si vous avez l’intention d’utiliser l’authentification Microsoft Entra.
Après le déploiement de votre ressource, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison de la ressource que vous créez pour connecter votre application à l’API Azure AI Intelligence documentaire. Vous collez votre clé et votre point de terminaison dans le code plus loin dans ce guide de démarrage rapide :
Configurer
Démarrez Visual Studio 2019.
Dans la page de démarrage, choisissez Créer un projet.
Dans la page Créer un nouveau projet, entrez console dans la zone de recherche. Choisissez le modèle Application console, puis choisissez Suivant.
Dans la fenêtre de dialogue Configurer votre nouveau projet, entrez
formRecognizer_quickstart
dans la zone Nom de projet. Ensuite, choisissez Suivant.Dans la fenêtre de dialogue Informations supplémentaires, sélectionnez .NET 5.0 (Actuel) , puis sélectionnez Créer.
Installer la bibliothèque de client avec NuGet
Cliquez avec le bouton droit sur votre projet formRecognizer_quickstart et sélectionnez Gérer les packages NuGet.
Sélectionnez l’onglet Parcourir et tapez Azure.AI.FormRecognizer.
Sélectionnez la version 3.1.1 dans le menu déroulant et sélectionnez Installer.
Générer votre application
Pour interagir avec le service d’Intelligence documentaire, vous devez créer une instance de classe FormRecognizerClient
. Pour ce faire, vous créez un AzureKeyCredential
avec votre clé et une instance FormRecognizerClient
avec le AzureKeyCredential
et votre endpoint
d’Intelligence documentaire.
Notes
- À compter de .NET 6, de nouveaux projets utilisant le modèle
console
gé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
Main
méthode. Vous n’avez pas besoin d’inclure des instructions de niveau supérieur, des directives globales à l’aide de directives ou des directives implicites. - Pour plus d’informations, consultez Les nouveaux modèles C# génèrent des instructions de plus haut niveau.
Ouvrez le fichier Program.cs.
Insérez 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
endpoint
etkey
, et créez vos instancesAzureKeyCredential
etFormRecognizerClient
:
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 les exemples de code Essayez au fichier Program.cs :Sélectionnez un exemple de code à copier-coller dans la méthode Main de votre application :
Important
N’oubliez pas de supprimer la clé de votre code une fois que vous avez terminé, et ne la postez 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 Sécurité d’Azure AI services.
Essayez : modèle de disposition
Extrayez le texte, les marques de sélection, les styles de texte et les structures de tableaux, ainsi que les coordonnées de leurs cadres de limitation, à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document au niveau d’un URL. Vous pouvez utiliser notre exemple de document pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur de l’URI du fichier à la variable
formUri
. - Pour extraire la disposition d’un fichier donné au niveau d’un URI, utilisez la méthode
StartRecognizeContentFromUriAsync
.
Ajoutez le code suivant au fichier Program.cs de votre application de disposition :
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 : Modèle prédéfini
Cet exemple montre comment analyser les données de certains types de documents courants avec des modèles pré-entraînés, en utilisant une facture comme exemple.
- Pour cet exemple, nous analysons un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre exemple de facture pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur de l’URI du fichier à la variable
invoiceUri
en haut de la méthode Main. - Pour analyser un fichier donné au niveau d’un URI, utilisez la méthode
StartRecognizeInvoicesFromUriAsync
. - Par souci de simplicité, tous les champs d’entité retournés par le service ne sont pas indiqués ici. Pour afficher la liste de tous les champs pris en charge et les types correspondants, consultez notre page conceptuelle Facture.
Choisir un modèle prédéfini
Vous n’êtes pas limité aux factures. Il existe plusieurs modèles prédéfinis ayant chacun leur 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 d’Intelligence documentaire :
- Facture : extrait le texte, les marques de sélection, les tableaux, les champs et les informations clés des factures.
- Reçu : extrait le texte et les informations clés des reçus.
- Document d’identité : 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.
Ajouter le code suivant à la méthode Program.cs de votre application de facture prédéfinie
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 vert Démarrer 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 démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées de formulaires et de documents :
Prérequis
Abonnement Azure : créez-en un gratuitement.
Un Kit de développement Java (JDK) version 8 ou ultérieure. Pour plus d’informations, consultezVersions prises en charge et planification des mises à jour de Java.
Une ressource Azure AI services ou Intelligence documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource d’Intelligence documentaire monoservice ou multiservice dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire Gratuit (
F0
) pour tester le service, puis passer par la suite à un niveau payant pour la production.Après le déploiement de votre ressource, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison de la ressource que vous créez pour connecter votre application à l’API Azure AI Intelligence documentaire. Vous collez votre clé et votre point de terminaison dans le code plus loin dans ce 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 le répertoire form-recognizer-app pour votre application et accédez-y.
mkdir form-recognizer-app && form-recognizer-app
Exécutez la commande
gradle init
à 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é au moment de l’exécution pour créer et configurer votre application.gradle init --type basic
Quand vous êtes invité à choisir un DSL, sélectionnez Kotlin.
Acceptez le nom de projet par défaut (form-recognizer-app)
Installer la bibliothèque de client
Ce guide de démarrage rapide utilise le gestionnaire de dépendances Gradle. Vous trouverez la bibliothèque de client et des informations concernant 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 de client sous la forme d’une instruction implementation
, avec les plug-ins et les paramètres obligatoires.
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
Entrez la commande suivante à partir de votre répertoire de travail :
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 sous le nom FormRecognizer.java. Ouvrez-le dans votre éditeur ou IDE par défaut, puis ajoutez la déclaration de package et les instructions import
suivantes :
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-coller dans la méthode main de votre application :
Important
N’oubliez pas de supprimer la clé de votre code une fois que vous avez terminé, et ne la postez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Si vous souhaitez en savoir plus, veuillez consulter la rubriqueSécurité Azure AI services.
Essayez : modèle de disposition
Extrayez le texte, les marques de sélection, les styles de texte et les structures de tableaux, ainsi que les coordonnées de leurs cadres de limitation, à partir de documents.
- Pour cet exemple, vous aurez besoin d’un fichier de document au niveau d’un URL. Vous pouvez utiliser notre exemple de document pour ce guide de démarrage rapide.
- Pour analyser un fichier donné au niveau d’un URI, vous utiliserez la méthode
beginRecognizeContentFromUrl
. - Nous avons ajouté la valeur de l’URI du fichier à la variable
formUrl
en haut de la méthode principale.
Mettez à jour la classe FormRecognizer de votre application avec le code suivant (veillez à mettre à jour les variables de point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire 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 : Modèle prédéfini
Cet exemple montre comment analyser les données de certains types de documents courants avec des modèles pré-entraînés, en utilisant une facture comme exemple.
- Pour cet exemple, nous analysons un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre exemple de facture pour ce guide de démarrage rapide.
- Pour analyser un fichier donné au niveau d’un URI, vous utiliserez la
beginRecognizeInvoicesFromUrl
. - Nous avons ajouté la valeur de l’URI du fichier à la variable
invoiceUrl
en haut de la méthode principale. - Par souci de simplicité, tous les champs d’entité retournés par le service ne sont pas indiqués ici. Pour afficher la liste de tous les champs pris en charge et les types correspondants, consultez notre page conceptuelle Facture.
Choisir un modèle prédéfini
Vous n’êtes pas limité aux factures. Il existe plusieurs modèles prédéfinis ayant chacun leur 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 d’Intelligence documentaire :
- Facture : extrait le texte, les marques de sélection, les tableaux, les champs et les informations clés des factures.
- Reçu : extrait le texte et les informations clés des reçus.
- Document d’identité : 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 point de terminaison et de clé avec les valeurs de votre instance d’Intelligence documentaire 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 à votre répertoire de projet principal : form-recognizer-app.
- Générez votre application avec la commande
build
:
gradle build
- Exécutez votre application avec la commande
run
:
gradle run
Documentation de référence | Code source de la bibliothèque | Package (npm) | Exemples
Dans ce démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées de formulaires et de documents :
Prérequis
Abonnement Azure : créez-en un gratuitement.
Dernière version de Visual Studio Code ou de votre IDE préféré.
Dernière version LTS de Node.js
Une ressource Azure AI services ou Intelligence documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource d’Intelligence documentaire monoservice ou multiservice dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire Gratuit (
F0
) pour tester le service, puis passer par la suite à un niveau payant pour la production.Conseil
Créez une ressource Azure AI services si vous envisagez d’accéder à plusieurs services Azure AI services sous un seul point de terminaison/une seule clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Veuillez noter que vous aurez besoin d’une ressource à service unique si vous avez l’intention d’utiliser l’authentification Microsoft Entra.
Après le déploiement de votre ressource, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison de la ressource que vous créez pour connecter votre application à l’API Azure AI Intelligence documentaire. Vous collez votre clé et votre point de terminaison dans le code plus loin dans ce guide de démarrage rapide :
Configurer
Créez une application Node.js. Dans une fenêtre de console (telle que cmd, PowerShell ou bash), créez un répertoire pour votre application et accédez-y.
mkdir form-recognizer-app && cd form-recognizer-app
Exécutez la commande
npm init
pour créer une application de nœud avec un fichierpackage.json
.npm init
Installez le package npm de la bibliothèque cliente
ai-form-recognizer
:npm install @azure/ai-form-recognizer
Le fichier
package.json
de votre application est mis à jour avec les dépendances.Créez un fichier sous le nom
index.js
, ouvrez-le, puis 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-coller dans votre application :
Important
N’oubliez pas de supprimer la clé de votre code une fois que vous avez terminé, et ne la postez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Si vous souhaitez en savoir plus, veuillez consulter la rubriqueSécurité Azure AI services.
Essayez : modèle de disposition
- Pour cet exemple, vous aurez besoin d’un fichier de document au niveau d’un URL. Vous pouvez utiliser notre exemple de document pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur de l’URI du fichier à la variable
formUrl
en haut du fichier. - Pour analyser un fichier donné au niveau d’un URI, vous utiliserez la méthode
beginRecognizeContent
.
Ajouter le code suivant à votre application de disposition sur la ligne située sous la variable key
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 : Modèle prédéfini
Cet exemple montre comment analyser les données de certains types de documents courants avec des modèles pré-entraînés, en utilisant une facture comme exemple. Consultez notre page de concept prédéfini pour obtenir la liste complète des champs de la facture
- Pour cet exemple, nous analysons un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre exemple de facture pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur de l’URI du fichier à la variable
invoiceUrl
en haut du fichier. - Pour analyser un fichier donné au niveau d’un URI, vous utiliserez la méthode
beginRecognizeInvoices
. - Par souci de simplicité, tous les champs d’entité retournés par le service ne sont pas indiqués ici. Pour afficher la liste de tous les champs pris en charge et les types correspondants, consultez notre page conceptuelle Facture.
Choisir un modèle prédéfini
Vous n’êtes pas limité aux factures. Il existe plusieurs modèles prédéfinis ayant chacun leur 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 d’Intelligence documentaire :
- Facture : extrait le texte, les marques de sélection, les tableaux, les champs et les informations clés des factures.
- Reçu : extrait le texte et les informations clés des reçus.
- Document d’identité : 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.
Ajouter le code suivant à votre application de facture prédéfinie sous la variable key
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 démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées de formulaires et de documents :
Prérequis
Abonnement Azure - En créer un gratuitement
-
- Votre installation Python doit inclure pip. Vous pouvez vérifier si pip est installé en exécutant
pip --version
sur la ligne de commande. Procurez-vous pip en installant la dernière version de Python.
- Votre installation Python doit inclure pip. Vous pouvez vérifier si pip est installé en exécutant
Une ressource Azure AI services ou Intelligence documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource d’Intelligence documentaire monoservice ou multiservice dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire Gratuit (
F0
) pour tester le service, puis passer par la suite à un niveau payant pour la production.Conseil
Créez une ressource Azure AI services si vous envisagez d’accéder à plusieurs services Azure AI services sous un seul point de terminaison/une seule clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Veuillez noter que vous aurez besoin d’une ressource à service unique si vous avez l’intention d’utiliser l’authentification Microsoft Entra.
Après le déploiement de votre ressource, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison de la ressource que vous créez pour connecter votre application à l’API Azure AI Intelligence documentaire. Vous collez votre clé et votre point de terminaison dans le code plus loin dans ce guide de démarrage rapide :
Configurer
Ouvrez une fenêtre de terminal dans votre environnement local et installez la bibliothèque de client Azure AI Intelligence documentaire pour Python avec pip :
pip install azure-ai-formrecognizer
Créer une application Python
Créez une application Python nommée form_recognizer_quickstart.py dans votre éditeur ou IDE favori. 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-coller dans votre application :
Important
N’oubliez pas de supprimer la clé de votre code une fois que vous avez terminé, et ne la postez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Si vous souhaitez en savoir plus, veuillez consulter la rubriqueSécurité Azure AI services.
Essayez : modèle de disposition
- Pour cet exemple, vous aurez besoin d’un fichier de document au niveau d’un URL. Vous pouvez utiliser notre exemple de document pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur de l’URI du fichier à la variable
formUrl
en haut du fichier. - Pour analyser un fichier donné au niveau d’un URI, vous utiliserez la méthode
begin_recognize_content_from_url
.
Ajouter le code suivant à votre application de disposition sur la ligne située sous la variable key
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 : Modèle prédéfini
Cet exemple montre comment analyser les données de certains types de documents courants avec des modèles pré-entraînés, en utilisant une facture comme exemple. Consultez notre page de concept prédéfini pour obtenir la liste complète des champs de la facture
- Pour cet exemple, nous analysons un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre exemple de facture pour ce guide de démarrage rapide.
- Nous avons ajouté la valeur de l’URI du fichier à la variable « formUrl » en haut du fichier.
- Pour analyser un fichier donné à un URI, utilisez la méthode « begin_recognize_invoices_from_url ».
- Par souci de simplicité, tous les champs d’entité retournés par le service ne sont pas indiqués ici. Pour afficher la liste de tous les champs pris en charge et les types correspondants, consultez notre page conceptuelle Facture.
Choisir un modèle prédéfini
Vous n’êtes pas limité aux factures. Il existe plusieurs modèles prédéfinis ayant chacun leur 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 d’Intelligence documentaire :
- Facture : extrait le texte, les marques de sélection, les tableaux, les champs et les informations clés des factures.
- Reçu : extrait le texte et les informations clés des reçus.
- Document d’identité : 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.
Ajouter le code suivant à votre application de facture prédéfinie sous la variable key
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 contenant votre fichier form_recognizer_quickstart.py.
Tapez la commande suivante dans votre terminal :
python form_recognizer_quickstart.py
| API REST d’Intelligence documentaire | Référence sur l’API REST Azure |
Dans ce démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées de formulaires et de documents :
Prérequis
Abonnement Azure - En créer un gratuitement
cURL installé.
PowerShell version 6.0 + ou une application de ligne de commande similaire.
Une ressource Azure AI services ou Intelligence documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource d’Intelligence documentaire monoservice ou multiservice dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire Gratuit (
F0
) pour tester le service, puis passer par la suite à un niveau payant pour la production.Conseil
Créez une ressource Azure AI services si vous envisagez d’accéder à plusieurs services Azure AI services sous un seul point de terminaison/une seule clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Veuillez noter que vous aurez besoin d’une ressource à service unique si vous avez l’intention d’utiliser l’authentification Microsoft Entra.
Après le déploiement de votre ressource, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison de la ressource que vous créez pour connecter votre application à l’API Azure AI Intelligence documentaire. Vous collez votre clé et votre point de terminaison dans le code plus loin dans ce guide de démarrage rapide :
Sélectionnez un exemple de code à copier-coller dans votre application :
Important
N’oubliez pas de supprimer la clé de votre code une fois que vous avez terminé, et ne la postez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Si vous souhaitez en savoir plus, veuillez consulter la rubriqueSécurité Azure AI services.
Essayez : modèle de disposition
- Pour cet exemple, vous aurez besoin d’un fichier de document au niveau d’un URL. Vous pouvez utiliser notre exemple de document pour ce guide de démarrage rapide.
- Remplacez
{endpoint}
par le point de terminaison que vous avez obtenu avec votre abonnement d’Intelligence documentaire. - 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 document :
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Requête
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 réponse 202 (Success)
incluant un en-tête Operation-Location. La valeur de cet en-tête contient un ID de résultats qui vous permet d’interroger l’état de l’opération asynchrone et d’obtenir les résultats :
https://cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/ {ID-résultats} .
Dans l’exemple suivant, la chaîne qui suit analyzeResults/
dans l’URL correspond à l’ID des résultats.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Obtenir les résultats de la disposition
Après avoir appelé l’API Analyze Layout (Analyser la disposition), vous appelez l’API Get Analyze Layout Result (Obtenir le résultat de l’analyse de la disposition) pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez les modifications suivantes :
- Remplacez
{endpoint}
par le point de terminaison que vous avez obtenu avec votre abonnement d’Intelligence documentaire. - Remplacez
{key}
par la clé que vous avez copiée à l’étape précédente. - Remplacez
{resultId}
par l’ID de résultats de l’étape précédente.
Requête
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 200 (success)
avec du contenu JSON.
Regardez l’image de facture suivante et sa sortie JSON correspondante.
- Le nœud
"readResults"
contient chaque ligne de texte avec sa position de cadre englobant respectif dans la page. - Le nœud
selectionMarks
affiche chaque marque de sélection (case à cocher ou case d’option) et indique si son état estselected
ouunselected
. - La section
"pageResults"
comprend les tableaux extraits. Pour chaque tableau, le texte, l’index de ligne et de colonne, l’étendue de ligne et de colonne, le cadre englobant, etc. sont extraits.
Response body
Vous pouvez consulter l’exemple de sortie complet sur GitHub.
Essayez : Modèle prédéfini
- Pour cet exemple, nous analysons un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre exemple de facture 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 ayant chacun leur 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 d’Intelligence documentaire :
- Facture : extrait le texte, les marques de sélection, les tableaux, les champs et les informations clés des factures.
- Reçu : extrait le texte et les informations clés des reçus.
- Document d’identité : 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 les modifications suivantes :
Remplacez
{endpoint}
par le point de terminaison que vous avez obtenu avec votre abonnement d’Intelligence documentaire.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
Requête
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 réponse 202 (Success)
incluant un en-tête Operation-Location. La valeur de cet en-tête contient un ID de résultats qui vous permet d’interroger l’état de l’opération asynchrone et d’obtenir les résultats :
https://cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/ {ID-résultats}
Dans l’exemple suivant, la chaîne qui suit analyzeResults/
dans l’URL correspond à l’ID des résultats :
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 Analyser une facture, vous appelez l’API Obtenir le résultat de l’analyse de la facture pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez les modifications suivantes :
- Remplacez
{endpoint}
par le point de terminaison que vous avez obtenu avec votre clé d’Intelligence documentaire. Vous le trouverez sous l’onglet Vue d’ensemble de votre ressource d’Intelligence documentaire. - Remplacez
{resultId}
par l’ID de résultats de l’étape précédente. - Remplacez
{key}
par votre clé.
Requête
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 champ
"readResults"
contient chaque ligne de texte extraite de la facture. - Le champ
"pageResults"
comprend les tableaux et les marques de sélection extraits de la facture. - Le champ
"documentResults"
contient les informations relatives aux paires clé/valeur pour les parties les plus pertinentes de la facture.
Consultez le document Exemple de facture.
Response body
Consultez l’exemple de sortie complet sur GitHub.
Voilà, vous avez terminé.
Étapes suivantes
Pour une expérience améliorée et une qualité de modèle avancée, essayez Intelligence Documentaire Studio.
Le Studio prend en charge n’importe quel modèle entraîné avec des 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.