Delen via


Aan de slag met Document Intelligence

Belangrijk

  • Azure Cognitive Services Form Recognizer is nu Azure AI Document Intelligence.
  • Sommige platforms wachten nog steeds op de hernoemingsupdate.
  • Alle vermeldingen van Form Recognizer of Document Intelligence in onze documentatie verwijzen naar dezelfde Azure-service.

Deze inhoud is van toepassing op: vinkje v4.0 (preview) eerdere versies: blauw-vinkje v3.1 (GA) blauw-vinkje v3.0 (GA)

  • Aan de slag met de nieuwste preview-versie van Azure AI Document Intelligence (2024-07-31-preview).

Deze inhoud is van toepassing op: vinkje v3.1 (GA) Eerdere versies: blauw-vinkje v3.0 blauw-vinkje v2.1

  • Aan de slag met de nieuwste GA-versie van Azure Form Recognizer (2023-07-31).

Deze inhoud is van toepassing op: vinkje v3.0 (GA) Nieuwere versie: blauw-vinkje v3.1blauw-vinkje v2.1

  • Aan de slag met de verouderde GA-versie van Azure Form Recognizer (2022-08-31).
  • Azure AI Document Intelligence/Form Recognizer is een Azure AI-cloudservice die machine learning gebruikt om sleutel-waardeparen, tekst, tabellen en sleutelgegevens uit uw documenten te extraheren.

  • U kunt documentverwerkingsmodellen eenvoudig integreren in uw werkstromen en toepassingen met behulp van een programmeertaal-SDK of het aanroepen van de REST API.

  • Voor deze quickstart raden we u aan de gratis service te gebruiken terwijl u de technologie leert. Houd er rekening mee dat het aantal gratis pagina's beperkt is tot 500 per maand.

Ga naar onze overzichtspagina voor meer informatie over de API-functies en ontwikkelopties.

In deze quickstart gebruikt u de volgende functies om gegevens en waarden uit formulieren en documenten te analyseren en te extraheren:

  • Indelingsmodel: tabellen, lijnen, woorden en selectiemarkeringen analyseren en extraheren, zoals keuzerondjes en selectievakjes in documenten, zonder dat u een model hoeft te trainen.

  • Vooraf samengesteld model: algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf samengesteld model.

Vereisten

  • Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een resource met één service of Azure AI voor meerdere services , in Azure Portal, om uw sleutel en eindpunt op te halen.

  • U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.

Tip

Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.

  • Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:

    Schermopname van sleutels en eindpuntlocatie in Azure Portal.

  • Een Azure AI-services of Form Recognizer-resource. Zodra u uw Azure-abonnement hebt, maakt u een resource met één service of Azure AI voor meerdere services , in Azure Portal, om uw sleutel en eindpunt op te halen.

  • U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.

Tip

Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Maak voor alleen Form Recognizer-toegang een Form Recognizer-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.

  • Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Form Recognizer-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:

    Schermopname van sleutels en eindpuntlocatie in Azure Portal.

Instellingen

  1. Visual Studio starten.

  2. Kies een nieuw project maken op de startpagina.

    Schermopname van het startvenster van Visual Studio.

  3. Voer op de pagina Een nieuw project maken de console in het zoekvak in. Kies de consoletoepassingssjabloon en kies vervolgens Volgende.

    Schermopname van de nieuwe projectpagina van Visual Studio maken.

  1. Voer doc_intel_quickstart in het dialoogvenster Uw nieuwe project configureren het vak Projectnaam in. Kies vervolgens Volgende.
  1. Voer form_recognizer_quickstart in het dialoogvenster Uw nieuwe project configureren het vak Projectnaam in. Kies vervolgens Volgende.
  1. Selecteer in het dialoogvenster Aanvullende informatie .NET 8.0 (langetermijnondersteuning) en selecteer vervolgens Maken.

    Schermopname van het dialoogvenster aanvullende informatie van Visual Studio.

De clientbibliotheek installeren met NuGet

  1. Klik met de rechtermuisknop op uw doc_intel_quickstart project en selecteer NuGet-pakketten beheren... .

    Schermopname van het venster NuGet-prereleasepakket selecteren in Visual Studio.

  2. Selecteer het tabblad Bladeren en typ Azure.AI.DocumentIntelligence.

  3. Schakel het Include prerelease selectievakje in.

    Schermopname van het prerelease NuGet-pakket selecteren in Visual Studio.

  4. Kies een versie in het vervolgkeuzemenu en installeer het pakket in uw project.

  1. Klik met de rechtermuisknop op uw form_recognizer_quickstart project en selecteer NuGet-pakketten beheren... .

    Schermopname van het venster NuGet-pakket zoeken in Visual Studio.

  2. Selecteer het tabblad Bladeren en typ Azure.AI.FormRecognizer. Selecteer versie 4.1.0 in de vervolgkeuzelijst

    Schermopname van het NuGet Form Recognizer-pakket selecteren in Visual Studio.

  1. Klik met de rechtermuisknop op uw form_recognizer_quickstart project en selecteer NuGet-pakketten beheren... .

    Schermopname van het Venster NuGet-pakket in Visual Studio.

  2. Selecteer het tabblad Bladeren en typ Azure.AI.FormRecognizer. Selecteer versie 4.0.0 in de vervolgkeuzelijst

    Schermopname van het selecteren van een verouderd NuGet-pakket in Visual Studio.

Uw toepassing bouwen

Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentIntelligenceClient klasse maken. Hiervoor maakt u een AzureKeyCredential exemplaar met uw key azure-portal en een DocumentIntelligenceClient exemplaar met de AzureKeyCredential en uw documentinformatie endpoint.

Als u wilt communiceren met de Form Recognizer-service, moet u een exemplaar van de DocumentAnalysisClient klasse maken. Hiervoor maakt u een AzureKeyCredential met uw key vanuit Azure Portal en een DocumentAnalysisClient exemplaar met de AzureKeyCredential en uw Form Recognizer endpoint.

Notitie

  • Vanaf .NET 6 genereren nieuwe projecten met behulp van de console sjabloon een nieuwe programmastijl die verschilt van eerdere versies.
  • De nieuwe uitvoer maakt gebruik van recente C#-functies die de code vereenvoudigen die u moet schrijven.
  • Wanneer u de nieuwere versie gebruikt, hoeft u alleen de hoofdtekst van de Main methode te schrijven. U hoeft geen instructies op het hoogste niveau, globaal gebruik van instructies of impliciet gebruik van instructies op te nemen.
  • Zie Nieuwe C#-sjablonen voor meer informatie over het genereren van instructies op het hoogste niveau.
  1. Open het Program.cs-bestand .

  2. Verwijder de bestaande code, inclusief de regel Console.Writeline("Hello World!"), en selecteer een van de volgende codevoorbeelden om te kopiëren en plakken in het Program.cs bestand van uw toepassing:

Belangrijk

Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.

Indelingsmodel

Extraheer tekst, selectiemarkeringen, tekststijlen, tabelstructuren en coördinaten van begrenzingsregio's uit documenten.

  • In dit voorbeeld hebt u een documentbestand van een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
  • We hebben de bestands-URI-waarde toegevoegd aan de Uri fileUri variabele boven aan het script.
  • Als u de indeling wilt extraheren uit een bepaald bestand op een URI, gebruikt u de StartAnalyzeDocumentFromUri methode en geeft u deze door prebuilt-layout als de model-id. De geretourneerde waarde is een AnalyzeResult object met gegevens uit het ingediende document.

Voeg het volgende codevoorbeeld toe aan het Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:


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}");
    }
}

Uw toepassing uitvoeren

Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.

Schermopname van het uitvoeren van de visual Studio-programmaknop.

