Bien démarrer avec Document Intelligence

Important

  • Azure Cognitive Services Form Recognizer est désormais Azure Document Intelligence dans Foundry Tools.
  • Certaines plateformes attendent toujours la mise à jour de changement de nom.
  • Toute mention de Form Recognizer ou document Intelligence dans notre documentation fait référence au même service Azure.

Ce contenu s’applique à :checkmarkv4.0 (GA)Versions antérieures :blue-checkmarkv3.1 (GA)blue-checkmarkv3.0 (GA)

  • Mettez-vous à la dernière version stable de Azure Document Intelligence v4.0 2024-11-30 (GA).

Ce contenu s’applique à :checkmarkv3.1 (GA)Versions antérieures :blue-checkmarkv3.0blue-checkmarkv2.1

  • Commencez avec la dernière version générale d'Azure Form Recognizer (2023-07-31).

Ce contenu s’applique à :checkmarkv3.0 (GA)Version plus récente :blue-checkmarkv3.1blue-checkmarkv2.1

  • Commencez avec la version héritée en disponibilité générale d’Azure Form Recognizer (2022-08-31).
  • Azure Document Intelligence / Form Recognizer est un service Foundry Tools basé sur le cloud qui utilise le Machine Learning pour extraire des paires clé-valeur, du texte, des tables et des données clés à partir de vos documents.

  • Vous pouvez facilement intégrer des modèles de traitement de documents dans vos workflows et applications à l’aide d’un SDK de langage de programmation ou d’appeler l’API REST.

  • Nous vous recommandons d’utiliser le service gratuit pendant que vous apprenez la technologie pour ce guide de démarrage rapide. N’oubliez pas que le nombre de pages gratuites est limité à 500 par mois.

Pour en savoir plus sur les fonctionnalités de l’API et les options de développement, visitez notre page Vue d’ensemble .

Dans ce guide de démarrage rapide, utilisez les fonctionnalités suivantes pour analyser et extraire des données et des valeurs à partir de formulaires et de documents :

  • Modèle de disposition : analysez et extrayez des tables, des lignes, des mots et des marques de sélection comme des cases d’option et des cases à cocher dans les documents, sans avoir à entraîner un modèle.

  • Modèle prédéfini : analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle prédéfini.

Conditions préalables

  • Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource single-service ou Azure multiservice, dans le portail Azure, pour obtenir votre clé et votre point de terminaison.

  • Vous pouvez utiliser le niveau tarifaire gratuit (F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.

Conseil

Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.

  • Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :

    Capture d'écran des clés et de l'emplacement de l'endpoint dans le portail Azure.

  • Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource single-service ou Azure multiservice, dans le portail Azure, pour obtenir votre clé et votre point de terminaison.

  • Vous pouvez utiliser le niveau tarifaire gratuit (F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.

Conseil

Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour avoir accès uniquement à Form Recognizer, créez une ressource Form Recognizer. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.

  • Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Form Recognizer. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :

    Capture d'écran des clés et de l'emplacement de l'endpoint dans le portail Azure.

Configurer

  1. Démarrez Visual Studio.

  2. Dans la page de démarrage, choisissez Créer un projet.

    Capture d'écran de la fenêtre de démarrage de Visual Studio.

  3. Dans la page Créer un projet, entrez la console dans la zone de recherche. Choisissez le modèle d’application console , puis choisissez Suivant.

    Capture d'écran de la page de création d’un nouveau projet dans Visual Studio.

  1. Dans la fenêtre de boîte de dialogue Configurer votre nouvelle boîte de dialogue project, entrez doc_intel_quickstart dans la zone nom du Project. Ensuite, choisissez Suivant.
  1. Dans la fenêtre de boîte de dialogue Configurer votre nouvelle boîte de dialogue project, entrez form_recognizer_quickstart dans la zone nom du Project. Ensuite, choisissez Suivant.
  1. Dans la fenêtre de dialogue Additional information, sélectionnez .NET 8.0 (support à long terme), puis sélectionnez Create.

    Screenshot de la fenêtre de dialogue d'informations supplémentaires de Visual Studio.

Installer la bibliothèque cliente avec NuGet

  1. Cliquez avec le bouton droit sur votre projet doc_intel_quickstart , puis sélectionnez Gérer les packages NuGet... .

    Capture d'écran de la fenêtre de sélection de package de préversion NuGet dans Visual Studio.

  2. Sélectionnez l’onglet Browse et tapez Azure. IA. DocumentIntelligence.

  3. Cochez la Include prerelease case.

    Capture d'écran d'un package NuGet en préversion sélectionné dans Visual Studio.

  4. Choisissez une version dans le menu déroulant et installez le package dans votre projet.

  1. Cliquez avec le bouton droit sur votre projet form_recognizer_quickstart , puis sélectionnez Gérer les packages NuGet... .

    Screenshot de la fenêtre rechercher le package NuGet dans Visual Studio.

  2. Sélectionnez l’onglet Parcourir et tapez Azure. IA. FormRecognizer. Sélectionnez la version 4.1.0 dans le menu déroulant

    Capture d'écran de la sélection du package NuGet Form Recognizer dans Visual Studio.

  1. Cliquez avec le bouton droit sur votre projet form_recognizer_quickstart , puis sélectionnez Gérer les packages NuGet... .

    Screenshot de la fenêtre de package NuGet dans Visual Studio.

  2. Sélectionnez l’onglet Parcourir et tapez Azure. IA. FormRecognizer. Sélectionnez la version 4.0.0 dans le menu déroulant

    Capture d'écran de la sélection de l'ancien package NuGet dans Visual Studio.

Créer votre application

Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentIntelligenceClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentIntelligenceClient avec le AzureKeyCredential et votre Document Intelligence endpoint.

Pour interagir avec le service Form Recognizer, vous devez créer une instance de la classe DocumentAnalysisClient. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentAnalysisClient avec le AzureKeyCredential et votre Form Recognizer endpoint.

Note

  • À compter de .NET 6, de nouveaux projets utilisant le modèle 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 using globales ou des directives using implicites.
  • Pour plus d’informations, consultezLes nouveaux modèles C# génèrent des instructions de niveau supérieur.
  1. Ouvrez le fichier Program.cs .

  2. Supprimez le code existant, y compris la ligne Console.Writeline("Hello World!"), puis sélectionnez l'un des exemples de code suivants pour copier et coller dans le fichier Program.cs de votre application :

Important

Nous vous recommandons l'authentification Microsoft Entra ID avec les identités gérées pour les ressources Azure pour éviter de stocker les informations d'identification avec vos applications qui s'exécutent dans le cloud.

Utilisez des clés API avec précaution. N’incluez pas la clé API directement dans votre code et ne la publiez jamais publiquement. Si vous utilisez des clés API, stockez-les en toute sécurité dans Azure Key Vault, faites pivoter les clés régulièrement et limitez l’accès aux Azure Key Vault à l’aide du contrôle d’accès en fonction du rôle et des restrictions d’accès réseau. Pour plus d’informations sur l’utilisation sécurisée des clés API dans vos applications, consultez les API avec Azure Key Vault.

Pour plus d’informations sur la sécurité des services d’INTELLIGENCE artificielle, consultez Demandes d’authentification à Azure AI services.

Modèle de disposition

Extrayez le texte, les marques de sélection, les styles textuels, les structures de tableau et les coordonnées des régions englobantes à partir de documents.

  • Pour cet exemple, vous aurez besoin d’un fichier de document à partir d’un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URI de fichier à la Uri fileUri variable en haut du script.
  • Pour extraire la disposition d’un fichier donné à un URI, utilisez la AnalyzeDocumentAsync méthode et passez prebuilt-layout comme ID de modèle. La valeur retournée est un AnalyzeResult objet contenant des données du document soumis.

Ajoutez l’exemple de code suivant au fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :


using Azure;
using Azure.AI.DocumentIntelligence;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");

AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
    UrlSource= fileUri
};

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", content);

AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s)," +
        $" and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];

        Console.WriteLine($"  Line {i}:");
        Console.WriteLine($"    Content: '{line.Content}'");

        Console.Write("    Bounding polygon, with points ordered clockwise:");
        for (int j = 0; j < line.Polygon.Count; j += 2)
        {
            Console.Write($" ({line.Polygon[j]}, {line.Polygon[j + 1]})");
        }

        Console.WriteLine();
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    State: {selectionMark.State}");

        Console.Write("    Bounding polygon, with points ordered clockwise:");
        for (int j = 0; j < selectionMark.Polygon.Count; j++)
        {
            Console.Write($" ({selectionMark.Polygon[j]}, {selectionMark.Polygon[j + 1]})");
        }

        Console.WriteLine();
    }
}

for (int i = 0; i < result.Paragraphs.Count; i++)
{
    DocumentParagraph paragraph = result.Paragraphs[i];

    Console.WriteLine($"Paragraph {i}:");
    Console.WriteLine($"  Content: {paragraph.Content}");

    if (paragraph.Role != null)
    {
        Console.WriteLine($"  Role: {paragraph.Role}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            var handwrittenContent = result.Content.Substring(span.Offset, span.Length);
            Console.WriteLine($"  {handwrittenContent}");
        }
    }
}

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];

    Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"  Cell ({cell.RowIndex}, {cell.ColumnIndex}) is a '{cell.Kind}' with content: {cell.Content}");
    }
}

Exécuter votre application

Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.

Capture d’écran du bouton Exécuter votre programme dans Visual Studio.

Ajoutez l’exemple de code suivant au fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l'instance de Form Recognizer de votre portail Azure.

using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);

AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
    Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding box is:");
        Console.WriteLine($"      Upper left => X: {line.Polygon[0].X}, Y= {line.Polygon[0].Y}");
        Console.WriteLine($"      Upper right => X: {line.Polygon[1].X}, Y= {line.Polygon[1].Y}");
        Console.WriteLine($"      Lower right => X: {line.Polygon[2].X}, Y= {line.Polygon[2].Y}");
        Console.WriteLine($"      Lower left => X: {line.Polygon[3].X}, Y= {line.Polygon[3].Y}");
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding box is:");
        Console.WriteLine($"      Upper left => X: {selectionMark.Polygon[0].X}, Y= {selectionMark.Polygon[0].Y}");
        Console.WriteLine($"      Upper right => X: {selectionMark.Polygon[1].X}, Y= {selectionMark.Polygon[1].Y}");
        Console.WriteLine($"      Lower right => X: {selectionMark.Polygon[2].X}, Y= {selectionMark.Polygon[2].Y}");
        Console.WriteLine($"      Lower left => X: {selectionMark.Polygon[3].X}, Y= {selectionMark.Polygon[3].Y}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
    }
}

Exécuter votre application

Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.

Capture d’écran de l’emplacement du bouton d’exécution de votre programme Visual Studio.

Sortie du modèle de mise en page

Voici un extrait de code de la sortie attendue :

  Document Page 1 has 69 line(s), 425 word(s), and 15 selection mark(s).
  Line 0 has content: 'UNITED STATES'.
    Its bounding box is:
      Upper left => X: 3.4915, Y= 0.6828
      Upper right => X: 5.0116, Y= 0.6828
      Lower right => X: 5.0116, Y= 0.8265
      Lower left => X: 3.4915, Y= 0.8265
  Line 1 has content: 'SECURITIES AND EXCHANGE COMMISSION'.
    Its bounding box is:
      Upper left => X: 2.1937, Y= 0.9061
      Upper right => X: 6.297, Y= 0.9061
      Lower right => X: 6.297, Y= 1.0498
      Lower left => X: 2.1937, Y= 1.0498

Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de mise en page.

Ajoutez l’exemple de code suivant au fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs provenant de votre instance Form Recognizer sur le portail Azure.

using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);

AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
    Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < line.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
        }
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < selectionMark.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
        }
    }
}

Console.WriteLine("Paragraphs:");

foreach (DocumentParagraph paragraph in result.Paragraphs)
{
    Console.WriteLine($"  Paragraph content: {paragraph.Content}");

    if (paragraph.Role != null)
    {
        Console.WriteLine($"    Role: {paragraph.Role}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
    }
}
Extract the layout of a document from a file stream
To extract the layout from a given file at a file stream, use the AnalyzeDocument method and pass prebuilt-layout as the model ID. The returned value is an AnalyzeResult object containing data about the submitted document.

string filePath = "<filePath>";
using var stream = new FileStream(filePath, FileMode.Open);

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", stream);
AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
    Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < line.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
        }
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < selectionMark.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
        }
    }
}

Console.WriteLine("Paragraphs:");

foreach (DocumentParagraph paragraph in result.Paragraphs)
{
    Console.WriteLine($"  Paragraph content: {paragraph.Content}");

    if (paragraph.Role != null)
    {
        Console.WriteLine($"    Role: {paragraph.Role}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
    }
}

Exécuter votre application

Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.

Capture d'écran de l'exécution de votre programme Visual Studio.

Modèle prédéfini

Analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle prédéfini. Dans cet exemple, nous analysons une facture à l’aide du modèle prédéfini de facture .

Conseil

Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Consultez l’extraction des données du modèle.

  • Analysez une facture à l’aide du modèle prédéfini de facture. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URI du fichier à la Uri invoiceUri variable en haut du fichier Program.cs.
  • Pour analyser un fichier donné à un URI, utilisez la AnalyzeDocumentAsync méthode et passez prebuilt-invoice comme ID de modèle. La valeur retournée est un AnalyzeResult objet contenant des données du document soumis.
  • Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas affichées ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .

Ajoutez l’exemple de code suivant à votre fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :


using Azure;
using Azure.AI.DocumentIntelligence;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

//sample invoice document
Uri invoiceUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");

AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
    UrlSource = invoiceUri
};

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", content);

AnalyzeResult result = operation.Value;

for (int i = 0; i < result.Documents.Count; i++)
{
    Console.WriteLine($"Document {i}:");

    AnalyzedDocument document = result.Documents[i];

    if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField)
        && vendorNameField.FieldType == DocumentFieldType.String)
    {
        string vendorName = vendorNameField.ValueString;
        Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
    }

    if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField)
        && customerNameField.FieldType == DocumentFieldType.String)
    {
        string customerName = customerNameField.ValueString;
        Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
    }

    if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
        && itemsField.FieldType == DocumentFieldType.List)
    {
        foreach (DocumentField itemField in itemsField.ValueList)
        {
            Console.WriteLine("Item:");

            if (itemField.FieldType == DocumentFieldType.Dictionary)
            {
                IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueDictionary;

                if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField)
                    && itemDescriptionField.FieldType == DocumentFieldType.String)
                {
                    string itemDescription = itemDescriptionField.ValueString;
                    Console.WriteLine($"  Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
                }

                if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField)
                    && itemAmountField.FieldType == DocumentFieldType.Currency)
                {
                    CurrencyValue itemAmount = itemAmountField.ValueCurrency;
                    Console.WriteLine($"  Amount: '{itemAmount.CurrencySymbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
                }
            }
        }
    }

    if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField)
        && subTotalField.FieldType == DocumentFieldType.Currency)
    {
        CurrencyValue subTotal = subTotalField.ValueCurrency;
        Console.WriteLine($"Sub Total: '{subTotal.CurrencySymbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
    }

    if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField)
        && totalTaxField.FieldType == DocumentFieldType.Currency)
    {
        CurrencyValue totalTax = totalTaxField.ValueCurrency;
        Console.WriteLine($"Total Tax: '{totalTax.CurrencySymbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
    }

    if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField)
        && invoiceTotalField.FieldType == DocumentFieldType.Currency)
    {
        CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
        Console.WriteLine($"Invoice Total: '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
    }
}

Exécuter votre application

Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.

Capture d'écran du bouton Exécuter votre programme dans Visual Studio.

Ajoutez l’exemple de code suivant à votre fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.


using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `FormRecognizerClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample invoice document

Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");

Operation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", invoiceUri);

AnalyzeResult result = operation.Value;

for (int i = 0; i < result.Documents.Count; i++)
{
    Console.WriteLine($"Document {i}:");

    AnalyzedDocument document = result.Documents[i];

    if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField))
    {
        if (vendorNameField.FieldType == DocumentFieldType.String)
        {
            string vendorName = vendorNameField.Value.AsString();
            Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField))
    {
        if (customerNameField.FieldType == DocumentFieldType.String)
        {
            string customerName = customerNameField.Value.AsString();
            Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
    {
        if (itemsField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField itemField in itemsField.Value.AsList())
            {
                Console.WriteLine("Item:");

                if (itemField.FieldType == DocumentFieldType.Dictionary)
                {
                    IReadOnlyDictionary<string, DocumentField> itemFields = itemField.Value.AsDictionary();

                    if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
                    {
                        if (itemDescriptionField.FieldType == DocumentFieldType.String)
                        {
                            string itemDescription = itemDescriptionField.Value.AsString();

                            Console.WriteLine($"  Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
                        }
                    }

                    if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
                    {
                        if (itemAmountField.FieldType == DocumentFieldType.Currency)
                        {
                            CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();

                            Console.WriteLine($"  Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField))
    {
        if (subTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue subTotal = subTotalField.Value.AsCurrency();
            Console.WriteLine($"Sub Total: '{subTotal.Symbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField))
    {
        if (totalTaxField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue totalTax = totalTaxField.Value.AsCurrency();
            Console.WriteLine($"Total Tax: '{totalTax.Symbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField))
    {
        if (invoiceTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue invoiceTotal = invoiceTotalField.Value.AsCurrency();
            Console.WriteLine($"Invoice Total: '{invoiceTotal.Symbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
        }
    }
}

Exécuter votre application

Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.

Capture d'écran de l'emplacement du bouton pour exécuter votre programme Visual Studio.

Sortie du modèle prédéfini

Voici un extrait de code de la sortie attendue :

  Document 0:
  Vendor Name: 'CONTOSO LTD.', with confidence 0.962
  Customer Name: 'MICROSOFT CORPORATION', with confidence 0.951
  Item:
    Description: 'Test for 23 fields', with confidence 0.899
    Amount: '100', with confidence 0.902
  Sub Total: '100', with confidence 0.979

Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples de Azure sur GitHub pour afficher la sortie du modèle de facture prebuilt.

Ajoutez l’exemple de code suivant à votre fichier Program.cs. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.


using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `FormRecognizerClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample invoice document

Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-invoice", invoiceUri);