Voeg het volgende codevoorbeeld toe aan het Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:

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

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

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

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

AnalyzeResult result = operation.Value;

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

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

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

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

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

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

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

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

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

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

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

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

Uw toepassing uitvoeren

Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.

Schermopname van het uitvoeren van de locatie van de Visual Studio-programmaknop.

Uitvoer van indelingsmodel

Hier volgt een fragment van de verwachte uitvoer:

  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

Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het indelingsmodel weer te geven.

Voeg het volgende codevoorbeeld toe aan het Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:

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

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

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

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

AnalyzeResult result = operation.Value;

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

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

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

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

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

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

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

Console.WriteLine("Paragraphs:");

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Console.WriteLine("Paragraphs:");

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

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

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

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

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

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

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

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

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

Uw toepassing uitvoeren

Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.

Schermopname van het uitvoeren van uw Visual Studio-programma.

Vooraf samengesteld model

Algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf samengesteld model. In dit voorbeeld analyseren we een factuur met behulp van het vooraf samengestelde factuurmodel .

Tip

U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat voor de analyze bewerking moet worden gebruikt, is afhankelijk van het type document dat moet worden geanalyseerd. Zie modelgegevensextractie.

  • Analyseer een factuur met behulp van het vooraf samengestelde factuurmodel. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
  • We hebben de waarde van de bestands-URI toegevoegd aan de Uri invoiceUri variabele boven aan het Program.cs-bestand.
  • Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de StartAnalyzeDocumentFromUri methode en geeft u deze door prebuilt-invoice als de model-id. De geretourneerde waarde is een AnalyzeResult object met gegevens uit het ingediende document.
  • Ter vereenvoudiging worden alle sleutel-waardeparen die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .

Voeg het volgende codevoorbeeld toe aan uw Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:


using Azure;
using Azure.AI.DocumentIntelligence;

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

//sample invoice document

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

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

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

AnalyzeResult result = operation.Value;

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

    AnalyzedDocument document = result.Documents[i];

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

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

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

            if (itemField.Type == DocumentFieldType.Object)
            {
                IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueObject;

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

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

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

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

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

Uw toepassing uitvoeren

Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.

Schermopname van het uitvoeren van de visual Studio-programmaknop.

Voeg het volgende codevoorbeeld toe aan uw Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:


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}");
        }
    }
}

Uw toepassing uitvoeren

Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.

Schermopname van het uitvoeren van de locatie van de Visual Studio-programmaknop.

Vooraf samengestelde modeluitvoer

Hier volgt een fragment van de verwachte uitvoer:

  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

Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het vooraf gedefinieerde factuurmodel weer te geven.

Voeg het volgende codevoorbeeld toe aan uw Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:


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}");
        }
    }
}

Uw toepassing uitvoeren

Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.

Schermopname van het uitvoeren van uw Visual Studio-programma.

In deze quickstart gebruikt u de volgende functies om gegevens en waarden uit formulieren en documenten te analyseren en te extraheren:

  • Indeling: tabellen, lijnen, woorden en selectiemarkeringen analyseren en extraheren, zoals keuzerondjes en selectievakjes in documenten, zonder dat u een model hoeft te trainen.

  • Vooraf samengestelde factuur: algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf getraind model.

Vereisten

  • Azure-abonnement: Maak een gratis abonnement aan.

  • De nieuwste versie van Visual Studio Code of uw favoriete IDE. Zie Java in Visual Studio Code.

    Tip

    • Visual Studio Code biedt een Coderingspakket voor Java voor Windows en macOS. Het coderingspakket is een bundel VS Code, de Java Development Kit (JDK) en een verzameling voorgestelde extensies van Microsoft. Het coderingspakket kan ook worden gebruikt om een bestaande ontwikkelomgeving op te lossen.
    • Als u VS Code en het Coderingspakket voor Java gebruikt, installeert u de Gradle voor Java-extensie.
  • Als u Visual Studio Code niet gebruikt, controleert u of het volgende is geïnstalleerd in uw ontwikkelomgeving:

  • Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services , in Azure Portal, om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.

    Tip

    Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.

  • Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. Later plakt u uw sleutel en eindpunt in de code:

    Schermopname van sleutels en eindpuntlocatie in Azure Portal.

Instellingen

Een nieuw Gradle-project maken

  1. Maak in het consolevenster (zoals cmd, PowerShell of Bash) een nieuwe map voor uw app met de naam doc-intel-app en navigeer ernaartoe.

    mkdir doc-intel-app && doc-intel-app
    
    mkdir doc-intel-app; cd doc-intel-app
    
  2. Voer de opdracht gradle init uit vanuit uw werkmap. Met deze opdracht maakt u essentiële buildbestanden voor Gradle, waaronder build.gradle.kts, die tijdens runtime wordt gebruikt om uw toepassing te maken en te configureren.

    gradle init --type basic
    
  3. Wanneer u wordt gevraagd om een DSL te kiezen, selecteert u Kotlin.

  4. Accepteer de standaardprojectnaam (doc-intel-app) door Return of Enter te selecteren.

  1. Maak in het consolevenster (zoals cmd, PowerShell of Bash) een nieuwe map voor uw app met de naam form-recognize-app en navigeer ernaartoe.

    mkdir form-recognize-app && form-recognize-app
    
    mkdir form-recognize-app; cd form-recognize-app
    
  2. Voer de opdracht gradle init uit vanuit uw werkmap. Met deze opdracht maakt u essentiële buildbestanden voor Gradle, waaronder build.gradle.kts, die tijdens runtime wordt gebruikt om uw toepassing te maken en te configureren.

    gradle init --type basic
    
  3. Wanneer u wordt gevraagd om een DSL te kiezen, selecteert u Kotlin.

  4. Accepteer de standaardprojectnaam (form-recognize-app) door Return of Enter te selecteren.

De clientbibliotheek installeren

Deze quickstart maakt gebruik van de Gradle-afhankelijkheidsmanager. U vindt de clientbibliotheek en informatie voor andere afhankelijkheidsbeheerders in de Maven Central Repository.

Open het bestand build.gradle.kts van het project in uw IDE. Copay en voorbij de volgende code om de clientbibliotheek als instructie implementation op te nemen, samen met de vereiste invoegtoepassingen en instellingen.

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

   }

Deze quickstart maakt gebruik van de Gradle-afhankelijkheidsmanager. U vindt de clientbibliotheek en informatie voor andere afhankelijkheidsbeheerders in de Maven Central Repository.

Open het bestand build.gradle.kts van het project in uw IDE. Copay en voorbij de volgende code om de clientbibliotheek als instructie implementation op te nemen, samen met de vereiste invoegtoepassingen en instellingen.

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

   }

Deze quickstart maakt gebruik van de Gradle-afhankelijkheidsmanager. U vindt de clientbibliotheek en informatie voor andere afhankelijkheidsbeheerders in de Maven Central Repository.

Open het bestand build.gradle.kts van het project in uw IDE. Copay en voorbij de volgende code om de clientbibliotheek als instructie implementation op te nemen, samen met de vereiste invoegtoepassingen en instellingen.

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


   }