AnalyzeResult result = operation.Value;

for (int i = 0; i < result.Documents.Count; i++)
{
    Console.WriteLine($"Document {i}:");

    AnalyzedDocument document = result.Documents[i];

    if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField))
    {
        if (vendorNameField.FieldType == DocumentFieldType.String)
        {
            string vendorName = vendorNameField.Value.AsString();
            Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField))
    {
        if (customerNameField.FieldType == DocumentFieldType.String)
        {
            string customerName = customerNameField.Value.AsString();
            Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
    {
        if (itemsField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField itemField in itemsField.Value.AsList())
            {
                Console.WriteLine("Item:");

                if (itemField.FieldType == DocumentFieldType.Dictionary)
                {
                    IReadOnlyDictionary<string, DocumentField> itemFields = itemField.Value.AsDictionary();

                    if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
                    {
                        if (itemDescriptionField.FieldType == DocumentFieldType.String)
                        {
                            string itemDescription = itemDescriptionField.Value.AsString();

                            Console.WriteLine($"  Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
                        }
                    }

                    if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
                    {
                        if (itemAmountField.FieldType == DocumentFieldType.Currency)
                        {
                            CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();

                            Console.WriteLine($"  Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField))
    {
        if (subTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue subTotal = subTotalField.Value.AsCurrency();
            Console.WriteLine($"Sub Total: '{subTotal.Symbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField))
    {
        if (totalTaxField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue totalTax = totalTaxField.Value.AsCurrency();
            Console.WriteLine($"Total Tax: '{totalTax.Symbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField))
    {
        if (invoiceTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue invoiceTotal = invoiceTotalField.Value.AsCurrency();
            Console.WriteLine($"Invoice Total: '{invoiceTotal.Symbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
        }
    }
}

Exécuter votre application

Une fois que vous avez ajouté un exemple de code à votre application, choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.

Capture d'écran de l'exécution de votre programme Visual Studio.

Dans ce guide de démarrage rapide, utilisez les fonctionnalités suivantes pour analyser et extraire des données et des valeurs à partir de formulaires et de documents :

  • Disposition : analysez et extrayez des tableaux, des lignes, des mots et des marques de sélection comme des cases d’option et des cases à cocher dans des documents, sans avoir à entraîner un modèle.

  • Facture prédéfinie : analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle préentraîné.

Conditions préalables

  • abonnement Azure - Créez-en un gratuitement.

  • La dernière version de Visual Studio Code ou votre IDE préféré. VoirJava dans Visual Studio Code.

    Conseil

    • Visual Studio Code propose un pack Coding pour Java pour Windows et macOS.Le pack de codage est un ensemble de VS Code, du kit de développement Java (JDK) et d’une collection d’extensions suggérées par Microsoft. Le pack de codage peut également être utilisé pour corriger un environnement de développement existant.
    • Si vous utilisez VS Code et le pack de codage pour Java, installez l'extension Gradle pour Java.
  • Si vous n'utilisez pas Visual Studio Code, vérifiez que vous disposez des éléments suivants dans votre environnement de développement :

  • Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource Document Intelligence à service unique ou à service multiple dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.

    Conseil

    Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.

  • Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Plus tard, vous collez votre clé et votre point de terminaison dans le code :

    Capture d'écran des clés et de l'emplacement de l'endpoint dans le portail Azure.

Configurer

Créer un projet Gradle

  1. Dans la fenêtre de console (par exemple, cmd, PowerShell ou Bash), créez un répertoire pour votre application appelée doc-intel-app, puis accédez-y.

    mkdir doc-intel-app && doc-intel-app
    
    mkdir doc-intel-app; cd doc-intel-app
    
  2. Exécutez la gradle init commande à partir de votre répertoire de travail. Cette commande crée des fichiers de build essentiels pour Gradle, notamment build.gradle.kts, qui est utilisé lors de l’exécution pour créer et configurer votre application.

    gradle init --type basic
    
  3. Lorsque vous êtes invité à choisir une DSL, sélectionnez Kotlin.

  4. Acceptez le nom du projet par défaut (doc-intel-app) en sélectionnant Retour ou Entrée.

  1. Dans la fenêtre de console (par exemple, cmd, PowerShell ou Bash), créez un répertoire pour votre application appelée form-recognize-app, puis accédez-y.

    mkdir form-recognize-app && cd form-recognize-app
    
    mkdir form-recognize-app; cd form-recognize-app
    
  2. Exécutez la gradle init commande à partir de votre répertoire de travail. Cette commande crée des fichiers de build essentiels pour Gradle, notamment build.gradle.kts, qui est utilisé lors de l’exécution pour créer et configurer votre application.

    gradle init --type basic
    
  3. Lorsque vous êtes invité à choisir une DSL, sélectionnez Kotlin.

  4. Acceptez le nom de projet par défaut (form-recognize-app) en sélectionnant Retour ou Entrée.

Installer la bibliothèque cliente

Ce guide de démarrage rapide utilise le gestionnaire de dépendances Gradle. Vous trouverez la bibliothèque cliente et les informations pour d’autres gestionnaires de dépendances sur le référentiel central Maven.

Ouvrez le fichier build.gradle.kts du projet dans votre IDE. Copiez et collez le code suivant pour inclure la bibliothèque cliente en tant que déclaration implementation, ainsi que les plug-ins et paramètres requis.

   plugins {
       java
       application
   }
   application {
       mainClass.set("DocIntelligence")
   }
   repositories {
       mavenCentral()
   }
   dependencies {
       implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0'

   }

Ce guide de démarrage rapide utilise le gestionnaire de dépendances Gradle. Vous trouverez la bibliothèque cliente et les informations pour d’autres gestionnaires de dépendances sur le référentiel central Maven.

Ouvrez le fichier build.gradle.kts du projet dans votre IDE. Copier et collez le code suivant pour inclure la bibliothèque cliente comme une instruction implementation, ainsi que les plug-ins et paramètres requis.

   plugins {
       java
       application
   }
   application {
       mainClass.set("FormRecognizer")
   }
   repositories {
       mavenCentral()
   }
   dependencies {
       implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.1.0'

   }

Ce guide de démarrage rapide utilise le gestionnaire de dépendances Gradle. Vous trouverez la bibliothèque cliente et les informations pour d’autres gestionnaires de dépendances sur le référentiel central Maven.

Ouvrez le fichier build.gradle.kts du projet dans votre IDE. Copiez et collez le code suivant pour inclure la bibliothèque cliente en tant qu’instruction implementation, ainsi que les plug-ins et paramètres requis.

   plugins {
       java
       application
   }
   application {
       mainClass.set("FormRecognizer")
   }
   repositories {
       mavenCentral()
   }
   dependencies {
       implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'


   }

Créer une application Java

Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentIntelligenceClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentIntelligenceClient avec le AzureKeyCredential et votre Document Intelligence endpoint.

Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentAnalysisClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentAnalysisClient avec le AzureKeyCredential et votre Document Intelligence endpoint.

  1. À 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 :

    Capture d'écran de la structure de répertoire Java

  1. Accédez au java répertoire et créez un fichier nommé DocIntelligence.java.

    Conseil

    • Vous pouvez créer un fichier à l’aide de PowerShell.
    • Ouvrez une fenêtre PowerShell dans votre répertoire de projet en maintenant la touche Maj enfoncée et en cliquant avec le bouton droit sur le dossier.
    • Tapez la commande suivante New-Item DocIntelligence.java.
  2. Ouvrez le DocIntelligence.java fichier. Copiez et collez l’un des exemples de code suivants dans votre application :

  1. Accédez au java répertoire et créez un fichier nommé FormRecognizer.java.

    Conseil

    • Vous pouvez créer un fichier à l’aide de PowerShell.
    • Ouvrez une fenêtre PowerShell dans votre répertoire de projet en maintenant la touche Maj enfoncée et en cliquant avec le bouton droit sur le dossier.
    • Tapez la commande suivante New-Item FormRecognizer.java.
  2. Ouvrez le FormRecognizer.java fichier. Copiez et collez l’un des exemples de code suivants dans votre application :

Important

Nous vous recommandons l'authentification Microsoft Entra ID avec les identités gérées pour les ressources Azure pour éviter de stocker les informations d'identification avec vos applications qui s'exécutent dans le cloud.

Utilisez des clés API avec précaution. N’incluez pas la clé API directement dans votre code et ne la publiez jamais publiquement. Si vous utilisez des clés API, stockez-les en toute sécurité dans Azure Key Vault, faites pivoter les clés régulièrement et limitez l’accès aux Azure Key Vault à l’aide du contrôle d’accès en fonction du rôle et des restrictions d’accès réseau. Pour plus d’informations sur l’utilisation sécurisée des clés API dans vos applications, consultez les API avec Azure Key Vault.

Pour plus d’informations sur la sécurité des services d’INTELLIGENCE artificielle, consultez Demandes d’authentification à Azure AI services.

Modèle de disposition

Extrayez le texte, les marques de sélection, les styles textuels, les structures de tableau et les coordonnées des régions englobantes à partir de documents.

  • Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
  • Pour analyser un fichier donné à un URI, vous allez utiliser la beginAnalyzeDocument méthode et passer prebuilt-layout en tant qu’ID de modèle. La valeur retournée est un AnalyzeResult objet contenant des données sur le document soumis.
  • Nous avons ajouté la valeur d’URI de fichier à la documentUrl variable dans la méthode principale.

Ajoutez l’exemple de code suivant au DocIntelligence.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :


import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.DocumentTable;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.util.List;

public class DocIntelligence {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

    // create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
    DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String modelId = "prebuilt-layout";
    String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";

    AnalyzeDocumentOptions options = new AnalyzeDocumentOptions(documentUrl);

    SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeLayoutPoller = client.beginAnalyzeDocument(modelId, options);

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();

    // pages
    analyzeLayoutResult.getPages().forEach(documentPage -> {
      System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
        documentPage.getWidth(),
        documentPage.getHeight(),
        documentPage.getUnit());

      // lines
      documentPage.getLines().forEach(documentLine ->
        System.out.printf("Line '%s' is within a bounding polygon %s.%n",
          documentLine.getContent(),
          documentLine.getPolygon()));

      // words
      documentPage.getWords().forEach(documentWord ->
        System.out.printf("Word '%s' has a confidence score of %.2f.%n",
          documentWord.getContent(),
          documentWord.getConfidence()));

      // selection marks
      documentPage.getSelectionMarks().forEach(documentSelectionMark ->
        System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
          documentSelectionMark.getState().toString(),
          documentSelectionMark.getPolygon(),
          documentSelectionMark.getConfidence()));
    });

    // tables
    List < DocumentTable > tables = analyzeLayoutResult.getTables();
    for (int i = 0; i < tables.size(); i++) {
      DocumentTable documentTable = tables.get(i);
      System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
        documentTable.getColumnCount());
      documentTable.getCells().forEach(documentTableCell ->
        System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
          documentTableCell.getRowIndex(), documentTableCell.getColumnIndex()));
      System.out.println();
    }

    // styles
    analyzeLayoutResult.getStyles().forEach(documentStyle -> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
  }
}

Générer et exécuter l’application

Après avoir ajouté un exemple de code à votre application, revenez au répertoire de votre projet principal ( doc-intel-app).

  1. Générez votre application avec la build commande :

    gradle build
    
  2. Exécutez votre application avec la run commande :

    gradle run
    

Ajoutez l’exemple de code suivant au FormRecognizer.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :


import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

    // create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
    String modelId = "prebuilt-layout";

    SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
      client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);

    AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();

    // pages
    analyzeLayoutResult.getPages().forEach(documentPage -> {
      System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
        documentPage.getWidth(),
        documentPage.getHeight(),
        documentPage.getUnit());

      // lines
      documentPage.getLines().forEach(documentLine ->
        System.out.printf("Line %s is within a bounding polygon %s.%n",
          documentLine.getContent(),
          documentLine.getPolygon().toString()));

      // words
      documentPage.getWords().forEach(documentWord ->
        System.out.printf("Word '%s' has a confidence score of %.2f%n",
          documentWord.getContent(),
          documentWord.getConfidence()));

      // selection marks
      documentPage.getSelectionMarks().forEach(documentSelectionMark ->
        System.out.printf("Selection mark is %s and is within a bounding polygon %s with confidence %.2f.%n",
          documentSelectionMark.getState().toString(),
          documentSelectionMark.getPolygon().toString(),
          documentSelectionMark.getConfidence()));
    });

    // tables
    List < DocumentTable > tables = analyzeLayoutResult.getTables();
    for (int i = 0; i < tables.size(); i++) {
      DocumentTable documentTable = tables.get(i);
      System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
        documentTable.getColumnCount());
      documentTable.getCells().forEach(documentTableCell -> {
        System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
          documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
      });
      System.out.println();
    }
  }
  // Utility function to get the bounding polygon coordinates
  private static String getBoundingCoordinates(List < Point > Polygon) {
    return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
      point.getY())).collect(Collectors.joining(", "));
  }
}

Générer et exécuter l’application

Après avoir ajouté un exemple de code à votre application, revenez à votre répertoire de projet principal ( form-recognize-app).

  1. Générez votre application avec la build commande :

    gradle build
    
  2. Exécutez votre application avec la run commande :

    gradle run
    

Sortie du modèle de mise en page

Voici un extrait de code de la sortie attendue :

  Table 0 has 5 rows and 3 columns.
  Cell 'Title of each class', has row index 0 and column index 0.
  Cell 'Trading Symbol', has row index 0 and column index 1.
  Cell 'Name of exchange on which registered', has row index 0 and column index 2.
  Cell 'Common stock, $0.00000625 par value per share', has row index 1 and column index 0.
  Cell 'MSFT', has row index 1 and column index 1.
  Cell 'NASDAQ', has row index 1 and column index 2.
  Cell '2.125% Notes due 2021', has row index 2 and column index 0.
  Cell 'MSFT', has row index 2 and column index 1.
  Cell 'NASDAQ', has row index 2 and column index 2.
  Cell '3.125% Notes due 2028', has row index 3 and column index 0.
  Cell 'MSFT', has row index 3 and column index 1.
  Cell 'NASDAQ', has row index 3 and column index 2.
  Cell '2.625% Notes due 2033', has row index 4 and column index 0.
  Cell 'MSFT', has row index 4 and column index 1.
  Cell 'NASDAQ', has row index 4 and column index 2.

Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de mise en page.

Ajoutez l’exemple de code suivant au FormRecognizer.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :


import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentTable;
import com.azure.ai.formrecognizer.documentanalysis.models.Point;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.util.List;
import java.util.stream.Collectors;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

    // create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
    String modelId = "prebuilt-layout";

    SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutPoller =
      client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();

    // pages
    analyzeLayoutResult.getPages().forEach(documentPage -> {
      System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
        documentPage.getWidth(),
        documentPage.getHeight(),
        documentPage.getUnit());

      // lines
      documentPage.getLines().forEach(documentLine ->
        System.out.printf("Line '%s' is within a bounding polygon %s.%n",
          documentLine.getContent(),
          getBoundingCoordinates(documentLine.getPolygon())));

      // words
      documentPage.getWords().forEach(documentWord ->
        System.out.printf("Word '%s' has a confidence score of %.2f.%n",
          documentWord.getContent(),
          documentWord.getConfidence()));

      // selection marks
      documentPage.getSelectionMarks().forEach(documentSelectionMark ->
        System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
          documentSelectionMark.getSelectionMarkState().toString(),
          getBoundingCoordinates(documentSelectionMark.getPolygon()),
          documentSelectionMark.getConfidence()));
    });

    // tables
    List < DocumentTable > tables = analyzeLayoutResult.getTables();
    for (int i = 0; i < tables.size(); i++) {
      DocumentTable documentTable = tables.get(i);
      System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
        documentTable.getColumnCount());
      documentTable.getCells().forEach(documentTableCell -> {
        System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
          documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
      });
      System.out.println();
    }

    // styles
    analyzeLayoutResult.getStyles().forEach(documentStyle -
      > System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
  }

  /**
   * Utility function to get the bounding polygon coordinates.
   */
  private static String getBoundingCoordinates(List < Point > Polygon) {
    return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
      point.getY())).collect(Collectors.joining(", "));
  }
}

Générer et exécuter l’application

Après avoir ajouté un exemple de code à votre application, revenez à votre répertoire de projet principal ( form-recognize-app).

  1. Générez votre application avec la build commande :

    gradle build
    
  2. Exécutez votre application avec la run commande :

    gradle run
    

Modèle prédéfini

Analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle prédéfini. Dans cet exemple, nous analysons une facture à l’aide du modèle prédéfini de facture .

Conseil

Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Consultez l’extraction des données du modèle.

  • Analysez une facture à l’aide du modèle prédéfini de facture. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URL du fichier à la invoiceUrl variable en haut du fichier.
  • Pour analyser un fichier donné à un URI, vous allez utiliser la beginAnalyzeDocuments méthode et passer PrebuiltModels.Invoice en tant qu’ID de modèle. La valeur retournée est un result objet contenant des données sur le document soumis.
  • Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas affichées ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .

Ajoutez l’exemple de code suivant au DocIntelligence.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :


import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzedDocument;
import com.azure.ai.documentintelligence.models.DocumentField;
import com.azure.ai.documentintelligence.models.DocumentFieldType;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

public class DocIntelligence {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

    // create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
    DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String modelId = "prebuilt-invoice";
    String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

    SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeInvoicesPoller =
      client.beginAnalyzeDocument(modelId, new AnalyzeDocumentOptions(invoiceUrl));

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult();

    for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
      AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
      Map<String, DocumentField> invoiceFields = analyzedInvoice.getFields();
      System.out.printf("----------- Analyzing invoice  %d -----------%n", i);
      DocumentField vendorNameField = invoiceFields.get("VendorName");
      if (vendorNameField != null) {
        if (DocumentFieldType.STRING == vendorNameField.getType()) {
          String merchantName = vendorNameField.getValueAsString();
          System.out.printf("Vendor Name: %s, confidence: %.2f%n",
            merchantName, vendorNameField.getConfidence());
        }
      }

      DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
      if (vendorAddressField != null) {
        if (DocumentFieldType.STRING == vendorAddressField.getType()) {
          String merchantAddress = vendorAddressField.getValueAsString();
          System.out.printf("Vendor address: %s, confidence: %.2f%n",
            merchantAddress, vendorAddressField.getConfidence());
        }
      }

      DocumentField customerNameField = invoiceFields.get("CustomerName");
      if (customerNameField != null) {
        if (DocumentFieldType.STRING == customerNameField.getType()) {
          String merchantAddress = customerNameField.getValueAsString();
          System.out.printf("Customer Name: %s, confidence: %.2f%n",
            merchantAddress, customerNameField.getConfidence());
        }
      }

      DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
          String customerAddr = customerAddressRecipientField.getValueAsString();
          System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
            customerAddr, customerAddressRecipientField.getConfidence());
        }
      }

      DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
      if (invoiceIdField != null) {
        if (DocumentFieldType.STRING == invoiceIdField.getType()) {
          String invoiceId = invoiceIdField.getValueAsString();
          System.out.printf("Invoice ID: %s, confidence: %.2f%n",
            invoiceId, invoiceIdField.getConfidence());
        }
      }

      DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
      if (invoiceDateField != null) {
        if (DocumentFieldType.DATE == invoiceDateField.getType()) {
          LocalDate invoiceDate = invoiceDateField.getValueAsDate();
          System.out.printf("Invoice Date: %s, confidence: %.2f%n",
            invoiceDate, invoiceDateField.getConfidence());
        }
      }

      DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
      if (invoiceTotalField != null) {
        if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
          Double invoiceTotal = invoiceTotalField.getValueAsDouble();
          System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
            invoiceTotal, invoiceTotalField.getConfidence());
        }
      }

      DocumentField invoiceItemsField = invoiceFields.get("Items");
      if (invoiceItemsField != null) {
        System.out.printf("Invoice Items: %n");
        if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
          List<DocumentField> invoiceItems = invoiceItemsField.getValueAsList();
          invoiceItems.stream()
            .filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
            .map(documentField -> documentField.getValueAsMap())
            .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {

              // See a full list of fields found on an invoice here:
              // https://aka.ms/documentintelligence/invoicefields

              if ("Description".equals(key)) {
                if (DocumentFieldType.STRING == documentField.getType()) {
                  String name = documentField.getValueAsString();
                  System.out.printf("Description: %s, confidence: %.2fs%n",
                    name, documentField.getConfidence());
                }
              }
              if ("Quantity".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double quantity = documentField.getValueAsDouble();
                  System.out.printf("Quantity: %f, confidence: %.2f%n",
                    quantity, documentField.getConfidence());
                }
              }
              if ("UnitPrice".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double unitPrice = documentField.getValueAsDouble();
                  System.out.printf("Unit Price: %f, confidence: %.2f%n",
                    unitPrice, documentField.getConfidence());
                }
              }
              if ("ProductCode".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double productCode = documentField.getValueAsDouble();
                  System.out.printf("Product Code: %f, confidence: %.2f%n",
                    productCode, documentField.getConfidence());
                }
              }
            }));
        }
      }
    }
  }
}

Générer et exécuter l’application

Après avoir ajouté un exemple de code à votre application, revenez au répertoire de votre projet principal ( doc-intel-app).

  1. Générez votre application avec la build commande :

    gradle build
    
  2. Exécutez votre application avec la run commande :

    gradle run
    

Ajoutez l’exemple de code suivant au FormRecognizer.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :


import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(final String[] args) throws IOException {

    // create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String modelId = "prebuilt-invoice";
    String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

    SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

    for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
      AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
      Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
      System.out.printf("----------- Analyzing invoice  %d -----------%n", i);
      DocumentField vendorNameField = invoiceFields.get("VendorName");
      if (vendorNameField != null) {
        if (DocumentFieldType.STRING == vendorNameField.getType()) {
          String merchantName = vendorNameField.getValueAsString();
          System.out.printf("Vendor Name: %s, confidence: %.2f%n",
            merchantName, vendorNameField.getConfidence());
        }
      }

      DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
      if (vendorAddressField != null) {
        if (DocumentFieldType.STRING == vendorAddressField.getType()) {
          String merchantAddress = vendorAddressField.getValueAsString();
          System.out.printf("Vendor address: %s, confidence: %.2f%n",
            merchantAddress, vendorAddressField.getConfidence());
        }
      }

      DocumentField customerNameField = invoiceFields.get("CustomerName");
      if (customerNameField != null) {
        if (DocumentFieldType.STRING == customerNameField.getType()) {
          String merchantAddress = customerNameField.getValueAsString();
          System.out.printf("Customer Name: %s, confidence: %.2f%n",
            merchantAddress, customerNameField.getConfidence());
        }
      }

      DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
          String customerAddr = customerAddressRecipientField.getValueAsString();
          System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
            customerAddr, customerAddressRecipientField.getConfidence());
        }
      }

      DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
      if (invoiceIdField != null) {
        if (DocumentFieldType.STRING == invoiceIdField.getType()) {
          String invoiceId = invoiceIdField.getValueAsString();
          System.out.printf("Invoice ID: %s, confidence: %.2f%n",
            invoiceId, invoiceIdField.getConfidence());
        }
      }

      DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
      if (customerNameField != null) {
        if (DocumentFieldType.DATE == invoiceDateField.getType()) {
          LocalDate invoiceDate = invoiceDateField.getValueAsDate();
          System.out.printf("Invoice Date: %s, confidence: %.2f%n",
            invoiceDate, invoiceDateField.getConfidence());
        }
      }

      DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
          Double invoiceTotal = invoiceTotalField.getValueAsDouble();
          System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
            invoiceTotal, invoiceTotalField.getConfidence());
        }
      }

      DocumentField invoiceItemsField = invoiceFields.get("Items");
      if (invoiceItemsField != null) {
        System.out.printf("Invoice Items: %n");
        if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
          List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
          invoiceItems.stream()
            .filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
            .map(documentField -> documentField.getValueAsMap())
            .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {

              // See a full list of fields found on an invoice here:
              // https://aka.ms/formrecognizer/invoicefields

              if ("Description".equals(key)) {
                if (DocumentFieldType.STRING == documentField.getType()) {
                  String name = documentField.getValueAsString();
                  System.out.printf("Description: %s, confidence: %.2fs%n",
                    name, documentField.getConfidence());
                }
              }
              if ("Quantity".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double quantity = documentField.getValueAsDouble();
                  System.out.printf("Quantity: %f, confidence: %.2f%n",
                    quantity, documentField.getConfidence());
                }
              }
              if ("UnitPrice".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double unitPrice = documentField.getValueAsDouble();
                  System.out.printf("Unit Price: %f, confidence: %.2f%n",
                    unitPrice, documentField.getConfidence());
                }
              }
              if ("ProductCode".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double productCode = documentField.getValueAsDouble();
                  System.out.printf("Product Code: %f, confidence: %.2f%n",
                    productCode, documentField.getConfidence());
                }
              }
            }));
        }
      }
    }
  }
}

Générer et exécuter l’application

Après avoir ajouté un exemple de code à votre application, revenez au répertoire de votre projet principal ( doc-intel-app).

  1. Générez votre application avec la build commande :

    gradle build
    
  2. Exécutez votre application avec la run commande :

    gradle run
    

Sortie du modèle prédéfini

Voici un extrait de code de la sortie attendue :

  ----------- Analyzing invoice  0 -----------
  Analyzed document has doc type invoice with confidence : 1.00
  Vendor Name: CONTOSO LTD., confidence: 0.92
  Vendor address: 123 456th St New York, NY, 10001, confidence: 0.91
  Customer Name: MICROSOFT CORPORATION, confidence: 0.84
  Customer Address Recipient: Microsoft Corp, confidence: 0.92
  Invoice ID: INV-100, confidence: 0.97
  Invoice Date: 2019-11-15, confidence: 0.97

Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples de Azure sur GitHub pour afficher la sortie du modèle de facture prebuilt.

Ajoutez l’exemple de code suivant au FormRecognizer.java fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :


import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzedDocument;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentField;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentFieldType;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

    // create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String modelId = "prebuilt-invoice";
    String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

    SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

    for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
      AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
      Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
      System.out.printf("----------- Analyzing invoice  %d -----------%n", i);
      DocumentField vendorNameField = invoiceFields.get("VendorName");
      if (vendorNameField != null) {
        if (DocumentFieldType.STRING == vendorNameField.getType()) {
          String merchantName = vendorNameField.getValueAsString();
          System.out.printf("Vendor Name: %s, confidence: %.2f%n",
            merchantName, vendorNameField.getConfidence());
        }
      }

      DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
      if (vendorAddressField != null) {
        if (DocumentFieldType.STRING == vendorAddressField.getType()) {
          String merchantAddress = vendorAddressField.getValueAsString();
          System.out.printf("Vendor address: %s, confidence: %.2f%n",
            merchantAddress, vendorAddressField.getConfidence());
        }
      }

      DocumentField customerNameField = invoiceFields.get("CustomerName");
      if (customerNameField != null) {
        if (DocumentFieldType.STRING == customerNameField.getType()) {
          String merchantAddress = customerNameField.getValueAsString();
          System.out.printf("Customer Name: %s, confidence: %.2f%n",
            merchantAddress, customerNameField.getConfidence());
        }
      }

      DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
          String customerAddr = customerAddressRecipientField.getValueAsString();
          System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
            customerAddr, customerAddressRecipientField.getConfidence());
        }
      }

      DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
      if (invoiceIdField != null) {
        if (DocumentFieldType.STRING == invoiceIdField.getType()) {
          String invoiceId = invoiceIdField.getValueAsString();
          System.out.printf("Invoice ID: %s, confidence: %.2f%n",
            invoiceId, invoiceIdField.getConfidence());
        }
      }

      DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
      if (customerNameField != null) {
        if (DocumentFieldType.DATE == invoiceDateField.getType()) {
          LocalDate invoiceDate = invoiceDateField.getValueAsDate();
          System.out.printf("Invoice Date: %s, confidence: %.2f%n",
            invoiceDate, invoiceDateField.getConfidence());
        }
      }

      DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
          Double invoiceTotal = invoiceTotalField.getValueAsDouble();
          System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
            invoiceTotal, invoiceTotalField.getConfidence());
        }
      }

      DocumentField invoiceItemsField = invoiceFields.get("Items");
      if (invoiceItemsField != null) {
        System.out.printf("Invoice Items: %n");
        if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
          List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
          invoiceItems.stream()
            .filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
            .map(documentField -> documentField.getValueAsMap())
            .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {

              // See a full list of fields found on an invoice here:
              // https://aka.ms/formrecognizer/invoicefields

              if ("Description".equals(key)) {
                if (DocumentFieldType.STRING == documentField.getType()) {
                  String name = documentField.getValueAsString();
                  System.out.printf("Description: %s, confidence: %.2fs%n",
                    name, documentField.getConfidence());
                }
              }
              if ("Quantity".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double quantity = documentField.getValueAsDouble();
                  System.out.printf("Quantity: %f, confidence: %.2f%n",
                    quantity, documentField.getConfidence());
                }
              }
              if ("UnitPrice".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double unitPrice = documentField.getValueAsDouble();
                  System.out.printf("Unit Price: %f, confidence: %.2f%n",
                    unitPrice, documentField.getConfidence());
                }
              }
              if ("ProductCode".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double productCode = documentField.getValueAsDouble();
                  System.out.printf("Product Code: %f, confidence: %.2f%n",
                    productCode, documentField.getConfidence());
                }
              }
            }));
        }
      }
    }
  }
}

Générer et exécuter l’application

Après avoir ajouté un exemple de code à votre application, revenez au répertoire de votre projet principal ( doc-intel-app).

  1. Générez votre application avec la build commande :

    gradle build
    
  2. Exécutez votre application avec la run commande :

    gradle run
    

Dans ce guide de démarrage rapide, utilisez les fonctionnalités suivantes pour analyser et extraire des données et des valeurs à partir de formulaires et de documents :

  • Disposition : analysez et extrayez des tableaux, des lignes, des mots et des marques de sélection comme des cases d’option et des cases à cocher dans des documents, sans avoir à entraîner un modèle.

  • Facture prédéfinie : analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle de facture préentraîné.

Conditions préalables

  • abonnement Azure - Créez-en un gratuitement.

  • La dernière version de Visual Studio Code ou votre IDE préféré. Pour plus d’informations, seeNode.js dans Visual Studio Code.

  • La dernière LTS version de Node.js.

  • Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource Document Intelligence à service unique ou à service multiple dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.

    Conseil

    Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.

  • Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :

    Capture d'écran des clés et de l'emplacement de l'endpoint dans le portail Azure.

Configurer

  1. Créez une application express Node.js : dans une fenêtre de console (par exemple, cmd, PowerShell ou Bash), créez et accédez à un répertoire pour votre application nommée doc-intel-app.

    mkdir doc-intel-app && cd doc-intel-app
    
  2. Exécutez la npm init commande pour initialiser l’application et générer une structure de votre projet.

    npm init
    
  3. Spécifiez les attributs de votre projet à l’aide des invites présentées dans le terminal.

    • Les attributs les plus importants sont le nom, le numéro de version et le point d’entrée.
    • Nous vous recommandons de conserver index.js le nom du point d’entrée. La description, la commande de test, le référentiel GitHub, les mots clés, l’auteur et les informations de licence sont des attributs facultatifs. Ils peuvent être ignorés pour ce projet.
    • Acceptez les suggestions entre parenthèses en sélectionnant Retour ou Entrée.
    • Une fois les invites terminées, un fichier package.json sera créé dans votre répertoire doc-intel-app.
  1. Installez la ai-document-intelligence bibliothèque cliente et azure/identity les packages npm :

    npm i @azure-rest/ai-document-intelligence@1.1.0
    

    Le fichier package.json de votre application est mis à jour avec les dépendances.

  1. Installez la ai-form-recognizer bibliothèque cliente et azure/identity les packages npm :

    npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
    
    • Le fichier de l'application package.json est mis à jour avec les dépendances.
  1. Installez la ai-form-recognizer bibliothèque cliente et azure/identity les packages npm :

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. Créez un fichier nommé index.js dans le répertoire de l’application.

    Conseil

    • Vous pouvez créer un fichier à l’aide de PowerShell.
    • Ouvrez une fenêtre PowerShell dans votre répertoire de projet en maintenant la touche Maj enfoncée et en cliquant avec le bouton droit sur le dossier.
    • Tapez la commande suivante New-Item index.js.

Créer votre application

Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentIntelligenceClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentIntelligenceClient avec le AzureKeyCredential et votre Document Intelligence endpoint.

Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentAnalysisClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentAnalysisClient avec le AzureKeyCredential et votre Form Recognizer endpoint.

  1. Ouvrez le fichier index.js dans Visual Studio Code ou votre IDE favori. Copiez et collez l’un des exemples de code suivants dans votre application :

Important

Nous vous recommandons l'authentification Microsoft Entra ID avec les identités gérées pour les ressources Azure pour éviter de stocker les informations d'identification avec vos applications qui s'exécutent dans le cloud.

Utilisez des clés API avec précaution. N’incluez pas la clé API directement dans votre code et ne la publiez jamais publiquement. Si vous utilisez des clés API, stockez-les en toute sécurité dans Azure Key Vault, faites pivoter les clés régulièrement et limitez l’accès aux Azure Key Vault à l’aide du contrôle d’accès en fonction du rôle et des restrictions d’accès réseau. Pour plus d’informations sur l’utilisation sécurisée des clés API dans vos applications, consultez les API avec Azure Key Vault.

Pour plus d’informations sur la sécurité des services d’INTELLIGENCE artificielle, consultez Demandes d’authentification à Azure AI services.

Modèle de disposition

Extrayez le texte, les marques de sélection, les styles textuels, les structures de tableau et les coordonnées des régions englobantes à partir de documents.

  • Pour cet exemple, vous aurez besoin d’un fichier de document à partir d’une URL. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URL du fichier à la formUrl variable en haut du fichier.
  • Pour analyser un fichier donné à partir d’une URL, vous allez utiliser la méthode beginAnalyzeDocuments et transmettre prebuilt-layout comme ID de modèle.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";

// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

async function main() {
  const client = DocumentIntelligence(endpoint, { key });

  const initialResponse = await client
    .path("/documentModels/{modelId}:analyze", "prebuilt-layout")
    .post({
      contentType: "application/json",
      body: {
        urlSource: formUrl
      },
    });

  if (isUnexpected(initialResponse)) {
    throw initialResponse.body.error;
  }

  const poller = getLongRunningPoller(client, initialResponse);
  const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;

  const pages = analyzeResult?.pages;
  const tables = analyzeResult?.tables;

  if (pages && pages.length > 0) {
    console.log("Pages:");
    for (const page of pages) {
      console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
      console.log(`  ${page.width}x${page.height}`);
      console.log(`  ${page.lines?.length || 0} lines, ${page.words?.length || 0} words`);
    }
  } else {
    console.log("No pages were extracted from the document.");
  }

  if (tables && tables.length > 0) {
    console.log("Tables:");
    for (const table of tables) {
      console.log(
        `- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
      );
    }
  } else {
    console.log("No tables were extracted from the document.");
  }
}

main().catch((error) => {
  console.error("An error occurred:", error);
  process.exit(1);
});

Exécuter votre application

Après avoir ajouté un exemple de code à votre application, exécutez votre programme :

  1. Accédez au dossier dans lequel vous disposez de votre application Document Intelligence (doc-intel-app).

  2. Tapez la commande suivante dans votre terminal :

    node index.js
    

Ajoutez l’exemple de code suivant au index.js fichier. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :


 const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");

    // set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
    const key = "<your-key>";
    const endpoint = "<your-endpoint>";

    // sample document
  const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

  async function main() {
    const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-layout", formUrl);

    const {
        pages,
        tables
    } = await poller.pollUntilDone();

    if (pages.length <= 0) {
        console.log("No pages were extracted from the document.");
    } else {
        console.log("Pages:");
        for (const page of pages) {
            console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
            console.log(`  ${page.width}x${page.height}, angle: ${page.angle}`);
            console.log(`  ${page.lines.length} lines, ${page.words.length} words`);
        }
    }

    if (tables.length <= 0) {
        console.log("No tables were extracted from the document.");
    } else {
        console.log("Tables:");
        for (const table of tables) {
            console.log(
                `- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
            );
        }
    }
}