Een Java-toepassing maken

Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentIntelligenceClient klasse maken. Hiervoor maakt u een AzureKeyCredential exemplaar met uw key azure-portal en een DocumentIntelligenceClient exemplaar met de AzureKeyCredential en uw documentinformatie endpoint.

Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentAnalysisClient klasse maken. Hiervoor maakt u een AzureKeyCredential exemplaar met uw key azure-portal en een DocumentAnalysisClient exemplaar met de AzureKeyCredential en uw documentinformatie endpoint.

  1. Voer vanuit de map doc-intel-app de volgende opdracht uit:

    mkdir -p src/main/java
    

    U maakt de volgende mapstructuur:

    Schermopname van java-mapstructuur

  1. Navigeer naar de map en maak een bestand met de java naam DocIntelligence.java.

    Tip

    • U kunt een nieuw bestand maken met behulp van PowerShell.
    • Open een PowerShell-venster in uw projectmap door Shift ingedrukt te houden en met de rechtermuisknop op de map te klikken.
    • Typ de volgende opdracht new-item DocIntelligence.java.
  2. Open het bestand DocIntelligence.java. Kopieer en plak een van de volgende codevoorbeelden in uw toepassing:

  1. Navigeer naar de map en maak een bestand met de java naam FormRecognizer.java.

    Tip

    • U kunt een nieuw bestand maken met behulp van PowerShell.
    • Open een PowerShell-venster in uw projectmap door Shift ingedrukt te houden en met de rechtermuisknop op de map te klikken.
    • Typ de volgende opdracht new-item FormRecognizer.java.
  2. Open het bestand FormRecognizer.java. Kopieer en plak een van de volgende codevoorbeelden in uw toepassing:

Belangrijk

Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.

Indelingsmodel

Extraheer tekst, selectiemarkeringen, tekststijlen, tabelstructuren en coördinaten van begrenzingsregio's uit documenten.

  • In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
  • Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de beginAnalyzeDocumentFromUrl methode en geeft u deze door prebuilt-layout als de model-id. De geretourneerde waarde is een AnalyzeResult object met gegevens over het ingediende document.
  • We hebben de bestands-URI-waarde toegevoegd aan de documentUrl variabele in de hoofdmethode.

Voeg het volgende codevoorbeeld toe aan het DocIntelligence.java bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:


import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
import com.azure.ai.documentintelligence.models.DocumentTable;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.util.List;

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

    SyncPoller <AnalyzeResultOperation, AnalyzeResultOperation> analyzeLayoutPoller =
      client.beginAnalyzeDocument(modelId,
          null,
          null,
          null,
          null,
          null,
          null,
          new AnalyzeDocumentRequest().setUrlSource(documentUrl));

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult().getAnalyzeResult();

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

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

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

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

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

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

De toepassing bouwen en uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: doc-intel-app.

  1. Bouw uw toepassing met de build opdracht:

    gradle build
    
  2. Voer uw toepassing uit met de run opdracht:

    gradle run
    

Voeg het volgende codevoorbeeld toe aan het FormRecognizer.java bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:


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

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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();

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

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

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

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

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

De toepassing bouwen en uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: form-recognize-app.

  1. Bouw uw toepassing met de build opdracht:

    gradle build
    
  2. Voer uw toepassing uit met de run opdracht:

    gradle run
    

Uitvoer van indelingsmodel

Hier volgt een fragment van de verwachte uitvoer:

  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.

Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het indelingsmodel weer te geven.

Voeg het volgende codevoorbeeld toe aan het FormRecognizer.java bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:


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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();

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

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

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

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

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

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

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

De toepassing bouwen en uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: form-recognize-app.

  1. Bouw uw toepassing met de build opdracht:

    gradle build
    
  2. Voer uw toepassing uit met de run opdracht:

    gradle run
    

Vooraf samengesteld model

Algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf samengesteld model. In dit voorbeeld analyseren we een factuur met behulp van het vooraf samengestelde factuurmodel .

Tip

U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat voor de analyze bewerking moet worden gebruikt, is afhankelijk van het type document dat moet worden geanalyseerd. Zie modelgegevensextractie.

  • Analyseer een factuur met behulp van het vooraf samengestelde factuurmodel. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
  • We hebben de waarde van de bestands-URL toegevoegd aan de invoiceUrl variabele boven aan het bestand.
  • Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de beginAnalyzeDocuments methode en geeft u deze door PrebuiltModels.Invoice als de model-id. De geretourneerde waarde is een result object met gegevens over het ingediende document.
  • Ter vereenvoudiging worden alle sleutel-waardeparen die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .

Voeg het volgende codevoorbeeld toe aan het DocIntelligence.java bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:


import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
import com.azure.ai.documentintelligence.models.Document;
import com.azure.ai.documentintelligence.models.DocumentField;
import com.azure.ai.documentintelligence.models.DocumentFieldType;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

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

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

      // Instantiate a client that will be used to call the service.
      DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
        .credential(new AzureKeyCredential(key))
        .endpoint(endpoint)
        .buildClient();

      SyncPoller<AnalyzeResultOperation, AnalyzeResultOperation > analyzeInvoicesPoller =
        client.beginAnalyzeDocument(modelId, 
            null,
            null,
            null,
            null,
            null,
            null,
            new AnalyzeDocumentRequest().setUrlSource(invoiceUrl));

      AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult().getAnalyzeResult();

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

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

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

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

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

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

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

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

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

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

De toepassing bouwen en uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: doc-intel-app.

  1. Bouw uw toepassing met de build opdracht:

    gradle build
    
  2. Voer uw toepassing uit met de run opdracht:

    gradle run
    

Voeg het volgende codevoorbeeld toe aan het FormRecognizer.java bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:


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());
                }
              }
            }));
        }
      }
    }
  }
}

De toepassing bouwen en uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: doc-intel-app.

  1. Bouw uw toepassing met de build opdracht:

    gradle build
    
  2. Voer uw toepassing uit met de run opdracht:

    gradle run
    

Vooraf samengestelde modeluitvoer

Hier volgt een fragment van de verwachte uitvoer:

  ----------- 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

Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het vooraf gedefinieerde factuurmodel weer te geven.

Voeg het volgende codevoorbeeld toe aan het FormRecognizer.java bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:


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());
                }
              }
            }));
        }
      }
    }
  }
}

De toepassing bouwen en uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: doc-intel-app.

  1. Bouw uw toepassing met de build opdracht:

    gradle build
    
  2. Voer uw toepassing uit met de run opdracht:

    gradle run
    

In deze quickstart gebruikt u de volgende functies om gegevens en waarden uit formulieren en documenten te analyseren en te extraheren:

  • Indeling: tabellen, lijnen, woorden en selectiemarkeringen analyseren en extraheren, zoals keuzerondjes en selectievakjes in documenten, zonder dat u een model hoeft te trainen.

  • Vooraf samengestelde factuur: algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf getraind factuurmodel.

Vereisten

  • Azure-abonnement: Maak een gratis abonnement aan.

  • De nieuwste versie van Visual Studio Code of uw favoriete IDE. Zie Node.js in Visual Studio Code voor meer informatie.

  • De nieuwste LTS versie van Node.js.

  • Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services , in Azure Portal, om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.

    Tip

    Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.

  • Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:

    Schermopname van sleutels en eindpuntlocatie in Azure Portal.

Instellingen

  1. Maak een nieuwe Node.js Express-toepassing: maak en navigeer in een consolevenster (zoals cmd, PowerShell of Bash) naar een nieuwe map voor uw app met de naam doc-intel-app.

    mkdir doc-intel-app && cd doc-intel-app
    
  2. Voer de npm init opdracht uit om de toepassing te initialiseren en uw project te initialiseren.

    npm init
    
  3. Geef de kenmerken van uw project op met behulp van de prompts die worden weergegeven in de terminal.

    • De belangrijkste kenmerken zijn naam, versienummer en toegangspunt.
    • U wordt aangeraden de naam van het toegangspunt op te geven index.js . De beschrijving, testopdracht, GitHub-opslagplaats, trefwoorden, auteurs en licentiegegevens zijn optionele kenmerken. Ze kunnen voor dit project worden overgeslagen.
    • Accepteer de suggesties tussen haakjes door Return of Enter te selecteren.
    • Nadat u de aanwijzingen hebt voltooid, wordt er een package.json bestand gemaakt in de map doc-intel-app.
  1. Installeer de ai-document-intelligence clientbibliotheek en azure/identity npm-pakketten:

    npm i @azure-rest/ai-document-intelligence@1.0.0-beta.3 @azure/core-auth
    

    Het package.json-bestand van uw app wordt bijgewerkt met de afhankelijkheden.

  1. Installeer de ai-form-recognizer clientbibliotheek en azure/identity npm-pakketten:

    npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
    
    • Het package.json-bestand van uw app wordt bijgewerkt met de afhankelijkheden.
  1. Installeer de ai-form-recognizer clientbibliotheek en azure/identity npm-pakketten:

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. Maak een bestand met de naam index.js in de toepassingsmap.

    Tip

    • U kunt een nieuw bestand maken met behulp van PowerShell.
    • Open een PowerShell-venster in uw projectmap door Shift ingedrukt te houden en met de rechtermuisknop op de map te klikken.
    • Typ de volgende opdracht New-Item index.js.

Uw toepassing bouwen

Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentIntelligenceClient klasse maken. Hiervoor maakt u een AzureKeyCredential exemplaar met uw key azure-portal en een DocumentIntelligenceClient exemplaar met de AzureKeyCredential en uw documentinformatie endpoint.

Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentAnalysisClient klasse maken. Hiervoor maakt u een AzureKeyCredential met uw key vanuit Azure Portal en een DocumentAnalysisClient exemplaar met de AzureKeyCredential en uw Form Recognizer endpoint.

  1. Open het index.js bestand in Visual Studio Code of uw favoriete IDE. Kopieer en plak een van de volgende codevoorbeelden in uw toepassing:

Belangrijk

Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.

Indelingsmodel

Extraheer tekst, selectiemarkeringen, tekststijlen, tabelstructuren en coördinaten van begrenzingsregio's uit documenten.

  • In dit voorbeeld hebt u een documentbestand van een URL nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
  • We hebben de waarde van de bestands-URL toegevoegd aan de formUrl variabele boven aan het bestand.
  • Als u een bepaald bestand wilt analyseren op basis van een URL, gebruikt u de beginAnalyzeDocuments methode en geeft u deze door prebuilt-layout als de model-id.
    const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
  { getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

  const { AzureKeyCredential } = require("@azure/core-auth");

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

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

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


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

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

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

    const documents = analyzeResult?.documents;

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

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

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

Uw toepassing uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, voert u het volgende uit:

  1. Navigeer naar de map met uw Document Intelligence-toepassing (doc-intel-app).

  2. Typ de volgende opdracht in uw terminal:

    node index.js
    

Voeg het volgende codevoorbeeld toe aan het index.js bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:


 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);
});

Uw toepassing uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, voert u het volgende uit:

  1. Navigeer naar de map met uw Document Intelligence-toepassing (doc-intel-app).

  2. Typ de volgende opdracht in uw terminal:

    node index.js
    

Uitvoer van indelingsmodel

Hier volgt een fragment van de verwachte uitvoer:

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

Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het indelingsmodel weer te geven.

Vooraf samengesteld model

In dit voorbeeld analyseren we een factuur met behulp van het vooraf samengestelde factuurmodel .

Tip

U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat voor de analyze bewerking moet worden gebruikt, is afhankelijk van het type document dat moet worden geanalyseerd. Zie modelgegevensextractie.

  • Analyseer een factuur met behulp van het vooraf samengestelde factuurmodel. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
  • We hebben de waarde van de bestands-URL toegevoegd aan de invoiceUrl variabele boven aan het bestand.
  • Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de beginAnalyzeDocuments methode en geeft u deze door PrebuiltModels.Invoice als de model-id. De geretourneerde waarde is een result object met gegevens over het ingediende document.
  • Ter vereenvoudiging worden alle sleutel-waardeparen die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .

const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
  { getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

const { AzureKeyCredential } = require("@azure/core-auth");

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

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

async function main() {

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

    const initialResponse = await client
    .path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
    .post({
      contentType: "application/json",
      body: {
        // The Document Intelligence service will access the URL to the invoice image and extract data from it
        urlSource: invoiceUrl,
      },
    });

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

    const poller = await getLongRunningPoller(client, initialResponse);

    poller.onProgress((state) => console.log("Operation:", state.result, state.status));
    const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;

    const documents = analyzeResult?.documents;

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

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


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

Uw toepassing uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, voert u het volgende uit:

  1. Navigeer naar de map met uw Document Intelligence-toepassing (doc-intel-app).

  2. Typ de volgende opdracht in uw 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);
});

Uw toepassing uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, voert u het volgende uit:

  1. Navigeer naar de map met uw Document Intelligence-toepassing (doc-intel-app).

  2. Typ de volgende opdracht in uw terminal:

    node index.js
    

Vooraf samengestelde modeluitvoer

Hier volgt een fragment van de verwachte uitvoer:

  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

Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het vooraf gedefinieerde factuurmodel weer te geven.

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);
});

Uw toepassing uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, voert u het volgende uit:

  1. Navigeer naar de map met uw Document Intelligence-toepassing (doc-intel-app).

  2. Typ de volgende opdracht in uw terminal:

    node index.js
    

In deze quickstart gebruikt u de volgende functies om gegevens uit formulieren en documenten te analyseren en te extraheren:

  • Indeling: tabellen, lijnen, woorden en selectiemarkeringen analyseren en extraheren, zoals keuzerondjes en selectievakjes, en sleutel-waardeparen, zonder dat u een model hoeft te trainen.

  • Vooraf samengestelde factuur: algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf getraind model.

Vereisten

Tip

Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.

  • Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:

    Schermopname van sleutels en eindpuntlocatie in Azure Portal.

Instellingen

Open een terminalvenster in uw lokale omgeving en installeer de Azure AI Document Intelligence-clientbibliotheek voor Python met pip:

pip install azure-ai-documentintelligence==1.0.0b4

pip install azure-ai-formrecognizer==3.3.0

pip install azure-ai-formrecognizer==3.2.0b6

Uw Python-toepassing maken

Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentIntelligenceClient klasse maken. Hiervoor maakt u een AzureKeyCredential exemplaar met uw key azure-portal en een DocumentIntelligenceClient exemplaar met de AzureKeyCredential en uw documentinformatie endpoint.

  1. Maak een nieuw Python-bestand met de naam doc_intel_quickstart.py in uw favoriete editor of IDE.

  2. Open het bestand doc_intel_quickstart.py en selecteer een van de volgende codevoorbeelden om in uw toepassing te kopiëren en plakken:

Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentAnalysisClient klasse maken. Hiervoor maakt u een AzureKeyCredential exemplaar met uw key azure-portal en een DocumentAnalysisClient exemplaar met de AzureKeyCredential en uw documentinformatie endpoint.

  1. Maak een nieuw Python-bestand met de naam form_recognizer_quickstart.py in uw favoriete editor of IDE.

  2. Open het bestand form_recognizer_quickstart.py en selecteer een van de volgende codevoorbeelden om in uw toepassing te kopiëren en plakken:

Belangrijk

Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.

Indelingsmodel

Extraheer tekst, selectiemarkeringen, tekststijlen, tabelstructuren en coördinaten van begrenzingsregio's uit documenten.

  • In dit voorbeeld hebt u een documentbestand van een URL nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
  • We hebben de waarde van de bestands-URL toegevoegd aan de formUrl variabele in de analyze_layout functie.

Voeg het volgende codevoorbeeld toe aan uw doc_intel_quickstart.py toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:


# 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()

De toepassing uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:

  1. Navigeer naar de map waar u het doc_intel_quickstart.py-bestand hebt.

  2. Typ de volgende opdracht in uw terminal:

    python doc_intel_quickstart.py
    