main().catch((error) => {
    console.error("An error occurred:", error);
    process.exit(1);
});

Exécuter votre application

Après avoir ajouté un exemple de code à votre application, exécutez votre programme :

  1. Accédez au dossier dans lequel vous disposez de votre application Document Intelligence (doc-intel-app).

  2. Tapez la commande suivante dans votre terminal :

    node index.js
    

Sortie du modèle de mise en page

Voici un extrait de code de la sortie attendue :

Pages:
- Page 1 (unit: inch)
  8.5x11, angle: 0
  69 lines, 425 words
Tables:
- Extracted table: 3 columns, 5 rows (15 cells)

Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de mise en page.

Modèle prédéfini

Dans cet exemple, nous analysons une facture à l’aide du modèle prédéfini de facture .

Conseil

Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Consultez l’extraction des données du modèle.

  • Analysez une facture à l’aide du modèle prédéfini de facture. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URL du fichier à la invoiceUrl variable en haut du fichier.
  • Pour analyser un fichier donné à un URI, vous allez utiliser la beginAnalyzeDocuments méthode et passer PrebuiltModels.Invoice en tant qu’ID de modèle. La valeur retournée est un result objet contenant des données sur le document soumis.
  • Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas affichées ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";

// sample document
const invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

async function main() {
  const client = DocumentIntelligence(endpoint, { key });

  const initialResponse = await client
    .path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
    .post({
      contentType: "application/json",
      body: {
        urlSource: invoiceUrl,
      },
    });

  if (isUnexpected(initialResponse)) {
    throw initialResponse.body.error;
  }

  const poller = getLongRunningPoller(client, initialResponse);
  const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;

  const documents = analyzeResult?.documents;

  const invoice = documents && documents[0];
  if (!invoice) {
    throw new Error("Expected at least one invoice in the result.");
  }

  console.log(
    "Extracted invoice:",
    invoice.docType,
    `(confidence: ${invoice.confidence || "<undefined>"})`
  );
  console.log("Fields:", invoice.fields);
}

main().catch((error) => {
  console.error("An error occurred:", error);
  process.exit(1);
});

Exécuter votre application

Après avoir ajouté un exemple de code à votre application, exécutez votre programme :

  1. Accédez au dossier dans lequel vous disposez de votre application Document Intelligence (doc-intel-app).

  2. Tapez la commande suivante dans votre terminal :

    node index.js
    

 const {
    AzureKeyCredential,
    DocumentAnalysisClient
} = require("@azure/ai-form-recognizer");

// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

async function main() {
    const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-invoice", invoiceUrl);

    const {
        pages,
        tables
    } = await poller.pollUntilDone();

    if (pages.length <= 0) {
        console.log("No pages were extracted from the document.");
    } else {
        console.log("Pages:");
        for (const page of pages) {
            console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
            console.log(`  ${page.width}x${page.height}, angle: ${page.angle}`);
            console.log(`  ${page.lines.length} lines, ${page.words.length} words`);

            if (page.lines && page.lines.length > 0) {
                console.log("  Lines:");

                for (const line of page.lines) {
                    console.log(`  - "${line.content}"`);

                    // The words of the line can also be iterated independently. The words are computed based on their
                    // corresponding spans.
                    for (const word of line.words()) {
                        console.log(`    - "${word.content}"`);
                    }
                }
            }
        }
    }

    if (tables.length <= 0) {
        console.log("No tables were extracted from the document.");
    } else {
        console.log("Tables:");
        for (const table of tables) {
            console.log(
                `- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
            );
        }
    }
}

main().catch((error) => {
    console.error("An error occurred:", error);
    process.exit(1);
});

Exécuter votre application

Après avoir ajouté un exemple de code à votre application, exécutez votre programme :

  1. Accédez au dossier dans lequel vous disposez de votre application Document Intelligence (doc-intel-app).

  2. Tapez la commande suivante dans votre terminal :

    node index.js
    

Sortie du modèle prédéfini

Voici un extrait de code de la sortie attendue :

  Vendor Name: CONTOSO LTD.
  Customer Name: MICROSOFT CORPORATION
  Invoice Date: 2019-11-15T00:00:00.000Z
  Due Date: 2019-12-15T00:00:00.000Z
  Items:
  - <no product code>
    Description: Test for 23 fields
    Quantity: 1
    Date: undefined
    Unit: undefined
    Unit Price: 1
    Tax: undefined
    Amount: 100

Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples de Azure sur GitHub pour afficher la sortie du modèle de facture prebuilt.

const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");

  // set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
      const key = "<your-key>";
      const endpoint = "<your-endpoint>";
// sample document
    invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

async function main() {
    const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginAnalyzeDocument("prebuilt-invoice", invoiceUrl);

    const {
    documents: [document],
  } = await poller.pollUntilDone();


  if (document) {
    const {
      vendorName,
      customerName,
      invoiceDate,
      dueDate,
      items,
      subTotal,
      previousUnpaidBalance,
      totalTax,
      amountDue,
    } = document.fields;

    // The invoice model has many fields. For details, *see* [Invoice model field extraction](../../prebuilt/invoice.md#field-extraction)
    console.log("Vendor Name:", vendorName && vendorName.value);
    console.log("Customer Name:", customerName && customerName.value);
    console.log("Invoice Date:", invoiceDate && invoiceDate.value);
    console.log("Due Date:", dueDate && dueDate.value);

    console.log("Items:");
    for (const item of (items && items.values) || []) {
      const { productCode, description, quantity, date, unit, unitPrice, tax, amount } =
        item.properties;

      console.log("-", (productCode && productCode.value) || "<no product code>");
      console.log("  Description:", description && description.value);
      console.log("  Quantity:", quantity && quantity.value);
      console.log("  Date:", date && date.value);
      console.log("  Unit:", unit && unit.value);
      console.log("  Unit Price:", unitPrice && unitPrice.value);
      console.log("  Tax:", tax && tax.value);
      console.log("  Amount:", amount && amount.value);
    }

    console.log("Subtotal:", subTotal && subTotal.value);
    console.log("Previous Unpaid Balance:", previousUnpaidBalance && previousUnpaidBalance.value);
    console.log("Tax:", totalTax && totalTax.value);
    console.log("Amount Due:", amountDue && amountDue.value);
  } else {
    throw new Error("Expected at least one receipt in the result.");
  }
}


main().catch((error) => {
    console.error("An error occurred:", error);
    process.exit(1);
});

Exécuter votre application

Après avoir ajouté un exemple de code à votre application, exécutez votre programme :

  1. Accédez au dossier dans lequel vous disposez de votre application Document Intelligence (doc-intel-app).

  2. Tapez la commande suivante dans votre terminal :

    node index.js
    

Dans ce guide de démarrage rapide, utilisez les fonctionnalités suivantes pour analyser et extraire des données à partir de formulaires et de documents :

  • Disposition : analysez et extrayez des tableaux, des lignes, des mots et des marques de sélection comme des cases d’option et des cases à cocher, ainsi que des paires clé-valeur, sans nécessiter d'entraîner un modèle.

  • Facture prédéfinie : analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle préentraîné.

Conditions préalables

  • abonnement Azure - Créez-en un gratuitement.

  • Python 3.7 ou version ultérieure.

    • Votre installation de Python doit inclure pip. Vous pouvez vérifier si pip est installé en exécutant pip --version la ligne de commande. Obtenez pip en installant la dernière version de Python.
  • La dernière version de Visual Studio Code ou votre IDE préféré. Pour plus d’informations, seeGetting Started with Python in Visual Studio Code.

  • Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource Document Intelligence à service unique ou à service multiple dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.

Conseil

Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.

  • Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :

    Capture d'écran des clés et de l'emplacement de l'endpoint dans le portail Azure.

Configurer

Ouvrez une fenêtre de terminal dans votre environnement local et installez la bibliothèque cliente Azure Document Intelligence dans Foundry Tools pour Python avec pip :

pip install azure-ai-documentintelligence==1.0.2

pip install azure-ai-formrecognizer==3.3.0

pip install azure-ai-formrecognizer==3.2.0b6

Créer votre application Python

Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentIntelligenceClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentIntelligenceClient avec le AzureKeyCredential et votre Document Intelligence endpoint.

  1. Créez un fichier Python appelé doc_intel_quickstart.py dans votre éditeur ou IDE préféré.

  2. Ouvrez le fichier doc_intel_quickstart.py et sélectionnez l’un des exemples de code suivants pour copier et coller dans votre application :

Pour interagir avec le service Document Intelligence, vous devez créer une instance de la DocumentAnalysisClient classe. Pour ce faire, vous créez un AzureKeyCredential avec votre key à partir du portail Azure et une instance DocumentAnalysisClient avec le AzureKeyCredential et votre Document Intelligence endpoint.

  1. Créez un fichier Python appelé form_recognizer_quickstart.py dans votre éditeur ou IDE préféré.

  2. Ouvrez le fichier form_recognizer_quickstart.py et sélectionnez l’un des exemples de code suivants pour copier et coller dans votre application :

Important

Nous vous recommandons l'authentification Microsoft Entra ID avec les identités gérées pour les ressources Azure pour éviter de stocker les informations d'identification avec vos applications qui s'exécutent dans le cloud.

Utilisez des clés API avec précaution. N’incluez pas la clé API directement dans votre code et ne la publiez jamais publiquement. Si vous utilisez des clés API, stockez-les en toute sécurité dans Azure Key Vault, faites pivoter les clés régulièrement et limitez l’accès aux Azure Key Vault à l’aide du contrôle d’accès en fonction du rôle et des restrictions d’accès réseau. Pour plus d’informations sur l’utilisation sécurisée des clés API dans vos applications, consultez les API avec Azure Key Vault.

Pour plus d’informations sur la sécurité des services d’INTELLIGENCE artificielle, consultez Demandes d’authentification à Azure AI services.

Modèle de disposition

Extrayez le texte, les marques de sélection, les styles textuels, les structures de tableau et les coordonnées des régions englobantes à partir de documents.

  • Pour cet exemple, vous aurez besoin d’un fichier de document à partir d’une URL. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URL du fichier à la formUrl variable dans la analyze_layout fonction.

Ajoutez l’exemple de code suivant à votre application doc_intel_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :


# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"

# helper functions

def get_words(page, line):
    result = []
    for word in page.words:
        if _in_span(word, line.spans):
            result.append(word)
    return result


def _in_span(word, spans):
    for span in spans:
        if word.span.offset >= span.offset and (
            word.span.offset + word.span.length
        ) <= (span.offset + span.length):
            return True
    return False


def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_intelligence_client = DocumentIntelligenceClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_intelligence_client.begin_analyze_document(
        "prebuilt-layout", AnalyzeDocumentRequest(url_source=formUrl
    ))

    result: AnalyzeResult = poller.result()

    if result.styles and any([style.is_handwritten for style in result.styles]):
        print("Document contains handwritten content")
    else:
        print("Document does not contain handwritten content")

    for page in result.pages:
        print(f"----Analyzing layout from page #{page.page_number}----")
        print(
            f"Page has width: {page.width} and height: {page.height}, measured with unit: {page.unit}"
        )

        if page.lines:
            for line_idx, line in enumerate(page.lines):
                words = get_words(page, line)
                print(
                    f"...Line # {line_idx} has word count {len(words)} and text '{line.content}' "
                    f"within bounding polygon '{line.polygon}'"
                )

                for word in words:
                    print(
                        f"......Word '{word.content}' has a confidence of {word.confidence}"
                    )

        if page.selection_marks:
            for selection_mark in page.selection_marks:
                print(
                    f"Selection mark is '{selection_mark.state}' within bounding polygon "
                    f"'{selection_mark.polygon}' and has a confidence of {selection_mark.confidence}"
                )

    if result.tables:
        for table_idx, table in enumerate(result.tables):
            print(
                f"Table # {table_idx} has {table.row_count} rows and "
                f"{table.column_count} columns"
            )
            if table.bounding_regions:
                for region in table.bounding_regions:
                    print(
                        f"Table # {table_idx} location on page: {region.page_number} is {region.polygon}"
                    )
            for cell in table.cells:
                print(
                    f"...Cell[{cell.row_index}][{cell.column_index}] has text '{cell.content}'"
                )
                if cell.bounding_regions:
                    for region in cell.bounding_regions:
                        print(
                            f"...content on page {region.page_number} is within bounding polygon '{region.polygon}'"
                        )

    print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()

Exécuter l’application

Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :

  1. Accédez au dossier dans lequel vous disposez de votre fichier doc_intel_quickstart.py .

  2. Tapez la commande suivante dans votre terminal :

    python doc_intel_quickstart.py
    

Pour analyser un fichier donné à une URL, utilisez la begin_analyze_document_from_url méthode et passez-le comme prebuilt-layout ID de modèle. La valeur retournée est un result objet contenant des données sur le document soumis.

Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.


# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"

def format_polygon(polygon):
    if not polygon:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])

def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
            "prebuilt-layout", formUrl)
    result = poller.result()

    for idx, style in enumerate(result.styles):
        print(
            "Document contains {} content".format(
                "handwritten" if style.is_handwritten else "no handwritten"
            )
        )

    for page in result.pages:
        print("----Analyzing layout from page #{}----".format(page.page_number))
        print(
            "Page has width: {} and height: {}, measured with unit: {}".format(
                page.width, page.height, page.unit
            )
        )

        for line_idx, line in enumerate(page.lines):
            words = line.get_words()
            print(
                "...Line # {} has word count {} and text '{}' within bounding box '{}'".format(
                    line_idx,
                    len(words),
                    line.content,
                    format_polygon(line.polygon),
                )
            )

            for word in words:
                print(
                    "......Word '{}' has a confidence of {}".format(
                        word.content, word.confidence
                    )
                )

        for selection_mark in page.selection_marks:
            print(
                "...Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
                    selection_mark.state,
                    format_polygon(selection_mark.polygon),
                    selection_mark.confidence,
                )
            )

    for table_idx, table in enumerate(result.tables):
        print(
            "Table # {} has {} rows and {} columns".format(
                table_idx, table.row_count, table.column_count
            )
        )
        for region in table.bounding_regions:
            print(
                "Table # {} location on page: {} is {}".format(
                    table_idx,
                    region.page_number,
                    format_polygon(region.polygon),
                )
            )
        for cell in table.cells:
            print(
                "...Cell[{}][{}] has content '{}'".format(
                    cell.row_index,
                    cell.column_index,
                    cell.content,
                )
            )
            for region in cell.bounding_regions:
                print(
                    "...content on page {} is within bounding box '{}'".format(
                        region.page_number,
                        format_polygon(region.polygon),
                    )
                )

    print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()

Exécuter l’application

Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :

  1. Accédez au dossier dans lequel vous disposez de votre fichier form_recognizer_quickstart.py .

  2. Tapez la commande suivante dans votre terminal :

    python form_recognizer_quickstart.py
    

Sortie du modèle de mise en page

Voici un extrait de code de la sortie attendue :

  ----Analyzing layout from page #1----
  Page has width: 8.5 and height: 11.0, measured with unit: inch
  ...Line # 0 has word count 2 and text 'UNITED STATES' within bounding box '[3.4915, 0.6828], [5.0116, 0.6828], [5.0116, 0.8265], [3.4915, 0.8265]'
  ......Word 'UNITED' has a confidence of 1.0
  ......Word 'STATES' has a confidence of 1.0
  ...Line # 1 has word count 4 and text 'SECURITIES AND EXCHANGE COMMISSION' within bounding box '[2.1937, 0.9061], [6.297, 0.9061], [6.297, 1.0498], [2.1937, 1.0498]'
  ......Word 'SECURITIES' has a confidence of 1.0
  ......Word 'AND' has a confidence of 1.0
  ......Word 'EXCHANGE' has a confidence of 1.0
  ......Word 'COMMISSION' has a confidence of 1.0
  ...Line # 2 has word count 3 and text 'Washington, D.C. 20549' within bounding box '[3.4629, 1.1179], [5.031, 1.1179], [5.031, 1.2483], [3.4629, 1.2483]'
  ......Word 'Washington,' has a confidence of 1.0
  ......Word 'D.C.' has a confidence of 1.0

Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples Azure sur GitHub pour afficher la sortie du modèle de mise en page.

Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.


# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"


def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-layout", formUrl
    )
    result = poller.result()

    for idx, style in enumerate(result.styles):
        print(
            "Document contains {} content".format(
                "handwritten" if style.is_handwritten else "no handwritten"
            )
        )

    for page in result.pages:
        print("----Analyzing layout from page #{}----".format(page.page_number))
        print(
            "Page has width: {} and height: {}, measured with unit: {}".format(
                page.width, page.height, page.unit
            )
        )

        for line_idx, line in enumerate(page.lines):
            words = line.get_words()
            print(
                "...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
                    line_idx,
                    len(words),
                    line.content,
                    format_polygon(line.polygon),
                )
            )

            for word in words:
                print(
                    "......Word '{}' has a confidence of {}".format(
                        word.content, word.confidence
                    )
                )

        for selection_mark in page.selection_marks:
            print(
                "...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
                    selection_mark.state,
                    format_polygon(selection_mark.polygon),
                    selection_mark.confidence,
                )
            )

    for table_idx, table in enumerate(result.tables):
        print(
            "Table # {} has {} rows and {} columns".format(
                table_idx, table.row_count, table.column_count
            )
        )
        for region in table.bounding_regions:
            print(
                "Table # {} location on page: {} is {}".format(
                    table_idx,
                    region.page_number,
                    format_polygon(region.polygon),
                )
            )
        for cell in table.cells:
            print(
                "...Cell[{}][{}] has content '{}'".format(
                    cell.row_index,
                    cell.column_index,
                    cell.content,
                )
            )
            for region in cell.bounding_regions:
                print(
                    "...content on page {} is within bounding polygon '{}'".format(
                        region.page_number,
                        format_polygon(region.polygon),
                    )
                )

    print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()


Exécuter l’application

Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :

  1. Accédez au dossier dans lequel vous disposez de votre fichier form_recognizer_quickstart.py .

  2. Tapez la commande suivante dans votre terminal :

    python form_recognizer_quickstart.py
    

Modèle prédéfini

Analysez et extrayez des champs communs à partir de types de documents spécifiques à l’aide d’un modèle prédéfini. Dans cet exemple, nous analysons une facture à l’aide du modèle prédéfini de facture .

Conseil

Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Consultez l’extraction des données du modèle.

  • Analysez une facture à l’aide du modèle prédéfini de facture. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URL du fichier à la invoiceUrl variable en haut du fichier.
  • Par souci de simplicité, toutes les paires clé-valeur retournées par le service ne sont pas affichées ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .

Ajoutez l’exemple de code suivant à votre application doc_intel_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de votre instance Document Intelligence du portail Azure :


# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest



# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"

def analyze_invoice():
    # sample document

    invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

    document_intelligence_client = DocumentIntelligenceClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_intelligence_client.begin_analyze_document(
        "prebuilt-invoice", AnalyzeDocumentRequest(url_source=invoiceUrl)
    )
    invoices = poller.result()

    if invoices.documents:
        for idx, invoice in enumerate(invoices.documents):
            print(f"--------Analyzing invoice #{idx + 1}--------")
            vendor_name = invoice.fields.get("VendorName")
            if vendor_name:
                print(
                    f"Vendor Name: {vendor_name.get('content')} has confidence: {vendor_name.get('confidence')}"
                )
            vendor_address = invoice.fields.get("VendorAddress")
            if vendor_address:
                print(
                    f"Vendor Address: {vendor_address.get('content')} has confidence: {vendor_address.get('confidence')}"
                )
            vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
            if vendor_address_recipient:
                print(
                    f"Vendor Address Recipient: {vendor_address_recipient.get('content')} has confidence: {vendor_address_recipient.get('confidence')}"
                )
            customer_name = invoice.fields.get("CustomerName")
            if customer_name:
                print(
                    f"Customer Name: {customer_name.get('content')} has confidence: {customer_name.get('confidence')}"
                )
            customer_id = invoice.fields.get("CustomerId")
            if customer_id:
                print(
                    f"Customer Id: {customer_id.get('content')} has confidence: {customer_id.get('confidence')}"
                )
            customer_address = invoice.fields.get("CustomerAddress")
            if customer_address:
                print(
                    f"Customer Address: {customer_address.get('content')} has confidence: {customer_address.get('confidence')}"
                )
            customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
            if customer_address_recipient:
                print(
                    f"Customer Address Recipient: {customer_address_recipient.get('content')} has confidence: {customer_address_recipient.get('confidence')}"
                )
            invoice_id = invoice.fields.get("InvoiceId")
            if invoice_id:
                print(
                    f"Invoice Id: {invoice_id.get('content')} has confidence: {invoice_id.get('confidence')}"
                )
            invoice_date = invoice.fields.get("InvoiceDate")
            if invoice_date:
                print(
                    f"Invoice Date: {invoice_date.get('content')} has confidence: {invoice_date.get('confidence')}"
                )
            invoice_total = invoice.fields.get("InvoiceTotal")
            if invoice_total:
                print(
                    f"Invoice Total: {invoice_total.get('content')} has confidence: {invoice_total.get('confidence')}"
                )
            due_date = invoice.fields.get("DueDate")
            if due_date:
                print(
                    f"Due Date: {due_date.get('content')} has confidence: {due_date.get('confidence')}"
                )
            purchase_order = invoice.fields.get("PurchaseOrder")
            if purchase_order:
                print(
                    f"Purchase Order: {purchase_order.get('content')} has confidence: {purchase_order.get('confidence')}"
                )
            billing_address = invoice.fields.get("BillingAddress")
            if billing_address:
                print(
                    f"Billing Address: {billing_address.get('content')} has confidence: {billing_address.get('confidence')}"
                )
            billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
            if billing_address_recipient:
                print(
                    f"Billing Address Recipient: {billing_address_recipient.get('content')} has confidence: {billing_address_recipient.get('confidence')}"
                )
            shipping_address = invoice.fields.get("ShippingAddress")
            if shipping_address:
                print(
                    f"Shipping Address: {shipping_address.get('content')} has confidence: {shipping_address.get('confidence')}"
                )
            shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
            if shipping_address_recipient:
                print(
                    f"Shipping Address Recipient: {shipping_address_recipient.get('content')} has confidence: {shipping_address_recipient.get('confidence')}"
                )
            print("Invoice items:")
            for idx, item in enumerate(invoice.fields.get("Items").get("valueArray")):
                print(f"...Item #{idx + 1}")
                item_description = item.get("valueObject").get("Description")
                if item_description:
                    print(
                        f"......Description: {item_description.get('content')} has confidence: {item_description.get('confidence')}"
                    )
                item_quantity = item.get("valueObject").get("Quantity")
                if item_quantity:
                    print(
                        f"......Quantity: {item_quantity.get('content')} has confidence: {item_quantity.get('confidence')}"
                    )
                unit = item.get("valueObject").get("Unit")
                if unit:
                    print(
                        f"......Unit: {unit.get('content')} has confidence: {unit.get('confidence')}"
                    )
                unit_price = item.get("valueObject").get("UnitPrice")
                if unit_price:
                    unit_price_code = (
                        unit_price.get("valueCurrency").get("currencyCode")
                        if unit_price.get("valueCurrency").get("currencyCode")
                        else ""
                    )
                    print(
                        f"......Unit Price: {unit_price.get('content')}{unit_price_code} has confidence: {unit_price.get('confidence')}"
                    )
                product_code = item.get("valueObject").get("ProductCode")
                if product_code:
                    print(
                        f"......Product Code: {product_code.get('content')} has confidence: {product_code.get('confidence')}"
                    )
                item_date = item.get("valueObject").get("Date")
                if item_date:
                    print(
                        f"......Date: {item_date.get('content')} has confidence: {item_date.get('confidence')}"
                    )
                tax = item.get("valueObject").get("Tax")
                if tax:
                    print(
                        f"......Tax: {tax.get('content')} has confidence: {tax.get('confidence')}"
                    )
                amount = item.get("valueObject").get("Amount")
                if amount:
                    print(
                        f"......Amount: {amount.get('content')} has confidence: {amount.get('confidence')}"
                    )
            subtotal = invoice.fields.get("SubTotal")
            if subtotal:
                print(
                    f"Subtotal: {subtotal.get('content')} has confidence: {subtotal.get('confidence')}"
                )
            total_tax = invoice.fields.get("TotalTax")
            if total_tax:
                print(
                    f"Total Tax: {total_tax.get('content')} has confidence: {total_tax.get('confidence')}"
                )
            previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
            if previous_unpaid_balance:
                print(
                    f"Previous Unpaid Balance: {previous_unpaid_balance.get('content')} has confidence: {previous_unpaid_balance.get('confidence')}"
                )
            amount_due = invoice.fields.get("AmountDue")
            if amount_due:
                print(
                    f"Amount Due: {amount_due.get('content')} has confidence: {amount_due.get('confidence')}"
                )
            service_start_date = invoice.fields.get("ServiceStartDate")
            if service_start_date:
                print(
                    f"Service Start Date: {service_start_date.get('content')} has confidence: {service_start_date.get('confidence')}"
                )
            service_end_date = invoice.fields.get("ServiceEndDate")
            if service_end_date:
                print(
                    f"Service End Date: {service_end_date.get('content')} has confidence: {service_end_date.get('confidence')}"
                )
            service_address = invoice.fields.get("ServiceAddress")
            if service_address:
                print(
                    f"Service Address: {service_address.get('content')} has confidence: {service_address.get('confidence')}"
                )
            service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
            if service_address_recipient:
                print(
                    f"Service Address Recipient: {service_address_recipient.get('content')} has confidence: {service_address_recipient.get('confidence')}"
                )
            remittance_address = invoice.fields.get("RemittanceAddress")
            if remittance_address:
                print(
                    f"Remittance Address: {remittance_address.get('content')} has confidence: {remittance_address.get('confidence')}"
                )
            remittance_address_recipient = invoice.fields.get(
                "RemittanceAddressRecipient"
            )
            if remittance_address_recipient:
                print(
                    f"Remittance Address Recipient: {remittance_address_recipient.get('content')} has confidence: {remittance_address_recipient.get('confidence')}"
                )

            print("----------------------------------------")


if __name__ == "__main__":
    analyze_invoice()


Exécuter l’application

Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :

  1. Accédez au dossier dans lequel vous disposez de votre fichier doc_intel_quickstart.py .

  2. Tapez la commande suivante dans votre terminal :

    python doc_intel_quickstart.py
    

Pour analyser un fichier donné à un URI, utilisez la begin_analyze_document_from_url méthode et passez prebuilt-invoice comme ID de modèle. La valeur retournée est un result objet contenant des données sur le document soumis.

Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.

# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"


def format_bounding_region(bounding_regions):
    if not bounding_regions:
        return "N/A"
    return ", ".join(
        "Page #{}: {}".format(region.page_number, format_polygon(region.polygon))
        for region in bounding_regions
    )


def format_polygon(polygon):
    if not polygon:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])


def analyze_invoice():

    invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-invoice", invoiceUrl
    )
    invoices = poller.result()

    for idx, invoice in enumerate(invoices.documents):
        print("--------Recognizing invoice #{}--------".format(idx + 1))
        vendor_name = invoice.fields.get("VendorName")
        if vendor_name:
            print(
                "Vendor Name: {} has confidence: {}".format(
                    vendor_name.value, vendor_name.confidence
                )
            )
        vendor_address = invoice.fields.get("VendorAddress")
        if vendor_address:
            print(
                "Vendor Address: {} has confidence: {}".format(
                    vendor_address.value, vendor_address.confidence
                )
            )
        vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
        if vendor_address_recipient:
            print(
                "Vendor Address Recipient: {} has confidence: {}".format(
                    vendor_address_recipient.value, vendor_address_recipient.confidence
                )
            )
        customer_name = invoice.fields.get("CustomerName")
        if customer_name:
            print(
                "Customer Name: {} has confidence: {}".format(
                    customer_name.value, customer_name.confidence
                )
            )
        customer_id = invoice.fields.get("CustomerId")
        if customer_id:
            print(
                "Customer Id: {} has confidence: {}".format(
                    customer_id.value, customer_id.confidence
                )
            )
        customer_address = invoice.fields.get("CustomerAddress")
        if customer_address:
            print(
                "Customer Address: {} has confidence: {}".format(
                    customer_address.value, customer_address.confidence
                )
            )
        customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
        if customer_address_recipient:
            print(
                "Customer Address Recipient: {} has confidence: {}".format(
                    customer_address_recipient.value,
                    customer_address_recipient.confidence,
                )
            )
        invoice_id = invoice.fields.get("InvoiceId")
        if invoice_id:
            print(
                "Invoice Id: {} has confidence: {}".format(
                    invoice_id.value, invoice_id.confidence
                )
            )
        invoice_date = invoice.fields.get("InvoiceDate")
        if invoice_date:
            print(
                "Invoice Date: {} has confidence: {}".format(
                    invoice_date.value, invoice_date.confidence
                )
            )
        invoice_total = invoice.fields.get("InvoiceTotal")
        if invoice_total:
            print(
                "Invoice Total: {} has confidence: {}".format(
                    invoice_total.value, invoice_total.confidence
                )
            )
        due_date = invoice.fields.get("DueDate")
        if due_date:
            print(
                "Due Date: {} has confidence: {}".format(
                    due_date.value, due_date.confidence
                )
            )
        purchase_order = invoice.fields.get("PurchaseOrder")
        if purchase_order:
            print(
                "Purchase Order: {} has confidence: {}".format(
                    purchase_order.value, purchase_order.confidence
                )
            )
        billing_address = invoice.fields.get("BillingAddress")
        if billing_address:
            print(
                "Billing Address: {} has confidence: {}".format(
                    billing_address.value, billing_address.confidence
                )
            )
        billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
        if billing_address_recipient:
            print(
                "Billing Address Recipient: {} has confidence: {}".format(
                    billing_address_recipient.value,
                    billing_address_recipient.confidence,
                )
            )
        shipping_address = invoice.fields.get("ShippingAddress")
        if shipping_address:
            print(
                "Shipping Address: {} has confidence: {}".format(
                    shipping_address.value, shipping_address.confidence
                )
            )
        shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
        if shipping_address_recipient:
            print(
                "Shipping Address Recipient: {} has confidence: {}".format(
                    shipping_address_recipient.value,
                    shipping_address_recipient.confidence,
                )
            )
        print("Invoice items:")
        for idx, item in enumerate(invoice.fields.get("Items").value):
            print("...Item #{}".format(idx + 1))
            item_description = item.value.get("Description")
            if item_description:
                print(
                    "......Description: {} has confidence: {}".format(
                        item_description.value, item_description.confidence
                    )
                )
            item_quantity = item.value.get("Quantity")
            if item_quantity:
                print(
                    "......Quantity: {} has confidence: {}".format(
                        item_quantity.value, item_quantity.confidence
                    )
                )
            unit = item.value.get("Unit")
            if unit:
                print(
                    "......Unit: {} has confidence: {}".format(
                        unit.value, unit.confidence
                    )
                )
            unit_price = item.value.get("UnitPrice")
            if unit_price:
                print(
                    "......Unit Price: {} has confidence: {}".format(
                        unit_price.value, unit_price.confidence
                    )
                )
            product_code = item.value.get("ProductCode")
            if product_code:
                print(
                    "......Product Code: {} has confidence: {}".format(
                        product_code.value, product_code.confidence
                    )
                )
            item_date = item.value.get("Date")
            if item_date:
                print(
                    "......Date: {} has confidence: {}".format(
                        item_date.value, item_date.confidence
                    )
                )
            tax = item.value.get("Tax")
            if tax:
                print(
                    "......Tax: {} has confidence: {}".format(tax.value, tax.confidence)
                )
            amount = item.value.get("Amount")
            if amount:
                print(
                    "......Amount: {} has confidence: {}".format(
                        amount.value, amount.confidence
                    )
                )
        subtotal = invoice.fields.get("SubTotal")
        if subtotal:
            print(
                "Subtotal: {} has confidence: {}".format(
                    subtotal.value, subtotal.confidence
                )
            )
        total_tax = invoice.fields.get("TotalTax")
        if total_tax:
            print(
                "Total Tax: {} has confidence: {}".format(
                    total_tax.value, total_tax.confidence
                )
            )
        previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
        if previous_unpaid_balance:
            print(
                "Previous Unpaid Balance: {} has confidence: {}".format(
                    previous_unpaid_balance.value, previous_unpaid_balance.confidence
                )
            )
        amount_due = invoice.fields.get("AmountDue")
        if amount_due:
            print(
                "Amount Due: {} has confidence: {}".format(
                    amount_due.value, amount_due.confidence
                )
            )
        service_start_date = invoice.fields.get("ServiceStartDate")
        if service_start_date:
            print(
                "Service Start Date: {} has confidence: {}".format(
                    service_start_date.value, service_start_date.confidence
                )
            )
        service_end_date = invoice.fields.get("ServiceEndDate")
        if service_end_date:
            print(
                "Service End Date: {} has confidence: {}".format(
                    service_end_date.value, service_end_date.confidence
                )
            )
        service_address = invoice.fields.get("ServiceAddress")
        if service_address:
            print(
                "Service Address: {} has confidence: {}".format(
                    service_address.value, service_address.confidence
                )
            )
        service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
        if service_address_recipient:
            print(
                "Service Address Recipient: {} has confidence: {}".format(
                    service_address_recipient.value,
                    service_address_recipient.confidence,
                )
            )
        remittance_address = invoice.fields.get("RemittanceAddress")
        if remittance_address:
            print(
                "Remittance Address: {} has confidence: {}".format(
                    remittance_address.value, remittance_address.confidence
                )
            )
        remittance_address_recipient = invoice.fields.get("RemittanceAddressRecipient")
        if remittance_address_recipient:
            print(
                "Remittance Address Recipient: {} has confidence: {}".format(
                    remittance_address_recipient.value,
                    remittance_address_recipient.confidence,
                )
            )

        print("----------------------------------------")

if __name__ == "__main__":
    analyze_invoice()


Exécuter l’application

Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :

  1. Accédez au dossier dans lequel vous disposez de votre fichier form_recognizer_quickstart.py .

  2. Tapez la commande suivante dans votre terminal :

    python form_recognizer_quickstart.py
    

Sortie du modèle prédéfini

Voici un extrait de code de la sortie attendue :

  --------Recognizing invoice #1--------
  Vendor Name: CONTOSO LTD. has confidence: 0.919
  Vendor Address: 123 456th St New York, NY, 10001 has confidence: 0.907
  Vendor Address Recipient: Contoso Headquarters has confidence: 0.919
  Customer Name: MICROSOFT CORPORATION has confidence: 0.84
  Customer Id: CID-12345 has confidence: 0.956
  Customer Address: 123 Other St, Redmond WA, 98052 has confidence: 0.909
  Customer Address Recipient: Microsoft Corp has confidence: 0.917
  Invoice Id: INV-100 has confidence: 0.972
  Invoice Date: 2019-11-15 has confidence: 0.971
  Invoice Total: CurrencyValue(amount=110.0, symbol=$) has confidence: 0.97
  Due Date: 2019-12-15 has confidence: 0.973

Pour afficher l’intégralité de la sortie, visitez le référentiel d’exemples de Azure sur GitHub pour afficher la sortie du modèle de facture prebuilt.

Ajoutez l’exemple de code suivant à votre application form_recognizer_quickstart.py. Veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs à partir de l’instance Form Recognizer de votre portail Azure.


# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"


def format_polygon(polygon):
    if not polygon:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])


def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-layout", formUrl
    )
    result = poller.result()

    for idx, style in enumerate(result.styles):
        print(
            "Document contains {} content".format(
                "handwritten" if style.is_handwritten else "no handwritten"
            )
        )


for page in result.pages:
    print("----Analyzing layout from page #{}----".format(page.page_number))
    print(
        "Page has width: {} and height: {}, measured with unit: {}".format(
            page.width, page.height, page.unit
        )
    )

    for line_idx, line in enumerate(page.lines):
        words = line.get_words()
        print(
            "...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
                line_idx,
                len(words),
                line.content,
                format_polygon(line.polygon),
            )
        )

        for word in words:
            print(
                "......Word '{}' has a confidence of {}".format(
                    word.content, word.confidence
                )
            )

    for selection_mark in page.selection_marks:
        print(
            "...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
                selection_mark.state,
                format_polygon(selection_mark.polygon),
                selection_mark.confidence,
            )
        )

for table_idx, table in enumerate(result.tables):
    print(
        "Table # {} has {} rows and {} columns".format(
            table_idx, table.row_count, table.column_count
        )
    )
    for region in table.bounding_regions:
        print(
            "Table # {} location on page: {} is {}".format(
                table_idx,
                region.page_number,
                format_polygon(region.polygon),
            )
        )
    for cell in table.cells:
        print(
            "...Cell[{}][{}] has content '{}'".format(
                cell.row_index,
                cell.column_index,
                cell.content,
            )
        )
        for region in cell.bounding_regions:
            print(
                "...content on page {} is within bounding polygon '{}'".format(
                    region.page_number,
                    format_polygon(region.polygon),
                )
            )

print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()


Exécuter l’application

Après avoir ajouté un exemple de code à votre application, générez et exécutez votre programme :

  1. Accédez au dossier dans lequel vous disposez de votre fichier form_recognizer_quickstart.py .

  2. Tapez la commande suivante dans votre terminal :

    python form_recognizer_quickstart.py
    

Dans ce guide de démarrage rapide, découvrez comment utiliser l’API REST Document Intelligence pour analyser et extraire des données et des valeurs à partir de documents :

Conditions préalables

  • Abonnement Azure - Créez-en un gratuitement

  • L'outil en ligne de commande cURL installé.

  • PowerShell version 7.*+ (ou une application de ligne de commande similaire.) :

  • Pour vérifier votre version de PowerShell, tapez la commande suivante par rapport à votre système d’exploitation :

    • Windows : Get-Host | Select-Object Version
    • macOS ou Linux : $PSVersionTable
  • Ressource Document Intelligence (mono-service) ou Foundry Tools (multi-services). Une fois que vous avez votre abonnement Azure, créez une ressource Document Intelligence à service unique ou à service multiple dans le portail Azure pour obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.

Conseil

Créez une ressource Microsoft Foundry si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison/clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Vous avez besoin d’une ressource à service unique si vous envisagez d’utiliser l’authentification Microsoft Entra.

  • Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :

    Capture d'écran des clés et de l'emplacement de l'endpoint dans le portail Azure.

Analyser des documents et obtenir des résultats

Une requête POST est utilisée pour analyser des documents avec un modèle prédéfini ou personnalisé. Une requête GET est utilisée pour récupérer le résultat d’un appel d’analyse de document. Il modelId est utilisé avec POST et resultId avec les opérations GET.

Analyser le document (demande POST)

Avant d’exécuter la commande cURL, apportez les modifications suivantes à la demande de publication :

  1. Remplacez {endpoint} par la valeur du point de terminaison de votre instance Document Intelligence du portail Azure.

  2. Remplacez {key} par la valeur de clé de votre instance Document Intelligence du portail Azure.

  3. En utilisant le tableau suivant comme référence, remplacez {modelID} et {your-document-url} par vos valeurs souhaitées.

  4. Vous avez besoin d’un fichier de document à l’URL. Pour ce guide de démarrage rapide, vous pouvez utiliser les exemples de formulaires fournis dans le tableau suivant pour chaque fonctionnalité :

Exemples de documents

Fonctionnalité {modelID} {your-document-url}
Lire prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Disposition prebuilt-layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Carte d’assurance maladie prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
W-2 prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Facture prebuilt-invoice https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Reçu prebuilt-receipt https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Document d’ID prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

Exemples de documents

Fonctionnalité {modelID} {your-document-url}
Document général prebuilt-document https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Lire prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Disposition prebuilt-layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Carte d’assurance maladie prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
W-2 prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Facture prebuilt-invoice https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Reçu prebuilt-receipt https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Document d’ID prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png
Carte de visite prebuilt-businessCard https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg

Important

N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultezSécurité des outils Foundry.

Requête POST

curl -v -i -X POST "{endpoint}/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-11-30" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelID}:analyze?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelId}:analyze?api-version=2022-08-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"

Réponse POST (resultID)

Vous recevez une 202 (Success) réponse qui inclut un en-tête Operation-Location en lecture seule. La valeur de cet en-tête contient un resultID qui peut être interrogé pour obtenir l’état de l’opération asynchrone et récupérer les résultats à l’aide d’une requête GET avec la même clé d’abonnement à la ressource :

{alt-text}

Obtenir les résultats d’analyse (requête GET)

Après avoir appelé l’API Analyze document , appelez l’API Obtenir le résultat d’analyse pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez ces modifications :

Après avoir appelé l’API Analyze document , appelez l’API Obtenir le résultat d’analyse pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez ces modifications :

Après avoir appelé l’API Analyze document , appelez l’API Obtenir le résultat d’analyse pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez ces modifications :

  1. Remplacez l'en-tête Operation-Location de la réponse POST.

  2. Remplacez {key} par la valeur de clé de votre instance Document Intelligence dans le portail Azure.

Requête GET

curl -v -X GET "{endpoint}/documentintelligence/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2024-11-30" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2023-07-31" -H "Ocp-Apim-Subscription-Key: {key}"

curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2022-08-31" -H "Ocp-Apim-Subscription-Key: {key}"

Examiner la réponse

Vous recevez une réponse 200 (Success) avec une sortie JSON. Le premier champ, "status"indique l’état de l’opération. Si l’opération n’est pas terminée, la valeur est "status""running" ou "notStarted", et vous devez appeler à nouveau l’API, manuellement ou via un script. Nous vous recommandons de respecter un intervalle d'une seconde ou plus entre les appels.

Exemple de réponse pour la facture prédéfinie

{
    "status": "succeeded",
    "createdDateTime": "2024-03-25T19:31:37Z",
    "lastUpdatedDateTime": "2024-03-25T19:31:43Z",
    "analyzeResult": {
        "apiVersion": "2024-11-30",
        "modelId": "prebuilt-invoice",
        "stringIndexType": "textElements"...
    ..."pages": [
            {
                "pageNumber": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "words": [
                    {
                        "content": "CONTOSO",
                        "boundingBox": [
                            0.5911,
                            0.6857,
                            1.7451,
                            0.6857,
                            1.7451,
                            0.8664,
                            0.5911,
                            0.8664
                        ],
                        "confidence": 1,
                        "span": {
                            "offset": 0,
                            "length": 7
                                }
                      }],
              }]
      }
}
{
    "status": "succeeded",
    "createdDateTime": "2023-08-25T19:31:37Z",
    "lastUpdatedDateTime": "2023-08-25T19:31:43Z",
    "analyzeResult": {
        "apiVersion": "2023-07-31",
        "modelId": "prebuilt-invoice",
        "stringIndexType": "textElements"...
    ..."pages": [
            {
                "pageNumber": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "words": [
                    {
                        "content": "CONTOSO",
                        "boundingBox": [
                            0.5911,
                            0.6857,
                            1.7451,
                            0.6857,
                            1.7451,
                            0.8664,
                            0.5911,
                            0.8664
                        ],
                        "confidence": 1,
                        "span": {
                            "offset": 0,
                            "length": 7
                                }
                      }],
              }]
      }
}
{
    "status": "succeeded",
    "createdDateTime": "2022-09-25T19:31:37Z",
    "lastUpdatedDateTime": "2022-09-25T19:31:43Z",
    "analyzeResult": {
        "apiVersion": "2022-08-31",
        "modelId": "prebuilt-invoice",
        "stringIndexType": "textElements"...
    ..."pages": [
            {
                "pageNumber": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "words": [
                    {
                        "content": "CONTOSO",
                        "boundingBox": [
                            0.5911,
                            0.6857,
                            1.7451,
                            0.6857,
                            1.7451,
                            0.8664,
                            0.5911,
                            0.8664
                        ],
                        "confidence": 1,
                        "span": {
                            "offset": 0,
                            "length": 7
                                }
                      }],
              }]
      }
}

Champs de document pris en charge

Les modèles prédéfinis extraient des ensembles prédéfinis de champs de document. Consultez l’extraction des données de modèle pour obtenir des noms de champs, des types, des descriptions et des exemples extraits.

C’est ça, félicitations !

Dans ce guide de démarrage rapide, vous avez utilisé un modèle Document Intelligence pour analyser différents formulaires et documents. Ensuite, explorez Document Intelligence Studio et consultez la documentation de référence pour en savoir plus sur l’API Document Intelligence.

Étapes suivantes

Ce contenu s’applique à :red-checkmarkv2.1 | Dernière version :blue-checkmarkv4.0 (GA)

Commencez à utiliser Azure Document Intelligence à l’aide du langage de programmation de votre choix ou de l’API REST. Document Intelligence est un service Foundry Tools basé sur le cloud qui utilise le Machine Learning pour extraire des paires clé-valeur, du texte et des tables à partir de vos documents. Nous vous recommandons d’utiliser le service gratuit lorsque vous apprenez la technologie. N’oubliez pas que le nombre de pages gratuites est limité à 500 par mois.

Pour en savoir plus sur les fonctionnalités et les options de développement Document Intelligence, consultez notre page Vue d’ensemble .

Documentation de référence | Code source de la bibliothèque | Package (NuGet) | Exemples

Dans ce guide de démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées à partir de formulaires et de documents :

Conditions préalables

  • abonnement Azure - Créez-en un gratuitement.

  • Version actuelle de IDE Visual Studio.

  • Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource de Document Intelligence à service unique ou multi-service dans le portail Azure afin d'obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.

    Conseil

    Créez une ressource de fonderie si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison ou clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Notez que vous aurez besoin d'une ressource à service unique si vous envisagez d'utiliser l'authentification Microsoft Entra.

  • Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :

    Capture d'écran des clés et de l'emplacement de l'endpoint dans le portail Azure.

Configurer

  1. Commencez Visual Studio 2019.

  2. Dans la page de démarrage, choisissez Créer un projet.

    Capture d'écran de la fenêtre de démarrage de Visual Studio.

  3. Dans la page Créer un projet, entrez la console dans la zone de recherche. Choisissez le modèle d’application console , puis choisissez Suivant.

    Capture d'écran de la page de création de projet de Visual Studio.

  4. Dans la fenêtre de boîte de dialogue Configurer votre nouvelle boîte de dialogue project, entrez formRecognizer_quickstart dans la zone nom du Project. Ensuite, choisissez Suivant.

    Capture d’écran de la fenêtre de boîte de dialogue Configurer un nouveau projet dans Visual Studios.

  5. Dans la fenêtre de dialogue Additional information, sélectionnez .NET 5.0 (Actuel), puis sélectionnez Create.

    Capture d'écran de la fenêtre de dialogue d'informations supplémentaires de Visual Studio.

Installer la bibliothèque cliente avec NuGet

  1. Cliquez avec le bouton droit sur votre projet formRecognizer_quickstart , puis sélectionnez Gérer les packages NuGet... .

    Capture d’écran montrant la fenêtre sélectionner le package NuGet.

  2. Sélectionnez l’onglet Parcourir et tapez Azure. IA. FormRecognizer.

    Capture d’écran montrant le menu déroulant pour sélectionner l'ensemble Document Intelligence.

  3. Sélectionnez la version 3.1.1 dans le menu déroulant, puis sélectionnez Installer.

Créer votre application

Pour interagir avec le service Document Intelligence, vous devez créer une instance de la FormRecognizerClient classe. Pour ce faire, vous créez un AzureKeyCredential associé à votre clé et une instance FormRecognizerClient avec le AzureKeyCredential et votre Document Intelligence endpoint.

Note

  • À compter de .NET 6, de nouveaux projets utilisant le modèle 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 using globales ou des directives using implicites.
  • Pour plus d’informations, consultezLes nouveaux modèles C# génèrent des instructions de niveau supérieur.
  1. Ouvrez le fichier Program.cs .

  2. Incluez les directives using suivantes :

using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
  1. Définissez vos variables d’environnement endpoint et key, puis créez votre instance AzureKeyCredential et FormRecognizerClient.
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);
  1. Supprimez la ligne, Console.Writeline("Hello World!"); et ajoutez l’un des exemples de code Try It au fichier Program.cs :

    Capture d’écran de l’ajout de l’exemple de code à la méthode Main.

  2. Sélectionnez un exemple de code à copier et coller dans la méthode Main de votre application :

Important

N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultez l’article de sécurité des outils Foundry.

Essayez-le : modèle de disposition

Extrayez du texte, des marques de sélection, des styles de texte et des structures de tableau, ainsi que leurs coordonnées de région englobante à partir de documents.

  • Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URI du fichier à la formUri variable.
  • Pour extraire la disposition à partir d’un fichier donné à un URI, utilisez la StartRecognizeContentFromUriAsync méthode.

Ajoutez le code suivant à votre application de disposition dans le fichier Program.cs :


FormRecognizerClient recognizerClient = AuthenticateClient();

Task recognizeContent = RecognizeContent(recognizerClient);
Task.WaitAll(recognizeContent);

private static FormRecognizerClient AuthenticateClient()
            {
                var credential = new AzureKeyCredential(key);
                var client = new FormRecognizerClient(new Uri(endpoint), credential);
                return client;
            }

            private static async Task RecognizeContent(FormRecognizerClient recognizerClient)
        {
            string formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
            FormPageCollection formPages = await recognizerClient
        .StartRecognizeContentFromUri(new Uri(formUrl))
        .WaitForCompletionAsync();

            foreach (FormPage page in formPages)
            {
                Console.WriteLine($"Form Page {page.PageNumber} has {page.Lines.Count} lines.");

                for (int i = 0; i < page.Lines.Count; i++)
                {
                    FormLine line = page.Lines[i];
                    Console.WriteLine($"    Line {i} has {line.Words.Count} word{(line.Words.Count > 1 ? "s" : "")}, and text: '{line.Text}'.");
                }

                for (int i = 0; i < page.Tables.Count; i++)
                {
                    FormTable table = page.Tables[i];
                    Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
                    foreach (FormTableCell cell in table.Cells)
                    {
                        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) contains text: '{cell.Text}'.");
                    }
                }
            }
        }
    }
}

Essayez-le : modèle prédéfini

Cet exemple montre comment analyser des données de certains types de documents communs avec des modèles préentraînés, à l’aide d’une facture comme exemple.

  • Pour cet exemple, nous allons analyser un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur de l’URI de fichier à la invoiceUri variable en haut de la méthode Main.
  • Pour analyser un fichier donné à un URI, utilisez la StartRecognizeInvoicesFromUriAsync méthode.
  • Par souci de simplicité, tous les champs retournés par le service ne sont pas affichés ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .

Choisir un modèle prédéfini

Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération d’analyse dépend du type de document à analyser. Voici les modèles prédéfinis actuellement pris en charge par le service Document Intelligence :

  • Facture : extrait le texte, les marques de sélection, les tables, les champs et les informations clés des factures.
  • Reçu: extrait le texte et les informations clés des reçus.
  • Document d’identification : extrait le texte et les informations clés des permis de conduire et des passeports internationaux.
  • Carte de visite : extrait le texte et les informations clés des cartes de visite.

Ajoutez le code suivant à votre application de facturation préétablie dans la méthode du fichier Program.cs

FormRecognizerClient recognizerClient = AuthenticateClient();

  Task analyzeinvoice = AnalyzeInvoice(recognizerClient, invoiceUrl);
  Task.WaitAll(analyzeinvoice);

   private static FormRecognizerClient AuthenticateClient() {
     var credential = new AzureKeyCredential(key);
     var client = new FormRecognizerClient(new Uri(endpoint), credential);
     return client;
   }

   static string invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

   private static async Task AnalyzeInvoice(FormRecognizerClient recognizerClient, string invoiceUrl) {
     var options = new RecognizeInvoicesOptions() {
       Locale = "en-US"
     };
     RecognizedFormCollection invoices = await recognizerClient.StartRecognizeInvoicesFromUriAsync(new Uri(invoiceUrl), options).WaitForCompletionAsync();

     RecognizedForm invoice = invoices[0];

     FormField invoiceIdField;
     if (invoice.Fields.TryGetValue("InvoiceId", out invoiceIdField)) {
       if (invoiceIdField.Value.ValueType == FieldValueType.String) {
         string invoiceId = invoiceIdField.Value.AsString();
         Console.WriteLine($"    Invoice Id: '{invoiceId}', with confidence {invoiceIdField.Confidence}");
       }
     }

     FormField invoiceDateField;
     if (invoice.Fields.TryGetValue("InvoiceDate", out invoiceDateField)) {
       if (invoiceDateField.Value.ValueType == FieldValueType.Date) {
         DateTime invoiceDate = invoiceDateField.Value.AsDate();
         Console.WriteLine($"    Invoice Date: '{invoiceDate}', with confidence {invoiceDateField.Confidence}");
       }
     }

     FormField dueDateField;
     if (invoice.Fields.TryGetValue("DueDate", out dueDateField)) {
       if (dueDateField.Value.ValueType == FieldValueType.Date) {
         DateTime dueDate = dueDateField.Value.AsDate();
         Console.WriteLine($"    Due Date: '{dueDate}', with confidence {dueDateField.Confidence}");
       }
     }

     FormField vendorNameField;
     if (invoice.Fields.TryGetValue("VendorName", out vendorNameField)) {
       if (vendorNameField.Value.ValueType == FieldValueType.String) {
         string vendorName = vendorNameField.Value.AsString();
         Console.WriteLine($"    Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
       }
     }

     FormField vendorAddressField;
     if (invoice.Fields.TryGetValue("VendorAddress", out vendorAddressField)) {
       if (vendorAddressField.Value.ValueType == FieldValueType.String) {
         string vendorAddress = vendorAddressField.Value.AsString();
         Console.WriteLine($"    Vendor Address: '{vendorAddress}', with confidence {vendorAddressField.Confidence}");
       }
     }

     FormField customerNameField;
     if (invoice.Fields.TryGetValue("CustomerName", out customerNameField)) {
       if (customerNameField.Value.ValueType == FieldValueType.String) {
         string customerName = customerNameField.Value.AsString();
         Console.WriteLine($"    Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
       }
     }

     FormField customerAddressField;
     if (invoice.Fields.TryGetValue("CustomerAddress", out customerAddressField)) {
       if (customerAddressField.Value.ValueType == FieldValueType.String) {
         string customerAddress = customerAddressField.Value.AsString();
         Console.WriteLine($"    Customer Address: '{customerAddress}', with confidence {customerAddressField.Confidence}");
       }
     }

     FormField customerAddressRecipientField;
     if (invoice.Fields.TryGetValue("CustomerAddressRecipient", out customerAddressRecipientField)) {
       if (customerAddressRecipientField.Value.ValueType == FieldValueType.String) {
         string customerAddressRecipient = customerAddressRecipientField.Value.AsString();
         Console.WriteLine($"    Customer address recipient: '{customerAddressRecipient}', with confidence {customerAddressRecipientField.Confidence}");
       }
     }

     FormField invoiceTotalField;
     if (invoice.Fields.TryGetValue("InvoiceTotal", out invoiceTotalField)) {
       if (invoiceTotalField.Value.ValueType == FieldValueType.Float) {
         float invoiceTotal = invoiceTotalField.Value.AsFloat();
         Console.WriteLine($"    Invoice Total: '{invoiceTotal}', with confidence {invoiceTotalField.Confidence}");
       }
     }
   }
 }
}

Exécuter votre application

Choisissez le bouton Démarrer vert en regard de formRecognizer_quickstart pour générer et exécuter votre programme, ou appuyez sur F5.

Capture d'écran de l'exécution de votre programme Visual Studio.

Documentation de référence | Code source de la bibliothèque | Package (Maven) | Exemples

Dans ce guide de démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées à partir de formulaires et de documents :

Conditions préalables

  • abonnement Azure - Créez-en un gratuitement.

  • Un kit de développement Java (JDK) version 8 ou ultérieure. Pour plus d’informations, voirles versions de Java prises en charge et le calendrier des mises à jour.

  • Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource de Document Intelligence à service unique ou multi-service dans le portail Azure afin d'obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.

  • Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :

    Capture d'écran des clés et de l'emplacement de l'endpoint dans le portail Azure.

Configurer

Créer un projet Gradle

Dans une fenêtre de console (par exemple, cmd, PowerShell ou Bash), créez un répertoire pour votre application appelée form-recognizer-app, puis accédez-y.

mkdir form-recognizer-app && form-recognizer-app
  1. Exécutez la gradle init commande à partir de votre répertoire de travail. Cette commande crée des fichiers de build essentiels pour Gradle, notamment build.gradle.kts, qui est utilisé lors de l’exécution pour créer et configurer votre application.

    gradle init --type basic
    
  2. Lorsque vous êtes invité à choisir une DSL, sélectionnez Kotlin.

  3. Accepter le nom du projet par défaut (form-recognizer-app)

Installer la bibliothèque cliente

Ce guide de démarrage rapide utilise le gestionnaire de dépendances Gradle. Vous trouverez la bibliothèque cliente et les informations pour d’autres gestionnaires de dépendances sur le référentiel central Maven.

Dans le fichier build.gradle.kts de votre projet, incluez la bibliothèque cliente en tant qu’instruction implementation , ainsi que les plug-ins et paramètres requis.

plugins {
    java
    application
}
application {
    mainClass.set("FormRecognizer")
}
repositories {
    mavenCentral()
}
dependencies {
    implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}

Créer un fichier Java

À partir de votre répertoire de travail, exécutez la commande suivante :

mkdir -p src/main/java

Vous créez la structure de répertoires suivante :

Screenshot de la structure de répertoires Java de l'application.

Accédez au répertoire Java et créez un fichier appelé FormRecognizer.java. Ouvrez-le dans votre éditeur ou IDE préféré et ajoutez la déclaration de package suivante et les instructions import.

import com.azure.ai.formrecognizer.*;
import com.azure.ai.formrecognizer.models.*;

import java.util.concurrent.atomic.AtomicReference;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.Context;
import com.azure.core.util.polling.SyncPoller;

Sélectionnez un exemple de code à copier et coller dans la méthode principale de votre application :

Important

N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultezSécurité des outils Foundry.

Essayez-le : modèle de disposition

Extrayez du texte, des marques de sélection, des styles de texte et des structures de tableau, ainsi que leurs coordonnées de région englobante à partir de documents.

  • Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
  • Pour analyser un fichier donné à un URI, vous allez utiliser la beginRecognizeContentFromUrl méthode.
  • Nous avons ajouté la valeur d’URI de fichier à la formUrl variable dans la méthode principale.

Mettez à jour la classe FormRecognizer de votre application, avec le code suivant (veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs de votre instance Document Intelligence du portail Azure) :


static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";

public static void main(String[] args) {FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder()
                .credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();

    String formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";

    System.out.println("Get form content...");
        GetContent(recognizerClient, formUrl);
  }
    private static void GetContent(FormRecognizerClient recognizerClient, String invoiceUri) {
        String analyzeFilePath = invoiceUri;
        SyncPoller<FormRecognizerOperationResult, List<FormPage>> recognizeContentPoller = recognizerClient
                .beginRecognizeContentFromUrl(analyzeFilePath);

        List<FormPage> contentResult = recognizeContentPoller.getFinalResult();
        // </snippet_getcontent_call>
        // <snippet_getcontent_print>
        contentResult.forEach(formPage -> {
            // Table information
            System.out.println("----Recognizing content ----");
            System.out.printf("Has width: %f and height: %f, measured with unit: %s.%n", formPage.getWidth(),
                    formPage.getHeight(), formPage.getUnit());
            formPage.getTables().forEach(formTable -> {
                System.out.printf("Table has %d rows and %d columns.%n", formTable.getRowCount(),
                        formTable.getColumnCount());
                formTable.getCells().forEach(formTableCell -> {
                    System.out.printf("Cell has text %s.%n", formTableCell.getText());
                });
                System.out.println();
            });
        });
    }

Essayez-le : modèle prédéfini

Cet exemple montre comment analyser des données de certains types de documents communs avec des modèles préentraînés, à l’aide d’une facture comme exemple.

  • Pour cet exemple, nous allons analyser un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
  • Pour analyser un fichier donné à une URI, vous utiliserez le beginRecognizeInvoicesFromUrl.
  • Nous avons ajouté la valeur d’URI de fichier à la invoiceUrl variable dans la méthode principale.
  • Par souci de simplicité, tous les champs retournés par le service ne sont pas affichés ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .

Choisir un modèle prédéfini

Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Voici les modèles prédéfinis actuellement pris en charge par le service Document Intelligence :

  • Facture : extrait le texte, les marques de sélection, les tables, les champs et les informations clés des factures.
  • Reçu: extrait le texte et les informations clés des reçus.
  • Document d’identification : extrait le texte et les informations clés des permis de conduire et des passeports internationaux.
  • Carte de visite : extrait le texte et les informations clés des cartes de visite.

Mettez à jour la classe FormRecognizer de votre application, avec le code suivant (veillez à mettre à jour les variables de clé et de point de terminaison avec des valeurs de votre instance Document Intelligence du portail Azure) :


static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";

public static void main(String[] args) {
    FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder().credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();

    String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

    System.out.println("Analyze invoice...");
        AnalyzeInvoice(recognizerClient, invoiceUrl);
  }
    private static void AnalyzeInvoice(FormRecognizerClient recognizerClient, String invoiceUrl) {
      SyncPoller < FormRecognizerOperationResult,
        List < RecognizedForm >> recognizeInvoicesPoller = recognizerClient.beginRecognizeInvoicesFromUrl(invoiceUrl);
      List < RecognizedForm > recognizedInvoices = recognizeInvoicesPoller.getFinalResult();

      for (int i = 0; i < recognizedInvoices.size(); i++) {
        RecognizedForm recognizedInvoice = recognizedInvoices.get(i);
        Map < String,
        FormField > recognizedFields = recognizedInvoice.getFields();
        System.out.printf("----------- Recognized invoice info for page %d -----------%n", i);
        FormField vendorNameField = recognizedFields.get("VendorName");
        if (vendorNameField != null) {
            if (FieldValueType.STRING == vendorNameField.getValue().getValueType()) {
                String merchantName = vendorNameField.getValue().asString();
                System.out.printf("Vendor Name: %s, confidence: %.2f%n", merchantName, vendorNameField.getConfidence());
            }
        }

        FormField vendorAddressField = recognizedFields.get("VendorAddress");
        if (vendorAddressField != null) {
            if (FieldValueType.STRING == vendorAddressField.getValue().getValueType()) {
                String merchantAddress = vendorAddressField.getValue().asString();
                System.out.printf("Vendor address: %s, confidence: %.2f%n", merchantAddress, vendorAddressField.getConfidence());
            }
        }

        FormField customerNameField = recognizedFields.get("CustomerName");
        if (customerNameField != null) {
            if (FieldValueType.STRING == customerNameField.getValue().getValueType()) {
                String merchantAddress = customerNameField.getValue().asString();
                System.out.printf("Customer Name: %s, confidence: %.2f%n", merchantAddress, customerNameField.getConfidence());
            }
        }

        FormField customerAddressRecipientField = recognizedFields.get("CustomerAddressRecipient");
        if (customerAddressRecipientField != null) {
            if (FieldValueType.STRING == customerAddressRecipientField.getValue().getValueType()) {
                String customerAddr = customerAddressRecipientField.getValue().asString();
                System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n", customerAddr, customerAddressRecipientField.getConfidence());
            }
        }

        FormField invoiceIdField = recognizedFields.get("InvoiceId");
        if (invoiceIdField != null) {
            if (FieldValueType.STRING == invoiceIdField.getValue().getValueType()) {
                String invoiceId = invoiceIdField.getValue().asString();
                System.out.printf("Invoice Id: %s, confidence: %.2f%n", invoiceId, invoiceIdField.getConfidence());
            }
        }

        FormField invoiceDateField = recognizedFields.get("InvoiceDate");
        if (customerNameField != null) {
            if (FieldValueType.DATE == invoiceDateField.getValue().getValueType()) {
                LocalDate invoiceDate = invoiceDateField.getValue().asDate();
                System.out.printf("Invoice Date: %s, confidence: %.2f%n", invoiceDate, invoiceDateField.getConfidence());
            }
        }

        FormField invoiceTotalField = recognizedFields.get("InvoiceTotal");
        if (customerAddressRecipientField != null) {
            if (FieldValueType.FLOAT == invoiceTotalField.getValue().getValueType()) {
                Float invoiceTotal = invoiceTotalField.getValue().asFloat();
                System.out.printf("Invoice Total: %.2f, confidence: %.2f%n", invoiceTotal, invoiceTotalField.getConfidence());
            }
        }
    }
}

Générer et exécuter votre application

Revenez au répertoire de votre projet principal : form-recognizer-app.

  1. Générez votre application avec la build commande :
gradle build
  1. Exécutez votre application avec la run commande :
gradle run

Documentation de référence | Code source de la bibliothèque | Paquet (npm) | Exemples

Dans ce guide de démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées à partir de formulaires et de documents :

Conditions préalables

  • abonnement Azure - Créez-en un gratuitement.

  • La dernière version de Visual Studio Code ou votre IDE préféré.

  • La dernière LTS version de Node.js

  • Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource de Document Intelligence à service unique ou multi-service dans le portail Azure afin d'obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.

    Conseil

    Créez une ressource de fonderie si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison ou clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Notez que vous aurez besoin d'une ressource à service unique si vous envisagez d'utiliser l'authentification Microsoft Entra.

  • Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :

    Capture d'écran des clés et de l'emplacement de l'endpoint dans le portail Azure.

Configurer

  1. Créez une application Node.js. Dans une fenêtre de console (par exemple, cmd, PowerShell ou Bash), créez un répertoire pour votre application et accédez-y.

    mkdir form-recognizer-app && cd form-recognizer-app
    
  2. Exécutez la npm init commande pour créer une application de nœud avec un package.json fichier.

    npm init
    
  3. Installez le package npm de la ai-form-recognizer bibliothèque cliente :

    npm install @azure/ai-form-recognizer
    

    Le fichier de l'application package.json est mis à jour avec les dépendances.

  4. Créez un fichier nommé index.js, ouvrez-le et importez les bibliothèques suivantes :

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. 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";
    
  6. À ce stade, votre application JavaScript doit contenir les lignes de code suivantes :

    
    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    

Sélectionnez un exemple de code à copier et coller dans votre application :

Important

N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultezSécurité des outils Foundry.

Essayez-le : modèle de disposition

  • Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URI du fichier à la formUrl variable en haut du fichier.
  • Pour analyser un fichier donné à un URI, vous allez utiliser la beginRecognizeContent méthode.

Ajoutez le code suivant à votre application de disposition sur la ligne située sous la key variable

const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

async function recognizeContent() {
    const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));
    const poller = await client.beginRecognizeContentFromUrl(formUrl);
    const pages = await poller.pollUntilDone();

    if (!pages || pages.length === 0) {
        throw new Error("Expecting non-empty list of pages!");
    }

    for (const page of pages) {
        console.log(
            `Page ${page.pageNumber}: width ${page.width} and height ${page.height} with unit ${page.unit}`
        );
        for (const table of page.tables) {
            for (const cell of table.cells) {
                console.log(`cell [${cell.rowIndex},${cell.columnIndex}] has text ${cell.text}`);
            }
        }
    }
}

recognizeContent().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Essayez-le : modèle prédéfini

Cet exemple montre comment analyser des données de certains types de documents communs avec des modèles préentraînés, à l’aide d’une facture comme exemple. Consultez notre page de concept prédéfinie pour obtenir la liste complète des champs de facture

  • Pour cet exemple, nous allons analyser un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URI du fichier à la invoiceUrl variable en haut du fichier.
  • Pour analyser un fichier donné à un URI, vous allez utiliser la beginRecognizeInvoices méthode.
  • Par souci de simplicité, tous les champs retournés par le service ne sont pas affichés ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .

Choisir un modèle prédéfini

Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Voici les modèles prédéfinis actuellement pris en charge par le service Document Intelligence :

  • Facture : extrait le texte, les marques de sélection, les tables, les champs et les informations clés des factures.
  • Reçu: extrait le texte et les informations clés des reçus.
  • Document d’identification : extrait le texte et les informations clés des permis de conduire et des passeports internationaux.
  • Carte de visite : extrait le texte et les informations clés des cartes de visite.

Ajoutez le code suivant à votre application de facture prédéfinie sous la key variable


const invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

async function recognizeInvoices() {

    const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginRecognizeInvoicesFromUrl(invoiceUrl);
    const [invoice] = await poller.pollUntilDone();

    if (invoice === undefined) {
        throw new Error("Failed to extract data from at least one invoice.");
    }

    /**
     * This is a helper function for printing a simple field with an elemental type.
     */
    function fieldToString(field) {
        const {
            name,
            valueType,
            value,
            confidence
        } = field;
        return `${name} (${valueType}): '${value}' with confidence ${confidence}'`;
    }

    console.log("Invoice fields:");

    /**
     * Invoices contain a lot of optional fields, but they are all of elemental types
     * such as strings, numbers, and dates, so we will just enumerate them all.
     */
    for (const [name, field] of Object.entries(invoice.fields)) {
        if (field.valueType !== "array" && field.valueType !== "object") {
            console.log(`- ${name} ${fieldToString(field)}`);
        }
    }

    // Invoices also support nested line items, so we can iterate over them.
    let idx = 0;

    console.log("- Items:");

    const items = invoice.fields["Items"]?.value;
    for (const item of items ?? []) {
        const value = item.value;

        // Each item has several subfields that are nested within the item. We'll
        // map over this list of the subfields and filter out any fields that
        // weren't found. Not all fields will be returned every time, only those
        // that the service identified for the particular document in question.

        const subFields = [
                "Description",
                "Quantity",
                "Unit",
                "UnitPrice",
                "ProductCode",
                "Date",
                "Tax",
                "Amount"
            ]
            .map((fieldName) => value[fieldName])
            .filter((field) => field !== undefined);

        console.log(
            [
                `  - Item #${idx}`,
                // Now we will convert those fields into strings to display
                ...subFields.map((field) => `    - ${fieldToString(field)}`)
            ].join("\n")
        );
    }
}

recognizeInvoices().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Documentation de référence | Code source de la bibliothèque | Package (PyPi) | Exemples

Dans ce guide de démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées à partir de formulaires et de documents :

Conditions préalables

  • Abonnement Azure - Créez-en un gratuitement

  • Python 3.x

    • Votre installation de Python doit inclure pip. Vous pouvez vérifier si pip est installé en exécutant pip --version la ligne de commande. Obtenez pip en installant la dernière version de Python.
  • Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource de Document Intelligence à service unique ou multi-service dans le portail Azure afin d'obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.

    Conseil

    Créez une ressource de fonderie si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison ou clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Notez que vous aurez besoin d'une ressource à service unique si vous envisagez d'utiliser l'authentification Microsoft Entra.

  • Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :

    Capture d'écran des clés et de l'emplacement de l'endpoint dans le portail Azure.

Configurer

Ouvrez une fenêtre de terminal dans votre environnement local et installez la bibliothèque cliente Azure Document Intelligence dans Foundry Tools pour Python avec pip :

pip install azure-ai-formrecognizer

Créer une application Python

Créez une application Python appelée form_recognizer_quickstart.py dans votre éditeur ou IDE préféré. Importez ensuite les bibliothèques suivantes :

import os
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential

Créer des variables pour le point de terminaison et la clé de votre ressource Azure

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

À ce stade, votre application Python doit contenir les lignes de code suivantes :

import os
from azure.core.exceptions import ResourceNotFoundError
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

Sélectionnez un exemple de code à copier et coller dans votre application :

Important

N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultezSécurité des outils Foundry.

Essayez-le : modèle de disposition

  • Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URI du fichier à la formUrl variable en haut du fichier.
  • Pour analyser un fichier donné à un URI, vous allez utiliser la begin_recognize_content_from_url méthode.

Ajoutez le code suivant à votre application de disposition sur la ligne située sous la key variable


  def format_bounding_box(bounding_box):
    if not bounding_box:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in bounding_box])

 def recognize_content():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    form_recognizer_client = FormRecognizerClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = form_recognizer_client.begin_recognize_content_from_url(formUrl)
    form_pages = poller.result()

    for idx, content in enumerate(form_pages):
        print(
            "Page has width: {} and height: {}, measured with unit: {}".format(
                content.width, content.height, content.unit
            )
        )
        for table_idx, table in enumerate(content.tables):
            print(
                "Table # {} has {} rows and {} columns".format(
                    table_idx, table.row_count, table.column_count
                )
            )
            print(
                "Table # {} location on page: {}".format(
                    table_idx, format_bounding_box(table.bounding_box)
                )
            )
            for cell in table.cells:
                print(
                    "...Cell[{}][{}] has text '{}' within bounding box '{}'".format(
                        cell.row_index,
                        cell.column_index,
                        cell.text,
                        format_bounding_box(cell.bounding_box),
                    )
                )

        for line_idx, line in enumerate(content.lines):
            print(
                "Line # {} has word count '{}' and text '{}' within bounding box '{}'".format(
                    line_idx,
                    len(line.words),
                    line.text,
                    format_bounding_box(line.bounding_box),
                )
            )
            if line.appearance:
                if (
                    line.appearance.style_name == "handwriting"
                    and line.appearance.style_confidence > 0.8
                ):
                    print(
                        "Text line '{}' is handwritten and might be a signature.".format(
                            line.text
                        )
                    )
            for word in line.words:
                print(
                    "...Word '{}' has a confidence of {}".format(
                        word.text, word.confidence
                    )
                )

        for selection_mark in content.selection_marks:
            print(
                "Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
                    selection_mark.state,
                    format_bounding_box(selection_mark.bounding_box),
                    selection_mark.confidence,
                )
            )
        print("----------------------------------------")