Als u een bepaald bestand op een URL wilt analyseren, gebruikt u de begin_analyze_document_from_url methode en geeft u deze door prebuilt-layout als de model-id. De geretourneerde waarde is een result object met gegevens over het ingediende document.

Voeg het volgende codevoorbeeld toe aan uw form_recognizer_quickstart.py-toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:


# 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()

De toepassing uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:

  1. Navigeer naar de map waar u uw form_recognizer_quickstart.py-bestand hebt.

  2. Typ de volgende opdracht in uw terminal:

    python form_recognizer_quickstart.py
    

Uitvoer van indelingsmodel

Hier volgt een fragment van de verwachte uitvoer:

  ----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

Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het indelingsmodel weer te geven.

Voeg het volgende codevoorbeeld toe aan uw form_recognizer_quickstart.py-toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:


# 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()


De toepassing uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:

  1. Navigeer naar de map waar u uw form_recognizer_quickstart.py-bestand hebt.

  2. Typ de volgende opdracht in uw terminal:

    python form_recognizer_quickstart.py
    

Vooraf samengesteld model

Algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf samengesteld model. In dit voorbeeld analyseren we een factuur met behulp van het vooraf samengestelde factuurmodel .

Tip

U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat voor de analyze bewerking moet worden gebruikt, is afhankelijk van het type document dat moet worden geanalyseerd. Zie modelgegevensextractie.

  • Analyseer een factuur met behulp van het vooraf samengestelde factuurmodel. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
  • We hebben de waarde van de bestands-URL toegevoegd aan de invoiceUrl variabele boven aan het bestand.
  • Ter vereenvoudiging worden alle sleutel-waardeparen die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .

Voeg het volgende codevoorbeeld toe aan uw doc_intel_quickstart.py toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:


# 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()


De toepassing uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:

  1. Navigeer naar de map waar u het doc_intel_quickstart.py-bestand hebt.

  2. Typ de volgende opdracht in uw terminal:

    python doc_intel_quickstart.py
    

Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de begin_analyze_document_from_url methode en geeft u deze door prebuilt-invoice als de model-id. De geretourneerde waarde is een result object met gegevens over het ingediende document.

Voeg het volgende codevoorbeeld toe aan uw form_recognizer_quickstart.py-toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:

# 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()


De toepassing uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:

  1. Navigeer naar de map waar u uw form_recognizer_quickstart.py-bestand hebt.

  2. Typ de volgende opdracht in uw terminal:

    python form_recognizer_quickstart.py
    

Vooraf samengestelde modeluitvoer

Hier volgt een fragment van de verwachte uitvoer:

  --------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

Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het vooraf gedefinieerde factuurmodel weer te geven.

Voeg het volgende codevoorbeeld toe aan uw form_recognizer_quickstart.py-toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:


# 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()


De toepassing uitvoeren

Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:

  1. Navigeer naar de map waar u uw form_recognizer_quickstart.py-bestand hebt.

  2. Typ de volgende opdracht in uw terminal:

    python form_recognizer_quickstart.py
    

In deze quickstart leert u hoe u de Document Intelligence REST API gebruikt om gegevens en waarden uit documenten te analyseren en te extraheren:

Vereisten

  • Azure-abonnement: Krijg een gratis abonnement

  • curl-opdrachtregelprogramma geïnstalleerd.

  • PowerShell-versie 7.*+ (of een vergelijkbare opdrachtregeltoepassing.):

  • Als u uw PowerShell-versie wilt controleren, typt u de volgende opdracht ten opzichte van uw besturingssysteem:

    • Windows: Get-Host | Select-Object Version
    • macOS of Linux: $PSVersionTable
  • Een Document Intelligence-resource (één service) of Azure AI-services (meerdere services). Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services , in Azure Portal, om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.

Tip

Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.

  • Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:

    Schermopname van sleutels en eindpuntlocatie in Azure Portal.

Documenten analyseren en resultaten ophalen

Een POST-aanvraag wordt gebruikt voor het analyseren van documenten met een vooraf samengesteld of aangepast model. Een GET-aanvraag wordt gebruikt om het resultaat van een documentanalyseoproep op te halen. De modelId wordt gebruikt met POST en resultId met GET-bewerkingen.

Document analyseren (POST-aanvraag)

Voordat u de cURL-opdracht uitvoert, moet u de volgende wijzigingen aanbrengen in de postaanvraag:

  1. Vervang {endpoint} door de eindpuntwaarde van uw Document Intelligence-exemplaar in Azure Portal.

  2. Vervang {key} door de sleutelwaarde van uw Document Intelligence-exemplaar in Azure Portal.

  3. Gebruik de volgende tabel als verwijzing en vervang {modelID} deze {your-document-url} door de gewenste waarden.

  4. U hebt een documentbestand nodig op een URL. Voor deze quickstart kunt u de voorbeeldformulieren in de volgende tabel gebruiken voor elke functie:

Voorbeelddocumenten

Functie {modelID} {your-document-url}
Lezen vooraf gedefinieerde leesbewerking https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Indeling vooraf gedefinieerde indeling https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Zorgverzekeringskaart 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
Factuur vooraf samengestelde factuur https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Kwitantie vooraf samengestelde ontvangstbevestiging https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Id-document vooraf samengesteld-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

Voorbeelddocumenten

Functie {modelID} {your-document-url}
Algemeen document vooraf samengesteld document https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Lezen vooraf gedefinieerde leesbewerking https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Indeling vooraf gedefinieerde indeling https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Zorgverzekeringskaart 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
Factuur vooraf samengestelde factuur https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Kwitantie vooraf samengestelde ontvangstbevestiging https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Id-document vooraf samengesteld-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png
Visitekaartje vooraf samengestelde businessCard https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg

Belangrijk

Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.

POST-aanvraag

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

POST-antwoord (resultID)

U ontvangt een 202 (Success) antwoord met een alleen-lezen bewerkingslocatieheader . De waarde van deze header bevat een resultID query die kan worden uitgevoerd om de status van de asynchrone bewerking op te halen en de resultaten op te halen met behulp van een GET-aanvraag met dezelfde resourceabonnementssleutel:

{alt-text}

Resultaten analyseren ophalen (GET-aanvraag)

Nadat u de Analyze document API hebt aangeroepen, roept u de get analyze result-API aan om de status van de bewerking en de geëxtraheerde gegevens op te halen. Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:

Nadat u de Analyze document API hebt aangeroepen, roept u de get analyze result-API aan om de status van de bewerking en de geëxtraheerde gegevens op te halen. Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:

Nadat u de Analyze document API hebt aangeroepen, roept u de get analyze result-API aan om de status van de bewerking en de geëxtraheerde gegevens op te halen. Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:

  1. Vervang {resultID} de header Operation-Location van het POST-antwoord.

  2. Vervang {key} door de sleutelwaarde van uw Document Intelligence-exemplaar in Azure Portal.

GET-aanvraag

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

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

Het antwoord bekijken

U ontvangt een 200 (Success) antwoord met JSON-uitvoer. Het eerste veld, "status", geeft de status van de bewerking aan. Als de bewerking niet is voltooid, is de waarde "status" of "running" "notStarted", en moet u de API opnieuw aanroepen, handmatig of via een script. Een interval van één seconde of meer tussen oproepen wordt aanbevolen.

Voorbeeldantwoord voor vooraf gedefinieerde factuur

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

Ondersteunde documentvelden

Met de vooraf gedefinieerde modellen worden vooraf gedefinieerde sets documentvelden geëxtraheerd. Zie Modelgegevensextractie voor geëxtraheerde veldnamen, typen, beschrijvingen en voorbeelden.

Dat is het, gefeliciteerd!