if __name__ == "__main__":
    recognize_content()

Essayez-le : modèle prédéfini

Cet exemple montre comment analyser des données de certains types de documents communs avec des modèles préentraînés, à l’aide d’une facture comme exemple. Consultez notre page de concept prédéfinie pour obtenir la liste complète des champs de facture

  • Pour cet exemple, nous allons analyser un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.
  • Nous avons ajouté la valeur d’URI du fichier à la variable « formUrl » en haut du fichier.
  • Pour analyser un fichier à une URI donnée, utilisez la méthode `begin_recognize_invoices_from_url`.
  • Par souci de simplicité, tous les champs retournés par le service ne sont pas affichés ici. Pour afficher la liste de tous les champs et types correspondants pris en charge, consultez notre page concept de facture .

Choisir un modèle prédéfini

Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Voici les modèles prédéfinis actuellement pris en charge par le service Document Intelligence :

  • Facture : extrait le texte, les marques de sélection, les tables, les champs et les informations clés des factures.
  • Reçu: extrait le texte et les informations clés des reçus.
  • Document d’identification : extrait le texte et les informations clés des permis de conduire et des passeports internationaux.
  • Carte de visite : extrait le texte et les informations clés des cartes de visite.

Ajoutez le code suivant à votre application de facture prédéfinie sous la key variable