In deze quickstart hebt u een document Intelligence-model gebruikt om verschillende formulieren en documenten te analyseren. Bekijk vervolgens de Document Intelligence Studio en referentiedocumentatie voor uitgebreide informatie over de Document Intelligence-API.

Volgende stappen

Deze inhoud is van toepassing op: vinkje v2.1 | Nieuwste versie: blauw-vinkje v4.0 (preview)

Ga aan de slag met Azure AI Document Intelligence met behulp van de programmeertaal van uw keuze of de REST API. Document Intelligence is een cloudgebaseerde Azure AI-service die machine learning gebruikt om sleutel-waardeparen, tekst en tabellen uit uw documenten te extraheren. U wordt aangeraden de gratis service te gebruiken wanneer u de technologie leert. Houd er rekening mee dat het aantal gratis pagina's beperkt is tot 500 per maand.

Ga naar onze overzichtspagina voor meer informatie over documentinformatiefuncties en ontwikkelingsopties.

Referentiedocumentatie | Broncode van bibliotheek | Pakket (NuGet) | Voorbeelden

In deze quickstart gebruikt u de volgende API's om gestructureerde gegevens uit formulieren en documenten te extraheren:

Vereisten

  • Azure-abonnement: Maak een gratis abonnement aan.

  • De huidige versie van Visual Studio IDE.

  • Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services in Azure Portal om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.

    Tip

    Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.

  • Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:

    Schermopname van sleutels en eindpuntlocatie in Azure Portal.

Instellingen

  1. Start Visual Studio 2019.

  2. Kies een nieuw project maken op de startpagina.

    Schermopname van het startvenster van Visual Studio.

  3. Voer op de pagina Een nieuw project maken de console in het zoekvak in. Kies de consoletoepassingssjabloon en kies vervolgens Volgende.

    Schermopname van de nieuwe projectpagina van Visual Studio maken.

  4. Voer formRecognizer_quickstart in het dialoogvenster Uw nieuwe project configureren het vak Projectnaam in. Kies vervolgens Volgende.

    Schermopname van het dialoogvenster Nieuw project configureren in Visual Studios.

  5. Selecteer in het dialoogvenster Aanvullende informatie .NET 5.0 (Huidig) en selecteer Vervolgens Maken.

    Schermopname van het dialoogvenster Aanvullende informatie in Visual Studio.

De clientbibliotheek installeren met NuGet

  1. Klik met de rechtermuisknop op uw formRecognizer_quickstart project en selecteer NuGet-pakketten beheren... .

    Schermopname van het venster NuGet-pakket selecteren.

  2. Selecteer het tabblad Bladeren en typ Azure.AI.FormRecognizer.

    Schermopname van de vervolgkeuzelijst Document Intelligence-pakket selecteren.

  3. Selecteer versie 3.1.1 in de vervolgkeuzelijst en selecteer Installeren.

Uw toepassing bouwen

Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de FormRecognizerClient klasse maken. Hiervoor maakt u een AzureKeyCredential met uw sleutel en een FormRecognizerClient exemplaar met de AzureKeyCredential en uw documentinformatie endpoint.

Notitie

  • Vanaf .NET 6 genereren nieuwe projecten met behulp van de console sjabloon een nieuwe programmastijl die verschilt van eerdere versies.
  • De nieuwe uitvoer maakt gebruik van recente C#-functies die de code vereenvoudigen die u moet schrijven.
  • Wanneer u de nieuwere versie gebruikt, hoeft u alleen de hoofdtekst van de Main methode te schrijven. U hoeft geen instructies op het hoogste niveau, globaal gebruik van instructies of impliciet gebruik van instructies op te nemen.
  • Zie Nieuwe C#-sjablonen voor meer informatie over het genereren van instructies op het hoogste niveau.
  1. Open het Program.cs-bestand .

  2. Neem de volgende gebruiksrichtlijnen op:

using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
  1. Stel uw endpoint en key omgevingsvariabelen in en maak uw AzureKeyCredential en FormRecognizerClient exemplaar:
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. Verwijder de regel Console.Writeline("Hello World!"); en voeg een van de Codevoorbeelden uitproberen toe aan Program.cs bestand:

    Schermopname van het toevoegen van de voorbeeldcode aan de Main-methode.

  2. Selecteer een codevoorbeeld dat u wilt kopiëren en plakken in de main-methode van uw toepassing:

Belangrijk

Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie het beveiligingsartikel over Azure AI-services voor meer informatie.

Probeer het: Indelingsmodel

Extraheer tekst, selectiemarkeringen, tekststijlen en tabelstructuren, samen met de bijbehorende begrenzingsregiocoördinaten uit documenten.

  • In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
  • We hebben de waarde van de bestands-URI toegevoegd aan de formUri variabele.
  • Als u de indeling wilt extraheren uit een bepaald bestand op een URI, gebruikt u de StartRecognizeContentFromUriAsync methode.

Voeg de volgende code toe aan uw indelingstoepassing Program.cs bestand:


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}'.");
                    }
                }
            }
        }
    }
}

Probeer het: Vooraf samengesteld model

In dit voorbeeld ziet u hoe u gegevens van bepaalde typen algemene documenten kunt analyseren met vooraf getrainde modellen, met behulp van een factuur als voorbeeld.

  • In dit voorbeeld analyseren we een factuurdocument met behulp van een vooraf samengesteld model. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
  • We hebben de bestands-URI-waarde toegevoegd aan de invoiceUri variabele boven aan de Main-methode.
  • Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de StartRecognizeInvoicesFromUriAsync methode.
  • Ter vereenvoudiging worden alle velden die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .

Een vooraf samengesteld model kiezen

U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat moet worden gebruikt voor de analysebewerking, is afhankelijk van het type document dat moet worden geanalyseerd. Dit zijn de vooraf gedefinieerde modellen die momenteel worden ondersteund door de Document Intelligence-service:

  • Factuur: extraheert tekst, selectiemarkeringen, tabellen, velden en sleutelgegevens uit facturen.
  • Ontvangstbewijs: extraheert tekst en belangrijke informatie uit ontvangstbevestigingen.
  • Id-document: extraheert tekst en belangrijke informatie uit rijbewijs en internationale paspoorten.
  • Visitekaartje: extraheert tekst en belangrijke informatie uit visitekaartjes.

Voeg de volgende code toe aan de vooraf gemaakte factuurtoepassing Program.cs bestandsmethode

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}");
       }
     }
   }
 }
}

Uw toepassing uitvoeren

Kies de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of druk op F5.

Schermopname van het uitvoeren van uw Visual Studio-programma.

Referentiedocumentatie | Broncode van bibliotheek | Pakket (Maven) | Voorbeelden

In deze quickstart gebruikt u de volgende API's om gestructureerde gegevens uit formulieren en documenten te extraheren:

Vereisten

Instellingen

Een nieuw Gradle-project maken

Maak in een consolevenster (zoals cmd, PowerShell of Bash) een nieuwe map voor uw app met de naam form-recognizer-app en navigeer ernaartoe.

mkdir form-recognizer-app && form-recognizer-app
  1. Voer de opdracht gradle init uit vanuit uw werkmap. Met deze opdracht maakt u essentiële buildbestanden voor Gradle, waaronder build.gradle.kts, die tijdens runtime wordt gebruikt om uw toepassing te maken en te configureren.

    gradle init --type basic
    
  2. Wanneer u wordt gevraagd om een DSL te kiezen, selecteert u Kotlin.

  3. Accepteer de standaardprojectnaam (form-recognizer-app)

De clientbibliotheek installeren

Deze quickstart maakt gebruik van de Gradle-afhankelijkheidsmanager. U vindt de clientbibliotheek en informatie voor andere afhankelijkheidsbeheerders in de Maven Central Repository.

Zorg ervoor dat u in het bestand build.gradle.kts de clientbibliotheek opneemt als een implementation-instructie, samen met de vereiste invoegtoepassen en instellingen.

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

Een Java-bestand maken

Voer de volgende opdracht uit vanuit uw werkmap:

mkdir -p src/main/java

U maakt de volgende mapstructuur:

Schermopname van de Java-mapstructuur van de toepassing.

Navigeer naar de Java-map en maak een bestand met de naam FormRecognizer.java. Open deze in uw favoriete editor of IDE en voeg de volgende pakketdeclaratie en import -instructies toe:

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;

Selecteer een codevoorbeeld dat u wilt kopiëren en plakken in de hoofdmethode van uw toepassing:

Belangrijk

Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.

Probeer het: Indelingsmodel

Extraheer tekst, selectiemarkeringen, tekststijlen en tabelstructuren, samen met de bijbehorende begrenzingsregiocoördinaten uit documenten.

  • In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
  • Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de beginRecognizeContentFromUrl methode.
  • We hebben de bestands-URI-waarde toegevoegd aan de formUrl variabele in de hoofdmethode.

Werk de FormRecognizer-klasse van uw toepassing bij met de volgende code (zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal):


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();
            });
        });
    }

Probeer het: Vooraf samengesteld model

In dit voorbeeld ziet u hoe u gegevens van bepaalde typen algemene documenten kunt analyseren met vooraf getrainde modellen, met behulp van een factuur als voorbeeld.

  • In dit voorbeeld analyseren we een factuurdocument met behulp van een vooraf samengesteld model. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
  • Als u een bepaald bestand wilt analyseren op een URI, gebruikt u de beginRecognizeInvoicesFromUrl .
  • We hebben de bestands-URI-waarde toegevoegd aan de invoiceUrl variabele in de hoofdmethode.
  • Ter vereenvoudiging worden alle velden die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .

Een vooraf samengesteld model kiezen

U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat moet worden gebruikt voor de analysebewerking, is afhankelijk van het type document dat moet worden geanalyseerd. Dit zijn de vooraf gedefinieerde modellen die momenteel worden ondersteund door de Document Intelligence-service:

  • Factuur: extraheert tekst, selectiemarkeringen, tabellen, velden en sleutelgegevens uit facturen.
  • Ontvangstbewijs: extraheert tekst en belangrijke informatie uit ontvangstbevestigingen.
  • Id-document: extraheert tekst en belangrijke informatie uit rijbewijs en internationale paspoorten.
  • Visitekaartje: extraheert tekst en belangrijke informatie uit visitekaartjes.

Werk de FormRecognizer-klasse van uw toepassing bij met de volgende code (zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal):


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());
            }
        }
    }
}

Uw toepassing bouwen en uitvoeren

Ga terug naar de hoofdmap van uw project: form-recognizer-app.

  1. Bouw uw toepassing met de build opdracht:
gradle build
  1. Voer uw toepassing uit met de run opdracht:
gradle run

Referentiedocumentatie | Bibliotheekbroncode | Pakket (npm) | Voorbeelden

In deze quickstart gebruikt u de volgende API's om gestructureerde gegevens uit formulieren en documenten te extraheren:

Vereisten

  • Azure-abonnement: Maak een gratis abonnement aan.

  • De nieuwste versie van Visual Studio Code of uw favoriete IDE.

  • De nieuwste LTS-versie van Node.js

  • Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services in Azure Portal om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.

    Tip

    Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.

  • Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:

    Schermopname van sleutels en eindpuntlocatie in Azure Portal.

Instellingen

  1. Een nieuwe Node.js-toepassing maken. Maak in een consolevenster (zoals cmd, PowerShell of Bash) een nieuwe map voor de app, en navigeer naar deze map.

    mkdir form-recognizer-app && cd form-recognizer-app
    
  2. Voer de opdracht npm init uit om een knooppunttoepassing te maken met een package.json-bestand.

    npm init
    
  3. Installeer het npm-pakket voor de ai-form-recognizer clientbibliotheek:

    npm install @azure/ai-form-recognizer
    

    Het package.json-bestand van uw app wordt bijgewerkt met de afhankelijkheden.

  4. Maak een bestand met de naam index.js en importeer de volgende bibliotheken:

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. Maak variabelen voor het Azure-eindpunt en de Azure-sleutel van uw resource:

    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    
  6. Op dit moment moet uw JavaScript-toepassing de volgende coderegels bevatten:

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

Selecteer een codevoorbeeld om in uw toepassing te kopiëren en plakken:

Belangrijk

Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.

Probeer het: Indelingsmodel

  • In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
  • De bestands-URI-waarde is toegevoegd aan de formUrl variabele boven aan het bestand.
  • Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de beginRecognizeContent methode.

Voeg de volgende code toe aan uw indelingstoepassing op de regel onder de key variabele

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);
});

Probeer het: Vooraf samengesteld model

In dit voorbeeld ziet u hoe u gegevens van bepaalde typen algemene documenten kunt analyseren met vooraf getrainde modellen, met behulp van een factuur als voorbeeld. Bekijk onze vooraf samengestelde conceptpagina voor een volledige lijst met factuurvelden

  • In dit voorbeeld analyseren we een factuurdocument met behulp van een vooraf samengesteld model. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
  • De bestands-URI-waarde is toegevoegd aan de invoiceUrl variabele boven aan het bestand.
  • Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de beginRecognizeInvoices methode.
  • Ter vereenvoudiging worden alle velden die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .

Een vooraf samengesteld model kiezen

U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat moet worden gebruikt voor de analysebewerking, is afhankelijk van het type document dat moet worden geanalyseerd. Dit zijn de vooraf gedefinieerde modellen die momenteel worden ondersteund door de Document Intelligence-service:

  • Factuur: extraheert tekst, selectiemarkeringen, tabellen, velden en sleutelgegevens uit facturen.
  • Ontvangstbewijs: extraheert tekst en belangrijke informatie uit ontvangstbevestigingen.
  • Id-document: extraheert tekst en belangrijke informatie uit rijbewijs en internationale paspoorten.
  • Visitekaartje: extraheert tekst en belangrijke informatie uit visitekaartjes.

Voeg de volgende code toe aan uw vooraf samengestelde factuurtoepassing onder de key variabele


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);
});

Referentiedocumentatie | Broncode bibliotheek | Package (PyPi) | Voorbeelden

In deze quickstart gebruikt u de volgende API's om gestructureerde gegevens uit formulieren en documenten te extraheren:

Vereisten

  • Azure-abonnement: Krijg een gratis abonnement

  • Python 3.x

    • Uw Python-installatie moet pip bevatten. U kunt controleren of pip is geïnstalleerd door op de opdrachtregel uit te voeren pip --version . Haal pip op door de nieuwste versie van Python te installeren.
  • Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services in Azure Portal om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.

    Tip

    Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.

  • Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:

    Schermopname van sleutels en eindpuntlocatie in Azure Portal.

Instellingen

Open een terminalvenster in uw lokale omgeving en installeer de Azure AI Document Intelligence-clientbibliotheek voor Python met pip:

pip install azure-ai-formrecognizer

Een nieuwe Python-toepassing maken

Maak een nieuwe Python-toepassing met de naam form_recognizer_quickstart.py in uw favoriete editor of IDE. Importeer vervolgens de volgende bibliotheken:

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

Variabelen maken voor uw Azure-resource-eindpunt en -sleutel

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

Op dit moment moet uw Python-toepassing de volgende regels code bevatten:

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"

Selecteer een codevoorbeeld om in uw toepassing te kopiëren en plakken:

Belangrijk

Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.

Probeer het: Indelingsmodel

  • In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
  • De bestands-URI-waarde is toegevoegd aan de formUrl variabele boven aan het bestand.
  • Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de begin_recognize_content_from_url methode.