def recognize_invoice():

    invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

    form_recognizer_client = FormRecognizerClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = form_recognizer_client.begin_recognize_invoices_from_url(
        invoiceUrl, locale="en-US"
    )
    invoices = poller.result()

    for idx, invoice in enumerate(invoices):
        vendor_name = invoice.fields.get("VendorName")
        if vendor_name:
            print(
                "Vendor Name: {} has confidence: {}".format(
                    vendor_name.value, vendor_name.confidence
                )
            )
        vendor_address = invoice.fields.get("VendorAddress")
        if vendor_address:
            print(
                "Vendor Address: {} has confidence: {}".format(
                    vendor_address.value, vendor_address.confidence
                )
            )
        vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
        if vendor_address_recipient:
            print(
                "Vendor Address Recipient: {} has confidence: {}".format(
                    vendor_address_recipient.value, vendor_address_recipient.confidence
                )
            )
        customer_name = invoice.fields.get("CustomerName")
        if customer_name:
            print(
                "Customer Name: {} has confidence: {}".format(
                    customer_name.value, customer_name.confidence
                )
            )
        customer_id = invoice.fields.get("CustomerId")
        if customer_id:
            print(
                "Customer Id: {} has confidence: {}".format(
                    customer_id.value, customer_id.confidence
                )
            )
        customer_address = invoice.fields.get("CustomerAddress")
        if customer_address:
            print(
                "Customer Address: {} has confidence: {}".format(
                    customer_address.value, customer_address.confidence
                )
            )
        customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
        if customer_address_recipient:
            print(
                "Customer Address Recipient: {} has confidence: {}".format(
                    customer_address_recipient.value,
                    customer_address_recipient.confidence,
                )
            )
        invoice_id = invoice.fields.get("InvoiceId")
        if invoice_id:
            print(
                "Invoice Id: {} has confidence: {}".format(
                    invoice_id.value, invoice_id.confidence
                )
            )
        invoice_date = invoice.fields.get("InvoiceDate")
        if invoice_date:
            print(
                "Invoice Date: {} has confidence: {}".format(
                    invoice_date.value, invoice_date.confidence
                )
            )
        invoice_total = invoice.fields.get("InvoiceTotal")
        if invoice_total:
            print(
                "Invoice Total: {} has confidence: {}".format(
                    invoice_total.value, invoice_total.confidence
                )
            )
        due_date = invoice.fields.get("DueDate")
        if due_date:
            print(
                "Due Date: {} has confidence: {}".format(
                    due_date.value, due_date.confidence
                )
            )
        purchase_order = invoice.fields.get("PurchaseOrder")
        if purchase_order:
            print(
                "Purchase Order: {} has confidence: {}".format(
                    purchase_order.value, purchase_order.confidence
                )
            )
        billing_address = invoice.fields.get("BillingAddress")
        if billing_address:
            print(
                "Billing Address: {} has confidence: {}".format(
                    billing_address.value, billing_address.confidence
                )
            )
        billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
        if billing_address_recipient:
            print(
                "Billing Address Recipient: {} has confidence: {}".format(
                    billing_address_recipient.value,
                    billing_address_recipient.confidence,
                )
            )
        shipping_address = invoice.fields.get("ShippingAddress")
        if shipping_address:
            print(
                "Shipping Address: {} has confidence: {}".format(
                    shipping_address.value, shipping_address.confidence
                )
            )
        shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
        if shipping_address_recipient:
            print(
                "Shipping Address Recipient: {} has confidence: {}".format(
                    shipping_address_recipient.value,
                    shipping_address_recipient.confidence,
                )
            )
        print("Invoice items:")
        for idx, item in enumerate(invoice.fields.get("Items").value):
            item_description = item.value.get("Description")
            if item_description:
                print(
                    "......Description: {} has confidence: {}".format(
                        item_description.value, item_description.confidence
                    )
                )
            item_quantity = item.value.get("Quantity")
            if item_quantity:
                print(
                    "......Quantity: {} has confidence: {}".format(
                        item_quantity.value, item_quantity.confidence
                    )
                )
            unit = item.value.get("Unit")
            if unit:
                print(
                    "......Unit: {} has confidence: {}".format(
                        unit.value, unit.confidence
                    )
                )
            unit_price = item.value.get("UnitPrice")
            if unit_price:
                print(
                    "......Unit Price: {} has confidence: {}".format(
                        unit_price.value, unit_price.confidence
                    )
                )
            product_code = item.value.get("ProductCode")
            if product_code:
                print(
                    "......Product Code: {} has confidence: {}".format(
                        product_code.value, product_code.confidence
                    )
                )
            item_date = item.value.get("Date")
            if item_date:
                print(
                    "......Date: {} has confidence: {}".format(
                        item_date.value, item_date.confidence
                    )
                )
            tax = item.value.get("Tax")
            if tax:
                print(
                    "......Tax: {} has confidence: {}".format(tax.value, tax.confidence)
                )
            amount = item.value.get("Amount")
            if amount:
                print(
                    "......Amount: {} has confidence: {}".format(
                        amount.value, amount.confidence
                    )
                )
        subtotal = invoice.fields.get("SubTotal")
        if subtotal:
            print(
                "Subtotal: {} has confidence: {}".format(
                    subtotal.value, subtotal.confidence
                )
            )
        total_tax = invoice.fields.get("TotalTax")
        if total_tax:
            print(
                "Total Tax: {} has confidence: {}".format(
                    total_tax.value, total_tax.confidence
                )
            )
        previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
        if previous_unpaid_balance:
            print(
                "Previous Unpaid Balance: {} has confidence: {}".format(
                    previous_unpaid_balance.value, previous_unpaid_balance.confidence
                )
            )
        amount_due = invoice.fields.get("AmountDue")
        if amount_due:
            print(
                "Amount Due: {} has confidence: {}".format(
                    amount_due.value, amount_due.confidence
                )
            )
        service_start_date = invoice.fields.get("ServiceStartDate")
        if service_start_date:
            print(
                "Service Start Date: {} has confidence: {}".format(
                    service_start_date.value, service_start_date.confidence
                )
            )
        service_end_date = invoice.fields.get("ServiceEndDate")
        if service_end_date:
            print(
                "Service End Date: {} has confidence: {}".format(
                    service_end_date.value, service_end_date.confidence
                )
            )
        service_address = invoice.fields.get("ServiceAddress")
        if service_address:
            print(
                "Service Address: {} has confidence: {}".format(
                    service_address.value, service_address.confidence
                )
            )
        service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
        if service_address_recipient:
            print(
                "Service Address Recipient: {} has confidence: {}".format(
                    service_address_recipient.value,
                    service_address_recipient.confidence,
                )
            )
        remittance_address = invoice.fields.get("RemittanceAddress")
        if remittance_address:
            print(
                "Remittance Address: {} has confidence: {}".format(
                    remittance_address.value, remittance_address.confidence
                )
            )
        remittance_address_recipient = invoice.fields.get("RemittanceAddressRecipient")
        if remittance_address_recipient:
            print(
                "Remittance Address Recipient: {} has confidence: {}".format(
                    remittance_address_recipient.value,
                    remittance_address_recipient.confidence,
                )
            )


if __name__ == "__main__":
    recognize_invoice()

Exécuter votre application

  1. Accédez au dossier dans lequel vous disposez de votre fichier form_recognizer_quickstart.py .

  2. Tapez la commande suivante dans votre terminal :

python form_recognizer_quickstart.py

API REST | Document Intelligence | Référence de l'API REST Azure |

Dans ce guide de démarrage rapide, vous utilisez les API suivantes pour extraire des données structurées à partir de formulaires et de documents :

Conditions préalables

  • Abonnement Azure - Créez-en un gratuitement

  • cURL installé.

  • PowerShell version 6.0+, ou une application de ligne de commande similaire.

  • Ressource pour Outils Foundry ou Intelligence Documentaire. Une fois que vous avez votre abonnement Azure, créez une ressource de Document Intelligence à service unique ou multi-service dans le portail Azure afin d'obtenir votre clé et votre point de terminaison. Vous pouvez utiliser le niveau tarifaire gratuit (F0) pour essayer le service et effectuer une mise à niveau ultérieure vers un niveau payant pour la production.

    Conseil

    Créez une ressource de fonderie si vous envisagez d’accéder à plusieurs outils Foundry sous un seul point de terminaison ou clé. Pour l’accès à Document Intelligence uniquement, créez une ressource Document Intelligence. Notez que vous aurez besoin d'une ressource à service unique si vous envisagez d'utiliser l'authentification Microsoft Entra.

  • Une fois votre ressource déployée, sélectionnez Accéder à la ressource. Vous avez besoin de la clé et du point de terminaison à partir de la ressource que vous créez pour connecter votre application à l’API Document Intelligence. Vous collez votre clé et votre point de terminaison dans le code plus loin dans le guide de démarrage rapide :

    Capture d'écran des clés et de l'emplacement de l'endpoint dans le portail Azure.

Sélectionnez un exemple de code à copier et coller dans votre application :

Important

N’oubliez pas de supprimer la clé de votre code lorsque vous avez terminé, et ne la publiez jamais publiquement. Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations, consultezSécurité des outils Foundry.

Essayez-le : modèle de disposition

  • Pour cet exemple, vous aurez besoin d’un fichier de document dans un URI. Vous pouvez utiliser notre document sample pour ce guide de démarrage rapide.
  1. Remplacez {endpoint} par le point de terminaison que vous avez obtenu par votre abonnement Document Intelligence.
  2. Remplacez {key} par la clé que vous avez copiée à l’étape précédente.
  3. Remplacez par \"{your-document-url} un exemple d’URL de document :
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf

Demande

curl -v -i POST "https://{endpoint}/formrecognizer/v2.1/layout/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{​​​​​​​'urlSource': '{your-document-url}'}​​​​​​​​"

Operation-Location

Vous recevez une 202 (Success) réponse qui inclut un en-tête "Operation-Location" . La valeur de cet en-tête contient un ID de résultat que vous pouvez utiliser pour interroger l’état de l’opération asynchrone et obtenir les résultats :

https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.

Dans l’exemple suivant, dans le cadre de l’URL, la chaîne après analyzeResults/ est l’ID de résultat.

https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Obtenir les résultats de mise en page

Après avoir appelé l’API Analyze Layout , vous appelez l’API Get Analyze Layout Result pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez ces modifications :

  1. Remplacez {endpoint} par le point de terminaison que vous avez obtenu par votre abonnement Document Intelligence.
  2. Remplacez {key} par la clé que vous avez copiée à l’étape précédente.
  3. Remplacez {resultId} par l’ID de résultat de l’étape précédente.

Demande

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"

Examiner les résultats

Vous recevez une réponse contenant du contenu JSON 200 (success).

Consultez l’image de facture suivante et sa sortie JSON correspondante.

  • Le "readResults" nœud contient chaque ligne de texte avec son positionnement de zone englobante respective sur la page.
  • Le selectionMarks nœud affiche chaque marque de sélection (case à cocher, case d’option) et indique si son état est selected ou unselected.
  • La "pageResults" section inclut les tables extraites. Pour chaque tableau, le texte, l'index de ligne et de colonne, l'étendue de lignes et de colonnes, la boîte englobante, et plus encore sont extraits.

Document d’instruction de projet Contoso avec une table.

Corps de la réponse

Vous pouvez afficher le résultat d'exemple complet sur GitHub.

Essayez-le : modèle prédéfini

  • Pour cet exemple, nous allons analyser un document de facture à l’aide d’un modèle prédéfini. Vous pouvez utiliser notre document de facture sample pour ce guide de démarrage rapide.

Choisir un modèle prédéfini

Vous n’êtes pas limité aux factures : il existe plusieurs modèles prédéfinis à choisir, chacun ayant son propre ensemble de champs pris en charge. Le modèle à utiliser pour l’opération analyze dépend du type de document à analyser. Voici les modèles prédéfinis actuellement pris en charge par le service Document Intelligence :

  • Facture : extrait le texte, les marques de sélection, les tables, les champs et les informations clés des factures.
  • Reçu: extrait le texte et les informations clés des reçus.
  • Document d’identification : extrait le texte et les informations clés des permis de conduire et des passeports internationaux.
  • Carte de visite : extrait le texte et les informations clés des cartes de visite.

Avant d’exécuter la commande, apportez ces modifications :

  1. Remplacez {endpoint} par le point de terminaison que vous avez obtenu par votre abonnement Document Intelligence.

  2. Remplacez {key} par la clé que vous avez copiée à l’étape précédente.

  3. Remplacez \"{your-document-url} par un exemple d'URL de facture :

    https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf
    

Demande

curl -v -i POST https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key:  {key}" --data-ascii "{​​​​​​​'urlSource': '{your invoice URL}'}​​​​​​​​"

Operation-Location

Vous recevez une 202 (Success) réponse qui inclut un en-tête "Operation-Location" . La valeur de cet en-tête contient un ID de résultat que vous pouvez utiliser pour interroger l’état de l’opération asynchrone et obtenir les résultats :

https:// cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}

Dans l’exemple suivant, dans le cadre de l’URL, la chaîne après analyzeResults/ est l’ID de résultat :

https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Obtenir les résultats de la facture

Après avoir appelé l’API Analyze Invoice , vous appelez l’API Get Analyze Invoice Result pour obtenir l’état de l’opération et les données extraites. Avant d’exécuter la commande, apportez ces modifications :

  1. Remplacez {endpoint} par le point de terminaison que vous avez obtenu par votre clé Document Intelligence. Vous pouvez le trouver sous l’onglet Vue d’ensemble de votre ressource Document Intelligence.
  2. Remplacez {resultId} par l’ID de résultat de l’étape précédente.
  3. Remplacez {key} par votre clé.

Demande

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"

Examiner la réponse

Vous recevez une réponse 200 (Success) avec une sortie JSON.

  • Le "readResults" champ contient chaque ligne de texte extraite de la facture.
  • Inclut les tableaux et les marques de sélection extraites de la facture "pageResults".
  • Le "documentResults" champ contient des informations clé/valeur pour les parties les plus pertinentes de la facture.

Consultez le document Facture d'exemple.

Corps de la réponse

Consultez l’exemple de sortie full sur GitHub.

C’est ça, bien fait !

Étapes suivantes

  • Pour une expérience améliorée et une qualité de modèle avancée, essayez Document Intelligence Studio.

    • Le Studio prend en charge tout modèle entraîné avec les données étiquetées v2.1.

    • Les journaux de modification fournissent des informations détaillées sur la migration de la version 3.1 vers la version 4.0.