Voeg de volgende code toe aan uw indelingstoepassing op de regel onder de key variabele


  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()

Probeer het: Vooraf samengesteld model

In dit voorbeeld ziet u hoe u gegevens van bepaalde typen algemene documenten kunt analyseren met vooraf getrainde modellen, met behulp van een factuur als voorbeeld. Bekijk onze vooraf samengestelde conceptpagina voor een volledige lijst met factuurvelden

  • In dit voorbeeld analyseren we een factuurdocument met behulp van een vooraf samengesteld model. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
  • De bestands-URI-waarde is toegevoegd aan de variabele formUrl bovenaan het bestand.
  • Als u een bepaald bestand wilt analyseren op een URI, gebruikt u de methode ''begin_recognize_invoices_from_url'.
  • Ter vereenvoudiging worden alle velden die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .

Een vooraf samengesteld model kiezen

U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat moet worden gebruikt voor de analysebewerking, is afhankelijk van het type document dat moet worden geanalyseerd. Dit zijn de vooraf gedefinieerde modellen die momenteel worden ondersteund door de Document Intelligence-service:

  • Factuur: extraheert tekst, selectiemarkeringen, tabellen, velden en sleutelgegevens uit facturen.
  • Ontvangstbewijs: extraheert tekst en belangrijke informatie uit ontvangstbevestigingen.
  • Id-document: extraheert tekst en belangrijke informatie uit rijbewijs en internationale paspoorten.
  • Visitekaartje: extraheert tekst en belangrijke informatie uit visitekaartjes.

Voeg de volgende code toe aan uw vooraf samengestelde factuurtoepassing onder de key variabele


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()

Uw toepassing uitvoeren

  1. Navigeer naar de map waar u uw form_recognizer_quickstart.py-bestand hebt.

  2. Typ de volgende opdracht in uw terminal:

python form_recognizer_quickstart.py

| Naslaginformatie voor REST API | voor Azure REST API voor Document Intelligence |

In deze quickstart gebruikt u de volgende API's om gestructureerde gegevens uit formulieren en documenten te extraheren:

Vereisten

  • Azure-abonnement: Krijg een gratis abonnement

  • cURL geïnstalleerd.

  • PowerShell versie 6.0+ of een vergelijkbare opdrachtregeltoepassing.

  • Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services in Azure Portal om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.

    Tip

    Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.

  • Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:

    Schermopname van sleutels en eindpuntlocatie in Azure Portal.

Selecteer een codevoorbeeld om in uw toepassing te kopiëren en plakken:

Belangrijk

Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.

Probeer het: Indelingsmodel

  • In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
  1. Vervang {endpoint} door het eindpunt dat u hebt verkregen door uw Document Intelligence-abonnement.
  2. Vervang {key} door de sleutel die u uit de vorige stap hebt gekopieerd.
  3. Vervang door \"{your-document-url} een voorbeelddocument-URL:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf

Aanvraag

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

U ontvangt een 202 (Success) antwoord met een Operation-Location-header . De waarde van deze header bevat een resultaat-id die u kunt gebruiken om de status van de asynchrone bewerking op te vragen en de resultaten op te halen:

https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.

In het volgende voorbeeld, als onderdeel van de URL, is de tekenreeks hierna analyzeResults/ de resultaat-id.

https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Indelingsresultaten ophalen

Nadat u de Analyze Layout API hebt aangeroepen, roept u de Get Analyze Layout Result API aan om de status van de bewerking en de geëxtraheerde gegevens op te halen. Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:

  1. Vervang {endpoint} door het eindpunt dat u hebt verkregen door uw Document Intelligence-abonnement.
  2. Vervang {key} door de sleutel die u uit de vorige stap hebt gekopieerd.
  3. Vervang {resultId} door de resultaat-id uit de vorige stap.

Aanvraag

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"

De resultaten bekijken

U ontvangt een 200 (success) antwoord met JSON-inhoud.

Bekijk de volgende factuurafbeelding en de bijbehorende JSON-uitvoer.

  • Het knooppunt "readResults" bevat elke tekstregel met het bijbehorende begrenzingsvak op de pagina.
  • Het selectionMarks knooppunt toont elk selectieteken (selectievakje, keuzerondje) en of de status wel selected of unselectedniet is.
  • De "pageResults" sectie bevat de geëxtraheerde tabellen. Voor elke tabel worden de tekst, rij- en kolomindex, rij- en kolomspanning, begrenzingsvak en meer geëxtraheerd.

Document met een Contoso-projectinstructie met een tabel.

Hoofdtekst van de reactie

U kunt de volledige voorbeelduitvoer bekijken op GitHub.

Probeer het: Vooraf samengesteld model

  • In dit voorbeeld analyseren we een factuurdocument met behulp van een vooraf samengesteld model. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.

Een vooraf samengesteld model kiezen

U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat moet worden gebruikt voor de analysebewerking, is afhankelijk van het type document dat moet worden geanalyseerd. Dit zijn de vooraf gedefinieerde modellen die momenteel worden ondersteund door de Document Intelligence-service:

  • Factuur: extraheert tekst, selectiemarkeringen, tabellen, velden en sleutelgegevens uit facturen.
  • Ontvangstbewijs: extraheert tekst en belangrijke informatie uit ontvangstbevestigingen.
  • Id-document: extraheert tekst en belangrijke informatie uit rijbewijs en internationale paspoorten.
  • Visitekaartje: extraheert tekst en belangrijke informatie uit visitekaartjes.

Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:

  1. Vervang {endpoint} door het eindpunt dat u hebt verkregen door uw Document Intelligence-abonnement.

  2. Vervang {key} door de sleutel die u uit de vorige stap hebt gekopieerd.

  3. Vervang door \"{your-document-url} een voorbeeldfactuur-URL:

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

Aanvraag

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

U ontvangt een 202 (Success) antwoord met een Operation-Location-header . De waarde van deze header bevat een resultaat-id die u kunt gebruiken om de status van de asynchrone bewerking op te vragen en de resultaten op te halen:

https:// cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}

In het volgende voorbeeld, als onderdeel van de URL, is de tekenreeks na analyzeResults/ de resultaat-id:

https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Factuurresultaten ophalen

Nadat u de Analyze Invoice API hebt aangeroepen, roept u de Get Analyze Invoice Result API aan om de status van de bewerking en de geëxtraheerde gegevens op te halen. Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:

  1. Vervang {endpoint} door het eindpunt dat u hebt verkregen door uw Document Intelligence-sleutel. U vindt deze op het tabblad Overzicht van documentinformatieresources.
  2. Vervang {resultId} door de resultaat-id uit de vorige stap.
  3. Vervang {key} door uw sleutel.

Aanvraag

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"

Het antwoord bekijken

U ontvangt een 200 (Success) antwoord met JSON-uitvoer.

  • Het "readResults" veld bevat elke tekstregel die is geëxtraheerd uit de factuur.
  • De "pageResults" bevat de tabellen en selectiemarkeringen die zijn geëxtraheerd uit de factuur.
  • Het "documentResults" veld bevat sleutel-/waardegegevens voor de meest relevante onderdelen van de factuur.

Zie het voorbeeldfactuurdocument .

Hoofdtekst van de reactie

Bekijk de volledige voorbeelduitvoer op GitHub.

Dat is het, goed gedaan!

Volgende stappen

  • Voor een verbeterde ervaring en geavanceerde modelkwaliteit kunt u Document Intelligence Studio gebruiken.

    • De Studio ondersteunt elk model dat is getraind met v2.1 gelabelde gegevens.

    • De wijzigingenlogboeken bieden gedetailleerde informatie over het migreren van v3.1 naar v4.0.