Freigeben über


Erste Schritte mit Dokument Intelligenz

Wichtig

  • Die Azure Cognitive Services-Formularerkennung ist jetzt Azure KI Dokument Intelligenz.
  • Einige Plattformen warten noch auf das Update mit der Umbenennung.
  • Alle Erwähnung von Formularerkennung oder Document Intelligence in unserer Dokumentation beziehen sich auf denselben Azure-Dienst.

Dieser Inhalt gilt für: Häkchen Version 4.0 (GA) Frühere Versionen: Blaues Häkchen Version 3.1 (GA) Blaues Häkchen Version 3.0 (GA)

  • Erste Schritte mit der neuesten stabilen Version von Azure KI Dokument Intelligenz V4.0 2024-11-30 (GA).

Dieser Inhalt gilt für: Häkchen Version 3.1 (GA) Frühere Versionen: Blaues Häkchen Version 3.0 Blaues Häkchen Version 2.1

  • Erste Schritte mit der neuesten GA-Version der Azure-Formularerkennung (2023-07-31)

Dieser Inhalt gilt für: Häkchen Version 3.0 (GA) Frühere Versionen: Blaues Häkchen Version 3.1 Blaues Häkchen Version 2.1

  • Erste Schritte mit der neuesten Legacyversion der Azure-Formularerkennung (2022-08-31)
  • Azure KI Dokument Intelligenz und die Azure-Formularerkennung sind cloudbasierte Azure KI-Dienste, die maschinelles Lernen verwenden, um Schlüssel-Wert-Paare, Text, Tabellen und wichtige Daten aus Ihren Dokumenten zu extrahieren.

  • Sie können Dokumentverarbeitungsmodelle ganz einfach in Ihre Workflows und Anwendungen integrieren, indem Sie ein Programmiersprachen-SDK verwenden oder die REST-API aufrufen.

  • Es wird empfohlen, dass Sie den kostenlosen Dienst nutzen, wenn Sie die Technologie für diesen Schnellstart erlernen. Bedenken Sie, dass die Anzahl der kostenlosen Seiten auf 500 pro Monat beschränkt ist.

Weitere Informationen zu API-Features und Entwicklungsoptionen finden Sie auf unserer Übersichtsseite.

In diesem Schnellstart verwenden Sie die folgenden Features, um Daten und Werte in Formularen und Dokumenten zu analysieren und daraus zu extrahieren:

  • Layout-Modell – Analysieren und Extrahieren von Tabellen, Zeilen, Wörtern und Auswahlmarkierungen wie Optionsfelder und Kontrollkästchen in Dokumenten, ohne dass ein Modell trainiert werden muss.

  • Vordefiniertes Modell – Analysieren und Extrahieren von gemeinsamen Feldern aus bestimmten Dokumenttypen mithilfe eines vordefinierten Modells.

Voraussetzungen

  • Eine Azure KI Services- oder Dokument Intelligenz-Ressource. Sobald Ihr Azure-Abonnement vorhanden ist, erstellen Sie im Azure-Portal eine Ressource für einen einzelnen Dienst oder für mehrere Azure KI-Dienste, um Ihren Schlüssel und Endpunkt zu erhalten.

  • Sie können den kostenlosen Tarif (F0) verwenden, um den Dienst zu testen, und später für die Produktion auf einen kostenpflichtigen Tarif upgraden.

Tipp

Erstellen Sie eine Azure KI Services-Ressource, wenn Sie planen, auf mehrere Azure KI Services unter einem einzelnen Endpunkt/Schlüssel zuzugreifen. Erstellen Sie nur für den Zugriff auf Dokument Intelligenz eine Dokument Intelligenz-Ressource. Beachten Sie hierbei, dass Sie eine Ressource mit einem einzelnen Dienst benötigen, falls Sie die Microsoft Entra-Authentifizierung nutzen möchten.

  • Wählen Sie nach der Bereitstellung der Ressource Zu Ressource wechseln aus. Sie benötigen den Schlüssel und Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit der Dokument Intelligenz-API zu verbinden. Der Schlüssel und der Endpunkt werden später in der Schnellstartanleitung in den Code eingefügt.

    Screenshot: Schlüssel und Endpunkt im Azure-Portal

  • Eine Azure KI Services- oder Formularerkennung-Ressource Sobald Ihr Azure-Abonnement vorhanden ist, erstellen Sie im Azure-Portal eine Ressource für einen einzelnen Dienst oder für mehrere Azure KI-Dienste, um Ihren Schlüssel und Endpunkt zu erhalten.

  • Sie können den kostenlosen Tarif (F0) verwenden, um den Dienst zu testen, und später für die Produktion auf einen kostenpflichtigen Tarif upgraden.

Tipp

Erstellen Sie eine Azure KI Services-Ressource, wenn Sie planen, auf mehrere Azure KI Services unter einem einzelnen Endpunkt/Schlüssel zuzugreifen. Erstellen Sie eine Formularerkennungsressource, falls nur auf die Formularerkennung zugegriffen werden soll. Beachten Sie hierbei, dass Sie eine Ressource mit einem einzelnen Dienst benötigen, falls Sie die Microsoft Entra-Authentifizierung nutzen möchten.

  • Wählen Sie nach der Bereitstellung der Ressource Zu Ressource wechseln aus. Sie benötigen den Schlüssel und Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit der Formularerkennungs-API zu verbinden. Der Schlüssel und der Endpunkt werden später in der Schnellstartanleitung in den Code eingefügt.

    Screenshot: Schlüssel und Endpunkt im Azure-Portal

Einrichten

  1. Starten Sie Visual Studio.

  2. Wählen Sie auf der Startseite Neues Projekt erstellen aus.

    Screenshot der Visual Studio-Startseite

  3. Geben Sie auf der Seite Neues Projekt erstellen die Angabe Konsole in das Suchfeld ein. Wählen Sie die Vorlage Konsolenanwendung und dann Weiter aus.

    Screenshot der Seite „Neues Projekt erstellen“ von Visual Studio

  1. Geben Sie im Dialogfeld Neues Projekt konfigurieren im Feld für den Projektnamen den Namen doc_intel_quickstart ein. Klicken Sie dann auf Weiter.
  1. Geben Sie im Dialogfeld Neues Projekt konfigurieren im Feld für den Projektnamen den Namen form_recognizer_quickstart ein. Klicken Sie dann auf Weiter.
  1. Wählen Sie im Dialogfenster Zusätzliche Informationen die Option .NET 8.0 (Langzeitunterstützung), und wählen Sie dann Erstellen.

    Screenshot des Dialogfensters für zusätzliche Informationen von Visual Studio

Installieren der Clientbibliothek mit NuGet

  1. Klicken Sie mit der rechten Maustaste auf Ihr Projekt doc_intel_quickstart, und wählen Sie NuGet-Pakete verwalten... aus.

    Screenshot des Fensters zum Auswählen des NuGet-Prerelease-Pakets in Visual Studio

  2. Wählen Sie die Registerkarte Durchsuchen aus, und geben Sie Azure.AI.DocumentIntelligence ein.

  3. Aktivieren Sie das Kontrollkästchen Include prerelease.

    Screenshot der Auswahl eines NuGet-Vorabversionspakets in Visual Studio.

  4. Wählen Sie im Dropdownmenü eine Version aus, und installieren Sie das Paket in Ihrem Projekt.

  1. Klicken Sie mit der rechten Maustaste auf das Projekt form_recognizer_quickstart, und wählen Sie die Option NuGet-Pakete verwalten... aus.

    Screenshot des Fensters zum Suchen des NuGet-Pakets in Visual Studio

  2. Wählen Sie die Registerkarte Durchsuchen aus, und geben Sie Azure.AI.FormRecognizer ein. Version 4.1.0 im Dropdownmenü auswählen

    Screenshot der Auswahl des NuGet-Pakets für die Formularerkennung in Visual Studio

  1. Klicken Sie mit der rechten Maustaste auf das Projekt form_recognizer_quickstart, und wählen Sie die Option NuGet-Pakete verwalten... aus.

    Screenshot des Fensters für das NuGet-Paket in Visual Studio

  2. Wählen Sie die Registerkarte Durchsuchen aus, und geben Sie Azure.AI.FormRecognizer ein. Version 4.0.0 im Dropdownmenü auswählen

    Screenshot der Auswahl des NuGet-Legacypakets in Visual Studio

Erstellen Ihrer Anwendung

Für die Interaktion mit dem Dokument Intelligenz-Dienst müssen Sie eine Instanz der DocumentIntelligenceClient-Klasse erstellen. Hierzu erstellen Sie ein AzureKeyCredential mit Ihrem key im Azure-Portal sowie eine DocumentIntelligenceClient-Instanz mit der AzureKeyCredential und Ihrem Dokument Intelligenz-endpoint.

Für die Interaktion mit dem Dienst „Formularerkennung“ müssen Sie eine Instanz der DocumentAnalysisClient-Klasse erstellen. Hierzu erstellen Sie ein AzureKeyCredential-Element mit Ihrem key-Element im Azure-Portal sowie eine DocumentAnalysisClient-Instanz mit AzureKeyCredential und dem Endpunkt (endpoint) der Formularerkennung.

Hinweis

  • Ab .NET 6 erzeugen neue Projekte, die die Vorlage console verwenden, einen neuen Programmstil, der sich von früheren Versionen unterscheidet.
  • Die neue Ausgabe verwendet aktuelle C#-Funktionen, die den zu schreibenden Code vereinfachen.
  • Wenn Sie die neuere Version verwenden, müssen Sie nur den Text der Main-Methode schreiben. Sie müssen keine Top-Level-Anweisungen, globale Nutzungsanweisungen oder indirekte Nutzungsanweisungen einfügen.
  • Weitere Informationen finden Sie unter Neue C#-Vorlagen generieren übergeordnete Anweisungen.
  1. Öffnen Sie die Datei Program.cs.

  2. Löschen Sie den vorhandenen Code, einschließlich der Zeile Console.Writeline("Hello World!"), und wählen Sie eines der folgenden Codebeispiele aus, um es zu kopieren und in die Datei „Program.cs“ Ihrer Anwendung einzufügen:

Wichtig

Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und ihn niemals zu veröffentlichen. Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Für weitere Informationen lesen Sie Azure KI Services-Sicherheit.

Layoutmodell

Extrahieren von Text, Auswahlmarkierungen, Textstilen, Tabellenstrukturen und Koordinaten von Begrenzungsbereichen aus Dokumenten.

  • Für dieses Beispiel benötigen Sie eine Dokumentdatei von einem URI. Für diesen Schnellstart können Sie das Beispieldokument verwenden.
  • Wir haben den URI-Wert der Datei in die Variable Uri fileUri am Anfang des Skripts eingefügt.
  • Verwenden Sie zum Extrahieren des Layouts aus einer bestimmten Datei unter einem URI die StartAnalyzeDocumentFromUri-Methode, und übergeben Sie prebuilt-layout als Modell-ID. Der zurückgegebene Wert ist ein AnalyzeResult-Objekt mit Daten aus dem übermittelten Dokument.

Fügen Sie das folgende Codebeispiel in die Datei „Program.cs“ ein. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren:


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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Schaltfläche Start neben „formRecognizer_quickstart“ aus, um Ihre Programm zu erstellen und auszuführen, oder drücken Sie F5.

Screenshot der Schaltfläche für die Ausführung Ihres Visual Studio-Programms

Fügen Sie das folgende Codebeispiel in die Datei „Program.cs“ ein. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Formularerkennungsinstanz im Azure-Portal aktualisieren:

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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Schaltfläche Start neben „formRecognizer_quickstart“ aus, um Ihre Programm zu erstellen und auszuführen, oder drücken Sie F5.

Screenshot der Position der Schaltfläche für die Ausführung Ihres Visual Studio-Programms

Ausgabe des Layoutmodells

Hier sehen Sie einen Codeausschnitt der erwarteten Ausgabe:

  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

Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Repository mit Azure-Beispielen auf GitHub, um die Ausgabe des Layoutmodells anzuzeigen.

Fügen Sie das folgende Codebeispiel in die Datei „Program.cs“ ein. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Formularerkennungsinstanz im Azure-Portal aktualisieren:

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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Schaltfläche Start neben „formRecognizer_quickstart“ aus, um Ihre Programm zu erstellen und auszuführen, oder drücken Sie F5.

Screenshot: Ausführen Ihres Visual Studio-Programms

Vordefiniertes Modell

Analysieren und Extrahieren von gemeinsamen Feldern aus bestimmten Dokumenttypen mithilfe eines vordefinierten Modells. In diesem Beispiel analysieren Sie eine Rechnung mithilfe des vordefinierten Rechnungsmodells (prebuilt-invoice).

Tipp

Sie sind hierbei nicht auf Rechnungen beschränkt, sondern können zwischen mehreren vordefinierten Modellen wählen, von denen jedes über eine Gruppe unterstützter Felder verfügt. Welches Modell für den analyze-Vorgang verwendet wird, hängt vom Typ des zu analysierenden Dokuments ab. Weitere Informationen finden Sie unter Extrahieren von Modelldaten.

  • Analysieren einer Rechnung mithilfe des vordefinierten Rechnungsmodells (prebuilt-invoice). Für diese Schnellstartanleitung können Sie unser Beispiel für ein Rechnungsdokument verwenden.
  • Wir haben den Datei-URI-Wert zur Variable Uri invoiceUri am Anfang der Datei Program.cs hinzugefügt.
  • Verwenden Sie zum Analysieren einer bestimmten Datei unter einem URI die StartAnalyzeDocumentFromUri-Methode, und übergeben Sie prebuilt-invoice als Modell-ID. Der zurückgegebene Wert ist ein AnalyzeResult-Objekt mit Daten aus dem übermittelten Dokument.
  • Der Einfachheit halber werden hier nicht alle Schlüssel-Wert-Paare angezeigt, die der Dienst zurückgibt. Eine Liste aller unterstützten Felder mit den entsprechenden Typen finden Sie auf der Konzeptseite Rechnung.

Fügen Sie das folgende Codebeispiel in Ihre Datei „Program.cs“ ein. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren:


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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Schaltfläche Start neben „formRecognizer_quickstart“ aus, um Ihre Programm zu erstellen und auszuführen, oder drücken Sie F5.

Screenshot der Schaltfläche für die Ausführung Ihres Visual Studio-Programms

Fügen Sie das folgende Codebeispiel in Ihre Datei „Program.cs“ ein. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Formularerkennungsinstanz im Azure-Portal aktualisieren:


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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Schaltfläche Start neben „formRecognizer_quickstart“ aus, um Ihre Programm zu erstellen und auszuführen, oder drücken Sie F5.

Screenshot der Position der Schaltfläche für die Ausführung Ihres Visual Studio-Programms

Ausgabe des vordefinierten Modells

Hier sehen Sie einen Codeausschnitt der erwarteten Ausgabe:

  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

Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Repository mit Azure-Beispielen auf GitHub, um die Ausgabe des vordefinierten Rechnungsmodells anzuzeigen.

Fügen Sie das folgende Codebeispiel in Ihre Datei „Program.cs“ ein. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Formularerkennungsinstanz im Azure-Portal aktualisieren:


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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Schaltfläche Start neben „formRecognizer_quickstart“ aus, um Ihre Programm zu erstellen und auszuführen, oder drücken Sie F5.

Screenshot: Ausführen Ihres Visual Studio-Programms

In diesem Schnellstart verwenden Sie die folgenden Features, um Daten und Werte in Formularen und Dokumenten zu analysieren und daraus zu extrahieren:

  • Layout – Analysieren und Extrahieren von Tabellen, Zeilen, Wörtern und Auswahlmarkierungen, z. B. Optionsfelder und Kontrollkästchen in Dokumenten, ohne ein Modell trainieren zu müssen.

  • Beispielrechnung – Analysieren und Extrahieren gemeinsamer Felder aus bestimmten Dokumenttypen mithilfe eines vorab trainierten Modells.

Voraussetzungen

  • Azure-Abonnement – Erstellen eines kostenlosen Kontos

  • Die aktuelle Version von Visual Studio Code oder Ihrer bevorzugten IDE Weitere Informationen finden Sie unter Java in Visual Studio Code.

    Tipp

    • Visual Studio Code bietet ein Coding Pack für Java für Windows und macOS. Das Coding Pack ist ein Paket aus VS Code, dem Java Development Kit (JDK) und einer Sammlung vorgeschlagener Erweiterungen von Microsoft. Das Coding Pack kann auch verwendet werden, um eine vorhandene Entwicklungsumgebung zu korrigieren.
    • Wenn Sie VS Code Code Pack für Java verwenden, installieren Sie die Erweiterung Gradle für Java.
  • Wenn Sie nicht Visual Studio Code verwenden, stellen Sie sicher, dass Folgendes in Ihrer Entwicklungsumgebung installiert ist:

  • Eine Azure KI Services- oder Dokument Intelligenz-Ressource. Sobald Sie über Ihr Azure-Abonnement verfügen, erstellen Sie im Azure-Portal eine Dokument Intelligenz-Ressource für einen einzelnen Dienst oder für mehrere Dienste, um Ihren Schlüssel und Endpunkt zu erhalten. Sie können den kostenlosen Tarif (F0) verwenden, um den Dienst zu testen, und später für die Produktion auf einen kostenpflichtigen Tarif upgraden.

    Tipp

    Erstellen Sie eine Azure KI Services-Ressource, wenn Sie planen, auf mehrere Azure KI Services unter einem einzelnen Endpunkt/Schlüssel zuzugreifen. Erstellen Sie nur für den Zugriff auf Dokument Intelligenz eine Dokument Intelligenz-Ressource. Beachten Sie hierbei, dass Sie eine Ressource mit einem einzelnen Dienst benötigen, falls Sie die Microsoft Entra-Authentifizierung nutzen möchten.

  • Wählen Sie nach der Bereitstellung der Ressource Zu Ressource wechseln aus. Sie benötigen den Schlüssel und Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit der Dokument Intelligenz-API zu verbinden. Zu einem späteren Zeitpunkt fügen Sie Ihren Schlüssel und den Endpunkt in den Code ein:

    Screenshot: Schlüssel und Endpunkt im Azure-Portal

Einrichten

Erstellen eines neuen Gradle-Projekts

  1. Erstellen Sie in einem Konsolenfenster (z. B. einer Eingabeaufforderung, PowerShell oder Bash) ein neues Verzeichnis für Ihre neue App mit dem Namen doc-intel-app, und navigieren Sie zu dem Verzeichnis.

    mkdir doc-intel-app && doc-intel-app
    
    mkdir doc-intel-app; cd doc-intel-app
    
  2. Führen Sie den Befehl gradle init in Ihrem Arbeitsverzeichnis aus. Mit diesem Befehl werden grundlegende Builddateien für Gradle erstellt, u. a. die Datei build.gradle.kts. Diese Datei wird zur Laufzeit zum Erstellen und Konfigurieren Ihrer Anwendung verwendet.

    gradle init --type basic
    
  3. Wenn Sie zur Auswahl einer DSL aufgefordert werden, wählen Sie Kotlin aus.

  4. Übernehmen Sie den Standardprojektnamen (doc-intel-app), indem Sie Return oder die EINGABETASTE auswählen.

  1. Erstellen Sie in einem Konsolenfenster (z. B. cmd, PowerShell oder Bash) ein neues Verzeichnis für Ihre App mit dem Namen form-recognize-app, und navigieren Sie zu diesem Verzeichnis.

    mkdir form-recognize-app && form-recognize-app
    
    mkdir form-recognize-app; cd form-recognize-app
    
  2. Führen Sie den Befehl gradle init in Ihrem Arbeitsverzeichnis aus. Mit diesem Befehl werden grundlegende Builddateien für Gradle erstellt, u. a. die Datei build.gradle.kts. Diese Datei wird zur Laufzeit zum Erstellen und Konfigurieren Ihrer Anwendung verwendet.

    gradle init --type basic
    
  3. Wenn Sie zur Auswahl einer DSL aufgefordert werden, wählen Sie Kotlin aus.

  4. Akzeptieren Sie den Standardprojektnamen (form-recognize-app) durch Betätigen der RETURN- bzw. EINGABETASTE.

Installieren der Clientbibliothek

In dieser Schnellstartanleitung wird der Gradle-Abhängigkeits-Manager verwendet. Die Clientbibliothek und Informationen zu anderen Abhängigkeits-Managern finden Sie im zentralen Maven-Repository.

Öffnen Sie die Datei build.gradle.kts des Projekts in Ihrer IDE. Fügen Sie in die Datei implementationbuild.gradle.kts Ihres Projekts die Clientbibliothek als -Anweisung sowie die erforderlichen Plug-Ins und Einstellungen ein.

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

   }

In dieser Schnellstartanleitung wird der Gradle-Abhängigkeits-Manager verwendet. Die Clientbibliothek und Informationen zu anderen Abhängigkeits-Managern finden Sie im zentralen Maven-Repository.

Öffnen Sie die Datei build.gradle.kts des Projekts in Ihrer IDE. Fügen Sie in die Datei implementationbuild.gradle.kts Ihres Projekts die Clientbibliothek als -Anweisung sowie die erforderlichen Plug-Ins und Einstellungen ein.

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

   }

In dieser Schnellstartanleitung wird der Gradle-Abhängigkeits-Manager verwendet. Die Clientbibliothek und Informationen zu anderen Abhängigkeits-Managern finden Sie im zentralen Maven-Repository.

Öffnen Sie die Datei build.gradle.kts des Projekts in Ihrer IDE. Fügen Sie in die Datei implementationbuild.gradle.kts Ihres Projekts die Clientbibliothek als -Anweisung sowie die erforderlichen Plug-Ins und Einstellungen ein.

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


   }

Erstellen einer Java-Anwendung

Für die Interaktion mit dem Dokument Intelligenz-Dienst müssen Sie eine Instanz der DocumentIntelligenceClient-Klasse erstellen. Hierzu erstellen Sie ein AzureKeyCredential mit Ihrem key im Azure-Portal sowie eine DocumentIntelligenceClient-Instanz mit der AzureKeyCredential und Ihrem Dokument Intelligenz-endpoint.

Für die Interaktion mit dem Dokument Intelligenz-Dienst müssen Sie eine Instanz der DocumentAnalysisClient-Klasse erstellen. Hierzu erstellen Sie ein AzureKeyCredential mit Ihrem key im Azure-Portal sowie eine DocumentAnalysisClient-Instanz mit der AzureKeyCredential und Ihrem Dokument Intelligenz-endpoint.

  1. Führen Sie im Verzeichnis „doc-intel-app“ den folgenden Befehl aus:

    mkdir -p src/main/java
    

    Sie erstellen die folgende Verzeichnisstruktur:

    Screenshot der Verzeichnisstruktur von Java

  1. Navigieren Sie zum java-Verzeichnis, und erstellen Sie eine Datei namens DocIntelligence.java.

    Tipp

    • Sie können eine neue Datei mithilfe von PowerShell erstellen.
    • Öffnen Sie ein PowerShell-Fenster in Ihrem Projektverzeichnis, indem Sie die UMSCHALTTASTE gedrückt halten und mit der rechten Maustaste auf den Ordner klicken.
    • Geben Sie den Befehl New-Item DocIntelligence.java ein.
  2. Öffnen Sie die Datei DocIntelligence.java . Kopieren Sie eines der folgenden Codebeispiele, und fügen Sie es in Ihre Anwendung ein:

  1. Navigieren Sie zum java-Verzeichnis, und erstellen Sie eine Datei namens FormRecognizer.java.

    Tipp

    • Sie können eine neue Datei mithilfe von PowerShell erstellen.
    • Öffnen Sie ein PowerShell-Fenster in Ihrem Projektverzeichnis, indem Sie die UMSCHALTTASTE gedrückt halten und mit der rechten Maustaste auf den Ordner klicken.
    • Geben Sie in Ihrem Terminal den folgenden Befehl ein:
  2. Öffnen Sie die Datei FormRecognizer.java . Kopieren Sie eines der folgenden Codebeispiele, und fügen Sie es in Ihre Anwendung ein:

Wichtig

Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und ihn niemals zu veröffentlichen. Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Für weitere Informationen lesen Sie Azure KI Services-Sicherheit.

Layoutmodell

Extrahieren von Text, Auswahlmarkierungen, Textstilen, Tabellenstrukturen und Koordinaten von Begrenzungsbereichen aus Dokumenten.

  • Für dieses Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Für diesen Schnellstart können Sie das Beispieldokument verwenden.
  • Um eine bestimmte Datei an einem URI zu analysieren, verwenden Sie die beginAnalyzeDocumentFromUrl-Methode und übergeben prebuilt-layout als Modell-ID. Der Rückgabewert ist ein AnalyzeResult-Objekt, das Daten zum übermittelten Dokument enthält.
  • Wir haben den Datei-URI-Wert der Variablen documentUrl in der main-Methode hinzugefügt.

Fügen Sie der Datei DocIntelligence.java das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren:


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

Erstellen und Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zu Ihrem Hauptprojektverzeichnis doc-intel-app.

  1. Erstellen Sie Ihre Anwendung mit dem Befehl build:

    gradle build
    
  2. Führen Sie Ihre Anwendung mit dem Befehl run aus:

    gradle run
    

Fügen Sie der Datei FormRecognizer.java das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren:


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

Erstellen und Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zu Ihrem Hauptprojektverzeichnis form-recognize-app.

  1. Erstellen Sie Ihre Anwendung mit dem Befehl build:

    gradle build
    
  2. Führen Sie Ihre Anwendung mit dem Befehl run aus:

    gradle run
    

Ausgabe des Layoutmodells

Hier sehen Sie einen Codeausschnitt der erwarteten Ausgabe:

  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.

Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Repository mit Azure-Beispielen auf GitHub, um die Ausgabe des Layoutmodells anzuzeigen.

Fügen Sie der Datei FormRecognizer.java das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren:


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

Erstellen und Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zu Ihrem Hauptprojektverzeichnis form-recognize-app.

  1. Erstellen Sie Ihre Anwendung mit dem Befehl build:

    gradle build
    
  2. Führen Sie Ihre Anwendung mit dem Befehl run aus:

    gradle run
    

Vordefiniertes Modell

Analysieren und Extrahieren von gemeinsamen Feldern aus bestimmten Dokumenttypen mithilfe eines vordefinierten Modells. In diesem Beispiel analysieren Sie eine Rechnung mithilfe des vordefinierten Rechnungsmodells (prebuilt-invoice).

Tipp

Sie sind hierbei nicht auf Rechnungen beschränkt, sondern können zwischen mehreren vordefinierten Modellen wählen, von denen jedes über eine Gruppe unterstützter Felder verfügt. Welches Modell für den analyze-Vorgang verwendet wird, hängt vom Typ des zu analysierenden Dokuments ab. Weitere Informationen finden Sie unter Extrahieren von Modelldaten.

  • Analysieren einer Rechnung mithilfe des vordefinierten Rechnungsmodells (prebuilt-invoice). Für diese Schnellstartanleitung können Sie unser Beispiel für ein Rechnungsdokument verwenden.
  • Der Wert der Datei-URL wurde der Variable invoiceUrl oben in der Datei hinzugefügt.
  • Um eine bestimmte Datei an einem URI zu analysieren, verwenden Sie die beginAnalyzeDocuments-Methode und übergeben PrebuiltModels.Invoice als Modell-ID. Der Rückgabewert ist ein result-Objekt, das Daten zum übermittelten Dokument enthält.
  • Der Einfachheit halber werden hier nicht alle Schlüssel-Wert-Paare angezeigt, die der Dienst zurückgibt. Eine Liste aller unterstützten Felder mit den entsprechenden Typen finden Sie auf der Konzeptseite Rechnung.

Fügen Sie der Datei DocIntelligence.java das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren:


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

Erstellen und Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zu Ihrem Hauptprojektverzeichnis doc-intel-app.

  1. Erstellen Sie Ihre Anwendung mit dem Befehl build:

    gradle build
    
  2. Führen Sie Ihre Anwendung mit dem Befehl run aus:

    gradle run
    

Fügen Sie der Datei FormRecognizer.java das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren:


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

Erstellen und Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zu Ihrem Hauptprojektverzeichnis doc-intel-app.

  1. Erstellen Sie Ihre Anwendung mit dem Befehl build:

    gradle build
    
  2. Führen Sie Ihre Anwendung mit dem Befehl run aus:

    gradle run
    

Ausgabe des vordefinierten Modells

Hier sehen Sie einen Codeausschnitt der erwarteten Ausgabe:

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

Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Repository mit Azure-Beispielen auf GitHub, um die Ausgabe des vordefinierten Rechnungsmodells anzuzeigen.

Fügen Sie der Datei FormRecognizer.java das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren:


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

Erstellen und Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zu Ihrem Hauptprojektverzeichnis doc-intel-app.

  1. Erstellen Sie Ihre Anwendung mit dem Befehl build:

    gradle build
    
  2. Führen Sie Ihre Anwendung mit dem Befehl run aus:

    gradle run
    

In diesem Schnellstart verwenden Sie die folgenden Features, um Daten und Werte in Formularen und Dokumenten zu analysieren und daraus zu extrahieren:

  • Layout: Analysieren und Extrahieren von Tabellen, Zeilen, Wörtern und Auswahlmarkierungen, z. B. Optionsfelder und Kontrollkästchen in Dokumenten, ohne ein Modell trainieren zu müssen.

  • Beispielrechnung – Analysieren und Extrahieren gemeinsamer Felder aus bestimmten Dokumenttypen mithilfe eines vorab trainierten Rechnungsmodells.

Voraussetzungen

  • Azure-Abonnement – Erstellen eines kostenlosen Kontos

  • Die aktuelle Version von Visual Studio Code oder Ihrer bevorzugten IDE Weitere Informationen finden Sie unter Node.js in Visual Studio Code.

  • Die aktuelle LTS-Version von Node.js

  • Eine Azure KI Services- oder Dokument Intelligenz-Ressource. Sobald Sie über Ihr Azure-Abonnement verfügen, erstellen Sie im Azure-Portal eine Dokument Intelligenz-Ressource für einen einzelnen Dienst oder für mehrere Dienste, um Ihren Schlüssel und Endpunkt zu erhalten. Sie können den kostenlosen Tarif (F0) verwenden, um den Dienst zu testen, und später für die Produktion auf einen kostenpflichtigen Tarif upgraden.

    Tipp

    Erstellen Sie eine Azure KI Services-Ressource, wenn Sie planen, auf mehrere Azure KI Services unter einem einzelnen Endpunkt/Schlüssel zuzugreifen. Erstellen Sie nur für den Zugriff auf Dokument Intelligenz eine Dokument Intelligenz-Ressource. Beachten Sie hierbei, dass Sie eine Ressource mit einem einzelnen Dienst benötigen, falls Sie die Microsoft Entra-Authentifizierung nutzen möchten.

  • Wählen Sie nach der Bereitstellung der Ressource Zu Ressource wechseln aus. Sie benötigen den Schlüssel und Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit der Dokument Intelligenz-API zu verbinden. Der Schlüssel und der Endpunkt werden später in der Schnellstartanleitung in den Code eingefügt.

    Screenshot: Schlüssel und Endpunkt im Azure-Portal

Einrichten

  1. Erstellen einer neuen Node.js Express-Anwendung: Erstellen Sie in einem Konsolenfenster (etwa cmd, PowerShell oder Bash) ein neues Verzeichnis für Ihre App namens doc-intel-app, und wechseln Sie in dieses Verzeichnis.

    mkdir doc-intel-app && cd doc-intel-app
    
  2. Führen Sie den npm init Befehl aus, um die Anwendung zu initialisieren und ihr Projekt zu gerüsten.

    npm init
    
  3. Geben Sie die Attribute Ihres Projekts an, indem Sie die im Terminal angezeigten Eingabeaufforderungen verwenden.

    • Die wichtigsten Attribute sind Name, Versionsnummer und Einstiegspunkt.
    • Es wird empfohlen, index.js den Namen des Einstiegspunkts zu behalten. Beschreibung, Testbefehl, GitHub-Repository, Schlüsselwörter, Autor und Lizenzinformationen sind optionale Attribute, die Sie für dieses Projekt überspringen können.
    • Akzeptieren Sie die Vorschläge in Klammern, indem Sie Zurückgeben oder eingebenauswählen.
    • Nachdem Sie die Eingabeaufforderungen durchlaufen haben, wird im Verzeichnis „doc-intel-app“ die Datei package.json erstellt.
  1. Installieren Sie das npm-Paket der Clientbibliothek ai-document-intelligence:azure/identity

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

    Die Datei package.json Ihrer App wird mit den Abhängigkeiten aktualisiert.

  1. Installieren Sie das npm-Paket der Clientbibliothek ai-form-recognizer:azure/identity

    npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
    
    • Die Datei package.json Ihrer App wird mit den Abhängigkeiten aktualisiert.
  1. Installieren Sie das npm-Paket der Clientbibliothek ai-form-recognizer:azure/identity

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. Erstellen Sie eine Datei index.jsmit der Bezeichnung Web.config im Anwendungsverzeichnis.

    Tipp

    • Sie können eine neue Datei mithilfe von PowerShell erstellen.
    • Öffnen Sie ein PowerShell-Fenster in Ihrem Projektverzeichnis, indem Sie die UMSCHALTTASTE gedrückt halten und mit der rechten Maustaste auf den Ordner klicken.
    • Geben Sie in Ihrem Terminal den folgenden Befehl ein:

Erstellen Ihrer Anwendung

Für die Interaktion mit dem Dokument Intelligenz-Dienst müssen Sie eine Instanz der DocumentIntelligenceClient-Klasse erstellen. Hierzu erstellen Sie ein AzureKeyCredential mit Ihrem key im Azure-Portal sowie eine DocumentIntelligenceClient-Instanz mit der AzureKeyCredential und Ihrem Dokument Intelligenz-endpoint.

Für die Interaktion mit dem Dokument Intelligenz-Dienst müssen Sie eine Instanz der DocumentAnalysisClient-Klasse erstellen. Hierzu erstellen Sie ein AzureKeyCredential-Element mit Ihrem key-Element im Azure-Portal sowie eine DocumentAnalysisClient-Instanz mit AzureKeyCredential und dem Endpunkt (endpoint) der Formularerkennung.

  1. index.jsVisual Studio Code oder Ihre bevorzugte IDE Kopieren Sie eines der folgenden Codebeispiele, und fügen Sie es in Ihre Anwendung ein:

Wichtig

Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und ihn niemals zu veröffentlichen. Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Für weitere Informationen lesen Sie Azure KI Services-Sicherheit.

Layoutmodell

Extrahieren von Text, Auswahlmarkierungen, Textstilen, Tabellenstrukturen und Koordinaten von Begrenzungsbereichen aus Dokumenten.

  • Für dieses Beispiel benötigen Sie eine Dokumentdatei von einer URL. Für diesen Schnellstart können Sie das Beispieldokument verwenden.
  • Sie haben den Datei-URI-Wert der Variable formUrl im oberen Bereich der Datei hinzugefügt.
  • Verwenden Sie zum Analysieren einer bestimmten Datei unter einem URI die beginAnalyzeDocuments-Methode, und übergeben Sie prebuilt-layout als Modell-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);
});

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, führen Sie Ihr Programm aus:

  1. Navigieren Sie zu dem Ordner, in dem Ihre Dokument Intelligenz-Anwendung (doc-intel-app) installiert ist.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

    node index.js
    

Fügen Sie der Datei index.js das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren:


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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, führen Sie Ihr Programm aus:

  1. Navigieren Sie zu dem Ordner, in dem Ihre Dokument Intelligenz-Anwendung (doc-intel-app) installiert ist.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

    node index.js
    

Ausgabe des Layoutmodells

Hier sehen Sie einen Codeausschnitt der erwarteten Ausgabe:

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

Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Repository mit Azure-Beispielen auf GitHub, um die Ausgabe des Layoutmodells anzuzeigen.

Vordefiniertes Modell

In diesem Beispiel analysieren Sie eine Rechnung mithilfe des vordefinierten Rechnungsmodells (prebuilt-invoice).

Tipp

Sie sind hierbei nicht auf Rechnungen beschränkt, sondern können zwischen mehreren vordefinierten Modellen wählen, von denen jedes über eine Gruppe unterstützter Felder verfügt. Welches Modell für den analyze-Vorgang verwendet wird, hängt vom Typ des zu analysierenden Dokuments ab. Weitere Informationen finden Sie unter Extrahieren von Modelldaten.

  • Analysieren einer Rechnung mithilfe des vordefinierten Rechnungsmodells (prebuilt-invoice). Für diese Schnellstartanleitung können Sie unser Beispiel für ein Rechnungsdokument verwenden.
  • Der Wert der Datei-URL wurde der Variable invoiceUrl oben in der Datei hinzugefügt.
  • Um eine bestimmte Datei an einem URI zu analysieren, verwenden Sie die beginAnalyzeDocuments-Methode und übergeben PrebuiltModels.Invoice als Modell-ID. Der Rückgabewert ist ein result-Objekt, das Daten zum übermittelten Dokument enthält.
  • Der Einfachheit halber werden hier nicht alle Schlüssel-Wert-Paare angezeigt, die der Dienst zurückgibt. Eine Liste aller unterstützten Felder mit den entsprechenden Typen finden Sie auf der Konzeptseite Rechnung.

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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, führen Sie Ihr Programm aus:

  1. Navigieren Sie zu dem Ordner, in dem Ihre Dokument Intelligenz-Anwendung (doc-intel-app) installiert ist.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, führen Sie Ihr Programm aus:

  1. Navigieren Sie zu dem Ordner, in dem Ihre Dokument Intelligenz-Anwendung (doc-intel-app) installiert ist.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

    node index.js
    

Ausgabe des vordefinierten Modells

Hier sehen Sie einen Codeausschnitt der erwarteten Ausgabe:

  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

Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Repository mit Azure-Beispielen auf GitHub, um die Ausgabe des vordefinierten Rechnungsmodells anzuzeigen.

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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, führen Sie Ihr Programm aus:

  1. Navigieren Sie zu dem Ordner, in dem Ihre Dokument Intelligenz-Anwendung (doc-intel-app) installiert ist.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

    node index.js
    

In diesem Schnellstart verwenden Sie die folgenden Features, um Daten in Formularen und Dokumenten zu analysieren und daraus zu extrahieren:

  • Layout: Analysieren und Extrahieren von Tabellen, Zeilen, Wörtern und Auswahlmarkierungen, z. B. Optionsfelder und Kontrollkästchen und Schlüssel-Wert-Paaren, ohne ein Modell trainieren zu müssen.

  • Beispielrechnung – Analysieren und Extrahieren gemeinsamer Felder aus bestimmten Dokumenttypen mithilfe eines vorab trainierten Modells.

Voraussetzungen

  • Azure-Abonnement – Erstellen eines kostenlosen Kontos

  • Python 3.7 oder höher.

    • Ihre Python-Installation sollte pip enthalten. Sie können überprüfen, ob pip installiert ist, indem Sie pip --version in der Befehlszeile ausführen. Installieren Sie die aktuelle Python-Version, um pip zu erhalten.
  • Die aktuelle Version von Visual Studio Code oder Ihrer bevorzugten IDE Weitere Informationen finden Sie unter Erste Schritte mit Python in Visual Studio Code.

  • Eine Azure KI Services- oder Dokument Intelligenz-Ressource. Sobald Sie über Ihr Azure-Abonnement verfügen, erstellen Sie im Azure-Portal eine Dokument Intelligenz-Ressource für einen einzelnen Dienst oder für mehrere Dienste, um Ihren Schlüssel und Endpunkt zu erhalten. Sie können den kostenlosen Tarif (F0) verwenden, um den Dienst zu testen, und später für die Produktion auf einen kostenpflichtigen Tarif upgraden.

Tipp

Erstellen Sie eine Azure KI Services-Ressource, wenn Sie planen, auf mehrere Azure KI Services unter einem einzelnen Endpunkt/Schlüssel zuzugreifen. Erstellen Sie nur für den Zugriff auf Dokument Intelligenz eine Dokument Intelligenz-Ressource. Beachten Sie hierbei, dass Sie eine Ressource mit einem einzelnen Dienst benötigen, falls Sie die Microsoft Entra-Authentifizierung nutzen möchten.

  • Wählen Sie nach der Bereitstellung der Ressource Zu Ressource wechseln aus. Sie benötigen den Schlüssel und Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit der Dokument Intelligenz-API zu verbinden. Der Schlüssel und der Endpunkt werden später in der Schnellstartanleitung in den Code eingefügt.

    Screenshot: Schlüssel und Endpunkt im Azure-Portal

Einrichten

Öffnen Sie in Ihrer lokalen Umgebung ein Terminalfenster, und installieren Sie die Azure KI Dokument Intelligenz-Clientbibliothek für Python mit 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

Erstellen Ihrer Python-Anwendung

Für die Interaktion mit dem Dokument Intelligenz-Dienst müssen Sie eine Instanz der DocumentIntelligenceClient-Klasse erstellen. Hierzu erstellen Sie ein AzureKeyCredential mit Ihrem key im Azure-Portal sowie eine DocumentIntelligenceClient-Instanz mit der AzureKeyCredential und Ihrem Dokument Intelligenz-endpoint.

  1. Erstellen Sie eine neue Python-Datei namens doc_intel_quickstart.py in Ihrem bevorzugten Editor oder Ihrer bevorzugten IDE.

  2. Öffnen Sie die Datei doc_intel_quickstart.py, und wählen Sie eins der folgenden Codebeispiele aus, das Sie kopieren und in Ihre Anwendung einfügen möchten:

Für die Interaktion mit dem Dokument Intelligenz-Dienst müssen Sie eine Instanz der DocumentAnalysisClient-Klasse erstellen. Hierzu erstellen Sie ein AzureKeyCredential mit Ihrem key im Azure-Portal sowie eine DocumentAnalysisClient-Instanz mit der AzureKeyCredential und Ihrem Dokument Intelligenz-endpoint.

  1. Erstellen Sie eine neue Python-Datei namens form_recognizer_quickstart.py in Ihrem bevorzugten Editor oder IDE.

  2. Öffnen Sie die Datei form_recognizer_quickstart.py, und wählen Sie eins der folgenden Codebeispiele aus, um es zu kopieren und in Ihre Anwendung einzufügen:

Wichtig

Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und ihn niemals zu veröffentlichen. Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Für weitere Informationen lesen Sie Azure KI Services-Sicherheit.

Layoutmodell

Extrahieren von Text, Auswahlmarkierungen, Textstilen, Tabellenstrukturen und Koordinaten von Begrenzungsbereichen aus Dokumenten.

  • Für dieses Beispiel benötigen Sie eine Dokumentdatei von einer URL. Für diesen Schnellstart können Sie das Beispieldokument verwenden.
  • Wir haben den Wert der Datei-URL zur Variable formUrl in der Funktion analyze_layout hinzugefügt.

Fügen Sie der Anwendung „doc_intel_quickstart.py“das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren:


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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:

  1. Navigieren Sie zu dem Ordner, in dem sich die Datei doc_intel_quickstart.py befindet.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

    python doc_intel_quickstart.py
    

Verwenden Sie zum Analysieren einer bestimmten Datei unter einer URL die begin_analyze_document_from_url-Methode, und übergeben Sie prebuilt-layout als Modell-ID. Der zurückgegebene Wert ist ein result-Objekt mit Daten zum übermittelten Dokument.

Fügen Sie Ihrer Anwendung „form_recognizer_quickstart.py“ das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Formularerkennungsinstanz im Azure-Portal aktualisieren.


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

Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:

  1. Navigieren Sie zu dem Ordner, in dem Ihre Datei form_recognizer_quickstart.py enthalten ist.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

    python form_recognizer_quickstart.py
    

Ausgabe des Layoutmodells

Hier sehen Sie einen Codeausschnitt der erwarteten Ausgabe:

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

Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Repository mit Azure-Beispielen auf GitHub, um die Ausgabe des Layoutmodells anzuzeigen.

Fügen Sie Ihrer Anwendung „form_recognizer_quickstart.py“ das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Formularerkennungsinstanz im Azure-Portal aktualisieren.


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


Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:

  1. Navigieren Sie zu dem Ordner, in dem Ihre Datei form_recognizer_quickstart.py enthalten ist.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

    python form_recognizer_quickstart.py
    

Vordefiniertes Modell

Analysieren und Extrahieren von gemeinsamen Feldern aus bestimmten Dokumenttypen mithilfe eines vordefinierten Modells. In diesem Beispiel analysieren Sie eine Rechnung mithilfe des vordefinierten Rechnungsmodells (prebuilt-invoice).

Tipp

Sie sind hierbei nicht auf Rechnungen beschränkt, sondern können zwischen mehreren vordefinierten Modellen wählen, von denen jedes über eine Gruppe unterstützter Felder verfügt. Welches Modell für den analyze-Vorgang verwendet wird, hängt vom Typ des zu analysierenden Dokuments ab. Weitere Informationen finden Sie unter Extrahieren von Modelldaten.

  • Analysieren einer Rechnung mithilfe des vordefinierten Rechnungsmodells (prebuilt-invoice). Für diese Schnellstartanleitung können Sie unser Beispiel für ein Rechnungsdokument verwenden.
  • Der Wert der Datei-URL wurde der Variable invoiceUrl oben in der Datei hinzugefügt.
  • Der Einfachheit halber werden hier nicht alle Schlüssel-Wert-Paare angezeigt, die der Dienst zurückgibt. Eine Liste aller unterstützten Felder mit den entsprechenden Typen finden Sie auf der Konzeptseite Rechnung.

Fügen Sie der Anwendung „doc_intel_quickstart.py“das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren:


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


Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:

  1. Navigieren Sie zu dem Ordner, in dem sich die Datei doc_intel_quickstart.py befindet.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

    python doc_intel_quickstart.py
    

Verwenden Sie zum Analysieren einer bestimmten Datei unter einem URI die begin_analyze_document_from_url-Methode, und übergeben Sie prebuilt-invoice als Modell-ID. Der zurückgegebene Wert ist ein result-Objekt mit Daten zum übermittelten Dokument.

Fügen Sie Ihrer Anwendung „form_recognizer_quickstart.py“ das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Formularerkennungsinstanz im Azure-Portal aktualisieren.

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


Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:

  1. Navigieren Sie zu dem Ordner, in dem Ihre Datei form_recognizer_quickstart.py enthalten ist.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

    python form_recognizer_quickstart.py
    

Ausgabe des vordefinierten Modells

Hier sehen Sie einen Codeausschnitt der erwarteten Ausgabe:

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

Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Repository mit Azure-Beispielen auf GitHub, um die Ausgabe des vordefinierten Rechnungsmodells anzuzeigen.

Fügen Sie Ihrer Anwendung „form_recognizer_quickstart.py“ das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Formularerkennungsinstanz im Azure-Portal aktualisieren.


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


Ausführen der Anwendung

Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:

  1. Navigieren Sie zu dem Ordner, in dem Ihre Datei form_recognizer_quickstart.py enthalten ist.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

    python form_recognizer_quickstart.py
    

In diesem Schnellstart erfahren Sie, wie Sie die Dokument Intelligenz-REST-API verwenden, um Daten und Werte in Dokumenten zu analysieren und daraus zu extrahieren:

Voraussetzungen

  • Azure-Abonnement – Erstellen eines kostenlosen Kontos

  • Curl-Befehlszeilentool installiert.

  • PowerShell ab Version 7.* (oder eine ähnliche Befehlszeilenanwendung):

  • Geben Sie den folgenden Befehl entsprechend Ihres Betriebssystems ein, um Ihre PowerShell-Version zu überprüfen:

    • Windows: Get-Host | Select-Object Version
    • macOS oder Linux: $PSVersionTable
  • Eine Dokument Intelligenz-Ressource (einzelner Dienst) oder Azure KI Services-Ressource (mehrere Dienste). Sobald Sie über Ihr Azure-Abonnement verfügen, erstellen Sie im Azure-Portal eine Dokument Intelligenz-Ressource für einen einzelnen Dienst oder für mehrere Dienste, um Ihren Schlüssel und Endpunkt zu erhalten. Sie können den kostenlosen Tarif (F0) verwenden, um den Dienst zu testen, und später für die Produktion auf einen kostenpflichtigen Tarif upgraden.

Tipp

Erstellen Sie eine Azure KI Services-Ressource, wenn Sie planen, auf mehrere Azure KI Services unter einem einzelnen Endpunkt/Schlüssel zuzugreifen. Erstellen Sie nur für den Zugriff auf Dokument Intelligenz eine Dokument Intelligenz-Ressource. Beachten Sie hierbei, dass Sie eine Ressource mit einem einzelnen Dienst benötigen, falls Sie die Microsoft Entra-Authentifizierung nutzen möchten.

  • Wählen Sie nach der Bereitstellung der Ressource Zu Ressource wechseln aus. Sie benötigen den Schlüssel und Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit der Dokument Intelligenz-API zu verbinden. Der Schlüssel und der Endpunkt werden später in der Schnellstartanleitung in den Code eingefügt.

    Screenshot: Schlüssel und Endpunkt im Azure-Portal

Analysieren von Dokumenten und Erhalten von Ergebnissen

Eine POST-Anforderung wird verwendet, um Dokumente mit einem vordefinierten oder benutzerdefinierten Modell zu analysieren. Eine GET-Anforderung wird verwendet, um das Ergebnis eines Dokumentanalyseaufrufs abzurufen. modelId wird mit POST- und resultId mit GET-Vorgängen verwendet.

Analysieren eines Dokuments (POST-Anforderung)

Nehmen Sie vor dem Ausführen des cURL-Befehls die folgenden Änderungen an der POST-Anforderung vor:

  1. Ersetzen Sie {endpoint} durch den Endpunktwert aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal.

  2. Ersetzen Sie {key} durch den Schlüsselwert aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal.

  3. Ersetzen Sie {modelID} und {your-document-url} anhand der nachstehenden Tabelle durch die gewünschten Werte.

  4. Sie benötigen eine Dokumentdatei unter einer URL. Für diese Schnellstartanleitung können Sie für jedes Feature die in der folgenden Tabelle angegebenen Beispielformulare verwenden.

Beispieldokumente

Feature {modelID} {your-document-url}
Lesen prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Layout prebuilt-layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Krankenversicherungskarte 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
Rechnung Vordefinierte Rechnung https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Rechnung prebuilt-receipt https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Ausweisdokument prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

Beispieldokumente

Feature {modelID} {your-document-url}
Allgemeines Dokument prebuilt-document https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Lesen prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Layout prebuilt-layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Krankenversicherungskarte 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
Rechnung Vordefinierte Rechnung https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Rechnung prebuilt-receipt https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Ausweisdokument prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png
Visitenkarte prebuilt-businessCard https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg

Wichtig

Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und ihn niemals zu veröffentlichen. Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Für weitere Informationen lesen Sie Azure KI Services-Sicherheit.

POST-Anforderung

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

POST-Antwort (resultID)

Sie erhalten die Antwort 202 (Success) mit einem schreibgeschützten Operation-Location-Header. Der Wert dieses Headers enthält eine resultID, die abgefragt werden kann, um den Status des asynchronen Vorgangs und die Ergebnisse mithilfe einer GET-Anforderung mit demselben Ressourcenabonnementschlüssel abzurufen:

{alt-text}

Abrufen von Analyseergebnissen (GET-Anforderung)

Nachdem Sie die Analyze document&preserve-view=true&tabs=HTTP)-API aufgerufen haben, rufen Sie die Ergebnis abrufen und analysieren&preserve-view=true&tabs=HTTP)-API auf, um den Status des Vorgangs und die extrahierten Daten abzurufen. Nehmen Sie die folgenden Änderungen vor, bevor Sie den Befehl ausführen:

Rufen Sie nach dem Aufrufen der Analyze document-API die API Analyseergebnisse abrufen auf, um den Status des Vorgangs und die extrahierten Daten abzurufen. Nehmen Sie die folgenden Änderungen vor, bevor Sie den Befehl ausführen:

Rufen Sie nach dem Aufrufen der Analyze document-API die API Analyseergebnisse abrufen auf, um den Status des Vorgangs und die extrahierten Daten abzurufen. Nehmen Sie die folgenden Änderungen vor, bevor Sie den Befehl ausführen:

  1. Ersetzen Sie den Operation-Location-Header {resultID} aus der POST-Antwort.

  2. Ersetzen Sie {key} durch den Schlüsselwert aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal.

GET-Anforderung

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

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

Untersuchen der Antwort

Sie erhalten die Antwort 200 (Success) mit einer JSON-Ausgabe. Das erste Feld, "status", gibt den Status des Vorgangs an. Wenn der Vorgang nicht abgeschlossen ist, wird für "status" der Wert "running" oder "notStarted" angezeigt, und Sie sollten die API entweder manuell oder über ein Skript erneut aufrufen. Ein Intervall von mindestens einer Sekunde zwischen den Aufrufen wird empfohlen.

Beispielantwort für „prebuilt-invoice“

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

Unterstützte Dokumentfelder

Die vordefinierten Modelle extrahieren vordefinierte Sätze von Dokumentfeldern. Informationen zu extrahierten Feldnamen, Typen, Beschreibungen und Beispielen finden Sie unter Extraktion von Modelldaten.

Das war's, herzlichen Glückwunsch!

In diesem Schnellstart haben Sie ein Dokument Intelligenz-Modell verwendet, um verschiedene Formulare und Dokumente zu analysieren. Erkunden Sie als nächstes das Dokument Intelligenz-Studio und die Referenzdokumentation, um vertiefte Informationen über die Dokument Intelligenz-API zu erhalten.

Nächste Schritte

Dieser Inhalt gilt für: Häkchen Version 2.1 | Neueste Version: Blaues Häkchen Version 4.0 (GA)

Verwenden Sie die Programmiersprache Ihrer Wahl oder die REST-API für die ersten Schritte mit Azure KI Dokument Intelligenz. Dokument Intelligenz ist ein cloudbasierter Azure KI-Dienst, der maschinelles Lernen verwendet, um Schlüssel/Wert-Paare, Text und Tabellen aus Ihren Dokumenten zu extrahieren. Sie sollten den kostenlosen Dienst nutzen, wenn Sie die Technologie erlernen. Bedenken Sie, dass die Anzahl der kostenlosen Seiten auf 500 pro Monat beschränkt ist.

Um mehr über die Funktionen der Dokument Intelligenz und zu Entwicklungsoptionen zu erfahren, besuchen Sie unsere Übersichtsseite.

Referenzdokumentation | Quellcode der Bibliothek | Paket (NuGet) | Beispiele

In dieser Schnellstartanleitung verwenden Sie die folgenden APIs zum Extrahieren strukturierter Daten aus Formularen und Dokumenten:

Voraussetzungen

  • Azure-Abonnement – Erstellen eines kostenlosen Kontos

  • Aktuelle Version der Visual Studio-IDE

  • Eine Azure KI Services- oder Dokument Intelligenz-Ressource. Sobald Sie über Ihr Azure-Abonnement verfügen, erstellen Sie im Azure-Portal eine Dokument Intelligenz-Ressource für einen einzelnen Dienst oder für mehrere Dienste, um Ihren Schlüssel und Endpunkt zu erhalten. Sie können den kostenlosen Tarif (F0) verwenden, um den Dienst zu testen, und später für die Produktion auf einen kostenpflichtigen Tarif upgraden.

    Tipp

    Erstellen Sie eine Azure KI Services-Ressource, wenn Sie planen, auf mehrere Azure KI Services unter einem einzelnen Endpunkt/Schlüssel zuzugreifen. Erstellen Sie nur für den Zugriff auf Dokument Intelligenz eine Dokument Intelligenz-Ressource. Beachten Sie hierbei, dass Sie eine Ressource mit einem einzelnen Dienst benötigen, falls Sie die Microsoft Entra-Authentifizierung nutzen möchten.

  • Wählen Sie nach der Bereitstellung der Ressource Zu Ressource wechseln aus. Sie benötigen den Schlüssel und Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit der Dokument Intelligenz-API zu verbinden. Der Schlüssel und der Endpunkt werden später in der Schnellstartanleitung in den Code eingefügt.

    Screenshot: Schlüssel und Endpunkt im Azure-Portal

Einrichten

  1. Starten Sie Visual Studio 2019.

  2. Wählen Sie auf der Startseite Neues Projekt erstellen aus.

    Screenshot der Visual Studio-Startseite

  3. Geben Sie auf der Seite Neues Projekt erstellen die Angabe Konsole in das Suchfeld ein. Wählen Sie die Vorlage Konsolenanwendung und dann Weiter aus.

    Screenshot: Seite „Neues Projekt erstellen“ in Visual Studio

  4. Geben Sie im Dialogfeld Neues Projekt konfigurieren im Feld für den Projektnamen den Namen formRecognizer_quickstart ein. Klicken Sie dann auf Weiter.

    Screenshot des Visual Studios Dialogfensters „Neues Projekt konfigurieren“

  5. Wählen Sie im Dialogfeld Weitere Informationen die Option .NET 5.0 (aktuell) und dann Erstellen aus.

    Screenshot des Visual Studio-Dialogfensters für zusätzliche Informationen

Installieren der Clientbibliothek mit NuGet

  1. Klicken Sie mit der rechten Maustaste auf das Projekt formRecognizer_quickstart, und wählen Sie die Option NuGet-Pakete verwalten... aus.

    Screenshot: Fenster zum Auswählen von NuGet-Paketen

  2. Wählen Sie die Registerkarte „Durchsuchen“ aus, und geben Sie „Azure.AI.FormRecognizer“ ein.

    Screenshot zeigt das Dropdownmenü „Dokument Intelligenz-Paket auswählen“.

  3. Wählen Sie im Dropdownmenü die Version 3.1.1 und anschließend die Option Installieren aus.

Erstellen Ihrer Anwendung

Für die Interaktion mit dem Dokument Intelligenz-Dienst müssen Sie eine Instanz der FormRecognizerClient-Klasse erstellen. Hierzu erstellen Sie ein AzureKeyCredential mit Ihrem Schlüssel sowie eine FormRecognizerClient-Instanz mit der AzureKeyCredential und Ihrem Dokument Intelligenz-endpoint.

Hinweis

  • Ab .NET 6 erzeugen neue Projekte, die die Vorlage console verwenden, einen neuen Programmstil, der sich von früheren Versionen unterscheidet.
  • Die neue Ausgabe verwendet aktuelle C#-Funktionen, die den zu schreibenden Code vereinfachen.
  • Wenn Sie die neuere Version verwenden, müssen Sie nur den Text der Main-Methode schreiben. Sie müssen keine Top-Level-Anweisungen, globale Nutzungsanweisungen oder indirekte Nutzungsanweisungen einfügen.
  • Weitere Informationen finden Sie unter Neue C#-Vorlagen generieren übergeordnete Anweisungen.
  1. Öffnen Sie die Datei Program.cs.

  2. Fügen Sie die folgenden using-Direktiven ein:

using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
  1. Legen Sie Ihre Umgebungsvariablen endpoint und key fest, und erstellen Sie Ihre Instanzen von AzureKeyCredential und FormRecognizerClient:
private static readonly string endpoint = "your-form-recognizer-endpoint";
private static readonly string key = "your-api-key";
private static readonly AzureKeyCredential credential = new AzureKeyCredential(key);
  1. Löschen Sie die Zeile Console.Writeline("Hello World!");, und fügen Sie die Codebeispiele für Try It (Ausprobieren) der Datei Program.cs hinzu:

    Screenshot zum Hinzufügen des Beispielcodes zur Main-Methode

  2. Wählen Sie ein Codebeispiel zum Kopieren und Einfügen in die Main-Methode Ihrer Anwendung aus:

Wichtig

Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und ihn niemals zu veröffentlichen. Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen finden Sie im Artikel zur Azure KI Services-Sicherheit.

Try it (Ausprobieren): Layoutmodell

Dient zum Extrahieren von Text, Auswahlmarkierungen, Textformaten und Tabellenstrukturen sowie der zugehörigen Begrenzungsbereichskoordinaten aus Dokumenten.

  • Für dieses Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Für diesen Schnellstart können Sie das Beispieldokument verwenden.
  • Wir haben den Datei-URI-Wert der Variablen formUri hinzugefügt.
  • Verwenden Sie zum Extrahieren des Layouts aus einer bestimmten Datei unter einem URI die StartRecognizeContentFromUriAsync-Methode.

Fügen Sie der Datei „Program.cs“ für Ihre Layoutanwendung den folgenden Code hinzu:


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

Probieren Sie es aus: Vordefiniertes Modell

Dieses Beispiel zeigt Ihnen, wie Sie Daten aus bestimmten Arten von gängigen Dokumenten mit vortrainierten Modellen analysieren können.

  • In diesem Beispiel analysieren Sie ein Rechnungsdokument mithilfe eines vordefinierten Modells. Für diese Schnellstartanleitung können Sie unser Beispiel für ein Rechnungsdokument verwenden.
  • Sie haben den Datei-URI-Wert oben in der Main-Methode der Variable invoiceUri hinzugefügt.
  • Verwenden Sie für die Analyse einer bestimmten Datei unter einem URI die StartRecognizeInvoicesFromUriAsync-Methode.
  • Der Einfachheit halber werden hier nicht alle Felder angezeigt, die vom Dienst zurückgegeben werden. Eine Liste aller unterstützten Felder mit den entsprechenden Typen finden Sie auf der Konzeptseite Rechnung.

Auswählen eines vordefinierten Modells

Sie sind hierbei nicht auf Rechnungen beschränkt, sondern können zwischen mehreren vordefinierten Modellen wählen, von denen jedes über eine Gruppe unterstützter Felder verfügt. Welches Modell für den Analysevorgang verwendet wird, hängt vom Typ des zu analysierenden Dokuments ab. Hier finden Sie die vordefinierten Modelle, die vom Dokument Intelligenz-Dienst derzeit unterstützt werden:

  • Rechnung: Extrahieren von Text, Auswahlmarkierungen, Tabellen, Feldern und wichtigen Informationen aus Rechnungen
  • Beleg: Extrahieren von Text und wichtigen Informationen aus Belegen
  • Ausweisdokument: Extrahieren von Text und wichtigen Informationen aus Führerscheinen und Reisepässen
  • Visitenkarte: Extrahieren von Text und wichtigen Informationen aus Visitenkarten

Fügen Sie den folgenden Code zu Ihrer vordefinierten Methode für die Rechnungsanwendung der Datei „Program.cs“ hinzu.

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

Ausführen der Anwendung

Wählen Sie die grüne Schaltfläche Starten neben „formRecognizer_quickstart“ aus, um Ihr Programm zu kompilieren und auszuführen, oder drücken Sie F5.

Screenshot: Ausführen Ihres Visual Studio-Programms

Referenzdokumentation | Quellcode der Bibliothek | Paket (Maven) | Beispiele

In dieser Schnellstartanleitung verwenden Sie die folgenden APIs zum Extrahieren strukturierter Daten aus Formularen und Dokumenten:

Voraussetzungen

  • Azure-Abonnement – Erstellen eines kostenlosen Kontos

  • Java Development Kit (JDK), Version 8 oder höher. Weitere Informationen finden Sie unter Unterstützte Java-Versionen und Zeitplan für Updates.

  • Eine Azure KI Services- oder Dokument Intelligenz-Ressource. Sobald Sie über Ihr Azure-Abonnement verfügen, erstellen Sie im Azure-Portal eine Dokument Intelligenz-Ressource für einen einzelnen Dienst oder für mehrere Dienste, um Ihren Schlüssel und Endpunkt zu erhalten. Sie können den kostenlosen Tarif (F0) verwenden, um den Dienst zu testen, und später für die Produktion auf einen kostenpflichtigen Tarif upgraden.

  • Wählen Sie nach der Bereitstellung der Ressource Zu Ressource wechseln aus. Sie benötigen den Schlüssel und Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit der Dokument Intelligenz-API zu verbinden. Der Schlüssel und der Endpunkt werden später in der Schnellstartanleitung in den Code eingefügt.

    Screenshot: Schlüssel und Endpunkt im Azure-Portal

Einrichten

Erstellen eines neuen Gradle-Projekts

Erstellen Sie in einem Konsolenfenster (z. B. cmd, PowerShell oder Bash) ein neues Verzeichnis für Ihre App mit dem Namen form-recognizer-app, und navigieren Sie zu diesem Verzeichnis.

mkdir form-recognizer-app && form-recognizer-app
  1. Führen Sie den Befehl gradle init in Ihrem Arbeitsverzeichnis aus. Mit diesem Befehl werden grundlegende Builddateien für Gradle erstellt, u. a. die Datei build.gradle.kts. Diese Datei wird zur Laufzeit zum Erstellen und Konfigurieren Ihrer Anwendung verwendet.

    gradle init --type basic
    
  2. Wenn Sie zur Auswahl einer DSL aufgefordert werden, wählen Sie Kotlin aus.

  3. Übernehmen Sie den Standardprojektnamen (form-recognizer-app).

Installieren der Clientbibliothek

In dieser Schnellstartanleitung wird der Gradle-Abhängigkeits-Manager verwendet. Die Clientbibliothek und Informationen zu anderen Abhängigkeits-Managern finden Sie im zentralen Maven-Repository.

Fügen Sie in die Datei build.gradle.kts Ihres Projekts die Clientbibliothek als als implementation-Anweisung sowie die erforderlichen Plug-Ins und Einstellungen ein.

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

Erstellen einer Java-Datei

Führen Sie in Ihrem Arbeitsverzeichnis den folgenden Befehl aus:

mkdir -p src/main/java

Sie erstellen die folgende Verzeichnisstruktur:

Screenshot: Die Struktur des Java-Verzeichnisses der Anwendung

Navigieren Sie zum Java-Verzeichnis, und erstellen Sie eine Datei mit dem Namen FormRecognizer.java. Öffnen Sie sie in Ihrem bevorzugten Editor bzw. Ihrer bevorzugten IDE, und fügen Sie die folgende Paketdeklaration und die folgenden import-Anweisungen hinzu:

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;

Wählen Sie ein Codebeispiel zum Kopieren und Einfügen in die main-Methode Ihrer Anwendung aus:

Wichtig

Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und ihn niemals zu veröffentlichen. Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Für weitere Informationen lesen Sie Azure KI Services-Sicherheit.

Try it (Ausprobieren): Layoutmodell

Dient zum Extrahieren von Text, Auswahlmarkierungen, Textformaten und Tabellenstrukturen sowie der zugehörigen Begrenzungsbereichskoordinaten aus Dokumenten.

  • Für dieses Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Für diesen Schnellstart können Sie das Beispieldokument verwenden.
  • Für die Analyse einer bestimmten Datei unter einem URI verwenden Sie die beginRecognizeContentFromUrl-Methode.
  • Wir haben den Datei-URI-Wert der Variablen formUrl in der main-Methode hinzugefügt.

Aktualisieren Sie die FormRecognizer-Klasse Ihrer Anwendung mit dem folgenden Code (stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren):


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

Probieren Sie es aus: Vordefiniertes Modell

Dieses Beispiel zeigt Ihnen, wie Sie Daten aus bestimmten Arten von gängigen Dokumenten mit vortrainierten Modellen analysieren können.

  • In diesem Beispiel analysieren Sie ein Rechnungsdokument mithilfe eines vordefinierten Modells. Für diese Schnellstartanleitung können Sie unser Beispiel für ein Rechnungsdokument verwenden.
  • Für die Analyse einer bestimmten Datei unter einem URI verwenden Sie beginRecognizeInvoicesFromUrl.
  • Wir haben den Datei-URI-Wert der Variablen invoiceUrl in der main-Methode hinzugefügt.
  • Der Einfachheit halber werden hier nicht alle Felder angezeigt, die vom Dienst zurückgegeben werden. Eine Liste aller unterstützten Felder mit den entsprechenden Typen finden Sie auf der Konzeptseite Rechnung.

Auswählen eines vordefinierten Modells

Sie sind hierbei nicht auf Rechnungen beschränkt, sondern können zwischen mehreren vordefinierten Modellen wählen, von denen jedes über eine Gruppe unterstützter Felder verfügt. Welches Modell für den analyze-Vorgang verwendet wird, hängt vom Typ des zu analysierenden Dokuments ab. Hier finden Sie die vordefinierten Modelle, die vom Dokument Intelligenz-Dienst derzeit unterstützt werden:

  • Rechnung: Extrahieren von Text, Auswahlmarkierungen, Tabellen, Feldern und wichtigen Informationen aus Rechnungen
  • Beleg: Extrahieren von Text und wichtigen Informationen aus Belegen
  • Ausweisdokument: Extrahieren von Text und wichtigen Informationen aus Führerscheinen und Reisepässen
  • Visitenkarte: Extrahieren von Text und wichtigen Informationen aus Visitenkarten

Aktualisieren Sie die FormRecognizer-Klasse Ihrer Anwendung mit dem folgenden Code (stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Dokument Intelligenz-Instanz im Azure-Portal aktualisieren):


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

Erstellen und Ausführen der Anwendung

Navigieren Sie zurück zum Hauptverzeichnis (form-recognizer-app) Ihres Projekts.

  1. Erstellen Sie Ihre Anwendung mit dem Befehl build:
gradle build
  1. Führen Sie Ihre Anwendung mit dem Befehl run aus:
gradle run

Referenzdokumentation | Quellcode der Bibliothek | Paket (npm) | Beispiele

In dieser Schnellstartanleitung verwenden Sie die folgenden APIs zum Extrahieren strukturierter Daten aus Formularen und Dokumenten:

Voraussetzungen

  • Azure-Abonnement – Erstellen eines kostenlosen Kontos

  • Die aktuelle Version von Visual Studio Code oder Ihrer bevorzugten IDE

  • Die aktuelle Version LTS von Node.js

  • Eine Azure KI Services- oder Dokument Intelligenz-Ressource. Sobald Sie über Ihr Azure-Abonnement verfügen, erstellen Sie im Azure-Portal eine Dokument Intelligenz-Ressource für einen einzelnen Dienst oder für mehrere Dienste, um Ihren Schlüssel und Endpunkt zu erhalten. Sie können den kostenlosen Tarif (F0) verwenden, um den Dienst zu testen, und später für die Produktion auf einen kostenpflichtigen Tarif upgraden.

    Tipp

    Erstellen Sie eine Azure KI Services-Ressource, wenn Sie planen, auf mehrere Azure KI Services unter einem einzelnen Endpunkt/Schlüssel zuzugreifen. Erstellen Sie nur für den Zugriff auf Dokument Intelligenz eine Dokument Intelligenz-Ressource. Beachten Sie hierbei, dass Sie eine Ressource mit einem einzelnen Dienst benötigen, falls Sie die Microsoft Entra-Authentifizierung nutzen möchten.

  • Wählen Sie nach der Bereitstellung der Ressource Zu Ressource wechseln aus. Sie benötigen den Schlüssel und Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit der Dokument Intelligenz-API zu verbinden. Der Schlüssel und der Endpunkt werden später in der Schnellstartanleitung in den Code eingefügt.

    Screenshot: Schlüssel und Endpunkt im Azure-Portal

Einrichten

  1. Erstellen Sie eine neue Node.js-Anwendung. Erstellen Sie in einem Konsolenfenster (etwa cmd, PowerShell oder Bash) ein neues Verzeichnis für Ihre App, und rufen Sie es auf.

    mkdir form-recognizer-app && cd form-recognizer-app
    
  2. Führen Sie den Befehl npm init aus, um eine Knotenanwendung mit der Datei package.json zu erstellen.

    npm init
    
  3. Installieren Sie das npm-Paket der Clientbibliothek ai-form-recognizer:

    npm install @azure/ai-form-recognizer
    

    Die Datei package.json Ihrer App wird mit den Abhängigkeiten aktualisiert.

  4. Erstellen Sie eine Datei mit dem Namen index.js, öffnen Sie sie, und importieren Sie die folgenden Bibliotheken:

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. Erstellen Sie Variablen für den Azure-Endpunkt und -Schlüssel Ihrer Ressource:

    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    
  6. An diesem Punkt sollte Ihre JavaScript-Anwendung die folgenden Codezeilen enthalten:

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

Wählen Sie ein Codebeispiel zum Kopieren und Einfügen in Ihre Anwendung aus:

Wichtig

Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und ihn niemals zu veröffentlichen. Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Für weitere Informationen lesen Sie Azure KI Services-Sicherheit.

Try it (Ausprobieren): Layoutmodell

  • Für dieses Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Für diesen Schnellstart können Sie das Beispieldokument verwenden.
  • Sie haben den Datei-URI-Wert der Variable formUrl im oberen Bereich der Datei hinzugefügt.
  • Für die Analyse einer bestimmten Datei unter einem URI verwenden Sie die beginRecognizeContent-Methode.

Fügen Sie Ihrer Layoutanwendung in der Zeile unterhalb der Variablen key den folgenden Code hinzu:

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

Probieren Sie es aus: Vordefiniertes Modell

Dieses Beispiel zeigt Ihnen, wie Sie Daten aus bestimmten Arten von gängigen Dokumenten mit vortrainierten Modellen analysieren können. Eine vollständige Liste mit Rechnungsfeldernfinden Sie auf unserer Seite mit den vordefinierten Konzepten.

  • In diesem Beispiel analysieren Sie ein Rechnungsdokument mithilfe eines vordefinierten Modells. Für diese Schnellstartanleitung können Sie unser Beispiel für ein Rechnungsdokument verwenden.
  • Sie haben den Datei-URI-Wert der Variable invoiceUrl im oben in der Datei hinzugefügt.
  • Für die Analyse einer bestimmten Datei unter einem URI verwenden Sie die beginRecognizeInvoices-Methode.
  • Der Einfachheit halber werden hier nicht alle Felder angezeigt, die vom Dienst zurückgegeben werden. Eine Liste aller unterstützten Felder mit den entsprechenden Typen finden Sie auf der Konzeptseite Rechnung.

Auswählen eines vordefinierten Modells

Sie sind hierbei nicht auf Rechnungen beschränkt, sondern können zwischen mehreren vordefinierten Modellen wählen, von denen jedes über eine Gruppe unterstützter Felder verfügt. Welches Modell für den analyze-Vorgang verwendet wird, hängt vom Typ des zu analysierenden Dokuments ab. Hier finden Sie die vordefinierten Modelle, die vom Dokument Intelligenz-Dienst derzeit unterstützt werden:

  • Rechnung: Extrahieren von Text, Auswahlmarkierungen, Tabellen, Feldern und wichtigen Informationen aus Rechnungen
  • Beleg: Extrahieren von Text und wichtigen Informationen aus Belegen
  • Ausweisdokument: Extrahieren von Text und wichtigen Informationen aus Führerscheinen und Reisepässen
  • Visitenkarte: Extrahieren von Text und wichtigen Informationen aus Visitenkarten

Fügen Sie Ihrer vordefinierten Rechnungsanwendung unterhalb der Variablen key den folgenden Code hinzu:


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

Referenzdokumentation | Quellcode der Bibliothek | Paket (PyPi) | Beispiele

In dieser Schnellstartanleitung verwenden Sie die folgenden APIs zum Extrahieren strukturierter Daten aus Formularen und Dokumenten:

Voraussetzungen

  • Azure-Abonnement – Erstellen eines kostenlosen Kontos

  • Python 3.x

    • Ihre Python-Installation sollte pip enthalten. Sie können überprüfen, ob pip installiert ist, indem Sie pip --version in der Befehlszeile ausführen. Installieren Sie die aktuelle Python-Version, um pip zu erhalten.
  • Eine Azure KI Services- oder Dokument Intelligenz-Ressource. Sobald Sie über Ihr Azure-Abonnement verfügen, erstellen Sie im Azure-Portal eine Dokument Intelligenz-Ressource für einen einzelnen Dienst oder für mehrere Dienste, um Ihren Schlüssel und Endpunkt zu erhalten. Sie können den kostenlosen Tarif (F0) verwenden, um den Dienst zu testen, und später für die Produktion auf einen kostenpflichtigen Tarif upgraden.

    Tipp

    Erstellen Sie eine Azure KI Services-Ressource, wenn Sie planen, auf mehrere Azure KI Services unter einem einzelnen Endpunkt/Schlüssel zuzugreifen. Erstellen Sie nur für den Zugriff auf Dokument Intelligenz eine Dokument Intelligenz-Ressource. Beachten Sie hierbei, dass Sie eine Ressource mit einem einzelnen Dienst benötigen, falls Sie die Microsoft Entra-Authentifizierung nutzen möchten.

  • Wählen Sie nach der Bereitstellung der Ressource Zu Ressource wechseln aus. Sie benötigen den Schlüssel und Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit der Dokument Intelligenz-API zu verbinden. Der Schlüssel und der Endpunkt werden später in der Schnellstartanleitung in den Code eingefügt.

    Screenshot: Schlüssel und Endpunkt im Azure-Portal

Einrichten

Öffnen Sie in Ihrer lokalen Umgebung ein Terminalfenster, und installieren Sie die Azure KI Dokument Intelligenz-Clientbibliothek für Python mit pip:

pip install azure-ai-formrecognizer

Erstellen einer neuen Python-Anwendung

Erstellen Sie mit Ihrem bevorzugten Editor bzw. Ihrer IDE eine neue Python-Anwendung mit dem Namen form_recognizer_quickstart.py. Importieren Sie anschließend die folgenden Bibliotheken:

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

Erstellen von Variablen für den Endpunkt und Schlüssel Ihrer Azure-Ressource

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

An diesem Punkt sollte Ihre Python-Anwendung die folgenden Codezeilen enthalten:

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"

Wählen Sie ein Codebeispiel zum Kopieren und Einfügen in Ihre Anwendung aus:

Wichtig

Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und ihn niemals zu veröffentlichen. Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Für weitere Informationen lesen Sie Azure KI Services-Sicherheit.

Try it (Ausprobieren): Layoutmodell

  • Für dieses Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Für diesen Schnellstart können Sie das Beispieldokument verwenden.
  • Sie haben den Datei-URI-Wert der Variable formUrl im oberen Bereich der Datei hinzugefügt.
  • Für die Analyse einer bestimmten Datei unter einem URI verwenden Sie die begin_recognize_content_from_url-Methode.

Fügen Sie Ihrer Layoutanwendung in der Zeile unterhalb der Variablen key den folgenden Code hinzu:


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

Probieren Sie es aus: Vordefiniertes Modell

Dieses Beispiel zeigt Ihnen, wie Sie Daten aus bestimmten Arten von gängigen Dokumenten mit vortrainierten Modellen analysieren können. Eine vollständige Liste mit Rechnungsfeldernfinden Sie auf unserer Seite mit den vordefinierten Konzepten.

  • In diesem Beispiel analysieren Sie ein Rechnungsdokument mithilfe eines vordefinierten Modells. Für diese Schnellstartanleitung können Sie unser Beispiel für ein Rechnungsdokument verwenden.
  • Wir haben den Datei-URI-Wert der Variablen „formUrl“ oben in der Datei hinzugefügt.
  • Sie verwenden die Methode „begin_recognize_invoices_from_url“, um eine bestimmte Datei unter einem URI zu analysieren.
  • Der Einfachheit halber werden hier nicht alle Felder angezeigt, die vom Dienst zurückgegeben werden. Eine Liste aller unterstützten Felder mit den entsprechenden Typen finden Sie auf der Konzeptseite Rechnung.

Auswählen eines vordefinierten Modells

Sie sind hierbei nicht auf Rechnungen beschränkt, sondern können zwischen mehreren vordefinierten Modellen wählen, von denen jedes über eine Gruppe unterstützter Felder verfügt. Welches Modell für den analyze-Vorgang verwendet wird, hängt vom Typ des zu analysierenden Dokuments ab. Hier finden Sie die vordefinierten Modelle, die vom Dokument Intelligenz-Dienst derzeit unterstützt werden:

  • Rechnung: Extrahieren von Text, Auswahlmarkierungen, Tabellen, Feldern und wichtigen Informationen aus Rechnungen
  • Beleg: Extrahieren von Text und wichtigen Informationen aus Belegen
  • Ausweisdokument: Extrahieren von Text und wichtigen Informationen aus Führerscheinen und Reisepässen
  • Visitenkarte: Extrahieren von Text und wichtigen Informationen aus Visitenkarten

Fügen Sie Ihrer vordefinierten Rechnungsanwendung unterhalb der Variablen key den folgenden Code hinzu:


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

Ausführen der Anwendung

  1. Navigieren Sie zu dem Ordner, in dem Ihre Datei form_recognizer_quickstart.py enthalten ist.

  2. Geben Sie in Ihrem Terminal den folgenden Befehl ein:

python form_recognizer_quickstart.py

| Dokument Intelligenz-REST-API | Azure REST API-Referenz |

In dieser Schnellstartanleitung verwenden Sie die folgenden APIs zum Extrahieren strukturierter Daten aus Formularen und Dokumenten:

Voraussetzungen

  • Azure-Abonnement – Erstellen eines kostenlosen Kontos

  • cURL muss installiert sein.

  • PowerShell-Version 6.0 oder höher oder eine ähnliche Befehlszeilenanwendung

  • Eine Azure KI Services- oder Dokument Intelligenz-Ressource. Sobald Sie über Ihr Azure-Abonnement verfügen, erstellen Sie im Azure-Portal eine Dokument Intelligenz-Ressource für einen einzelnen Dienst oder für mehrere Dienste, um Ihren Schlüssel und Endpunkt zu erhalten. Sie können den kostenlosen Tarif (F0) verwenden, um den Dienst zu testen, und später für die Produktion auf einen kostenpflichtigen Tarif upgraden.

    Tipp

    Erstellen Sie eine Azure KI Services-Ressource, wenn Sie planen, auf mehrere Azure KI Services unter einem einzelnen Endpunkt/Schlüssel zuzugreifen. Erstellen Sie nur für den Zugriff auf Dokument Intelligenz eine Dokument Intelligenz-Ressource. Beachten Sie hierbei, dass Sie eine Ressource mit einem einzelnen Dienst benötigen, falls Sie die Microsoft Entra-Authentifizierung nutzen möchten.

  • Wählen Sie nach der Bereitstellung der Ressource Zu Ressource wechseln aus. Sie benötigen den Schlüssel und Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit der Dokument Intelligenz-API zu verbinden. Der Schlüssel und der Endpunkt werden später in der Schnellstartanleitung in den Code eingefügt.

    Screenshot: Schlüssel und Endpunkt im Azure-Portal

Wählen Sie ein Codebeispiel zum Kopieren und Einfügen in Ihre Anwendung aus:

Wichtig

Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und ihn niemals zu veröffentlichen. Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Für weitere Informationen lesen Sie Azure KI Services-Sicherheit.

Try it (Ausprobieren): Layoutmodell

  • Für dieses Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Für diesen Schnellstart können Sie das Beispieldokument verwenden.
  1. Ersetzen Sie {endpoint} durch den Endpunkt, den Sie mit Ihrem Dokument Intelligenz-Abonnement erhalten haben.
  2. Ersetzen Sie {key} durch den Schlüssel, den Sie im vorherigen Schritt kopiert haben.
  3. Ersetzen Sie \"{your-document-url} durch die URL eines Beispieldokuments:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf

Anforderung

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

Sie erhalten die Antwort 202 (Success) mit einem Operation-Location-Header. Der Wert dieses Headers enthält eine Ergebnis-ID, mit der Sie den Status des asynchronen Vorgangs abfragen und die Ergebnisse abrufen können:

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

Im folgenden Beispiel als Teil der URL ist die Zeichenfolge nach analyzeResults/ die Ergebnis-ID.

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

Abrufen von Layoutergebnissen

Rufen Sie nach dem Aufrufen der Analyze Layout-API die API Layoutanalyseergebnisse abrufen auf, um den Status des Vorgangs und die extrahierten Daten abzurufen. Nehmen Sie die folgenden Änderungen vor, bevor Sie den Befehl ausführen:

  1. Ersetzen Sie {endpoint} durch den Endpunkt, den Sie mit Ihrem Dokument Intelligenz-Abonnement erhalten haben.
  2. Ersetzen Sie {key} durch den Schlüssel, den Sie im vorherigen Schritt kopiert haben.
  3. Ersetzen Sie {resultId} durch die Ergebnis-ID aus dem vorherigen Schritt.

Anforderung

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

Untersuchen der Ergebnisse

Sie erhalten die Antwort 200 (success) mit dem JSON-Inhalt.

Vergleichen Sie das folgende Bild einer Rechnung mit der entsprechenden JSON-Ausgabe.

  • Der Knoten "readResults" enthält jede Textzeile mit der Platzierung des zugehörigen Begrenzungsrahmens auf der Seite.
  • Der Knoten selectionMarks zeigt jede Auswahlmarkierung (Kontrollkästchen, Optionsfeld) und ihren Status – selected oder unselected – an.
  • Der Abschnitt "pageResults" enthält die extrahierten Tabellen. Für jede Tabelle werden der Text-, Zeilen- und Spaltenindex, die Zeilen- und Spaltenaufteilung, der Begrenzungsrahmen und mehr extrahiert.

Contoso-Projektangabedokument mit einer Tabelle

Antworttext

Sie können die vollständige Beispielausgabe auf GitHub anzeigen.

Probieren Sie es aus: Vordefiniertes Modell

  • In diesem Beispiel analysieren Sie ein Rechnungsdokument mithilfe eines vordefinierten Modells. Für diese Schnellstartanleitung können Sie unser Beispiel für ein Rechnungsdokument verwenden.

Auswählen eines vordefinierten Modells

Sie sind hierbei nicht auf Rechnungen beschränkt, sondern können zwischen mehreren vordefinierten Modellen wählen, von denen jedes über eine Gruppe unterstützter Felder verfügt. Welches Modell für den analyze-Vorgang verwendet wird, hängt vom Typ des zu analysierenden Dokuments ab. Hier finden Sie die vordefinierten Modelle, die vom Dokument Intelligenz-Dienst derzeit unterstützt werden:

  • Rechnung: Extrahieren von Text, Auswahlmarkierungen, Tabellen, Feldern und wichtigen Informationen aus Rechnungen
  • Beleg: Extrahieren von Text und wichtigen Informationen aus Belegen
  • Ausweisdokument: Extrahieren von Text und wichtigen Informationen aus Führerscheinen und Reisepässen
  • Visitenkarte: Extrahieren von Text und wichtigen Informationen aus Visitenkarten

Nehmen Sie die folgenden Änderungen vor, bevor Sie den Befehl ausführen:

  1. Ersetzen Sie {endpoint} durch den Endpunkt, den Sie mit Ihrem Dokument Intelligenz-Abonnement erhalten haben.

  2. Ersetzen Sie {key} durch den Schlüssel, den Sie im vorherigen Schritt kopiert haben.

  3. Ersetzen Sie \"{your-document-url} durch eine URL für ein Rechnungsbeispiel:

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

Anforderung

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

Sie erhalten die Antwort 202 (Success) mit einem Operation-Location-Header. Der Wert dieses Headers enthält eine Ergebnis-ID, mit der Sie den Status des asynchronen Vorgangs abfragen und die Ergebnisse abrufen können:

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

Im folgenden Beispiel als Teil der URL ist die Zeichenfolge nach analyzeResults/ die Ergebnis-ID:

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

Abrufen von Rechnungsergebnissen

Rufen Sie nach dem Aufrufen der Analyze Invoice-API die API Rechnungsanalyseergebnisse abrufen auf, um den Status des Vorgangs und die extrahierten Daten abzurufen. Nehmen Sie die folgenden Änderungen vor, bevor Sie den Befehl ausführen:

  1. Ersetzen Sie {endpoint} durch den Endpunkt, den Sie mit Ihrem Dokument Intelligenz-Schlüssel erhalten haben. Sie finden ihn auf der Registerkarte Übersicht ihrer Dokument Intelligenz-Ressource.
  2. Ersetzen Sie {resultId} durch die Ergebnis-ID aus dem vorherigen Schritt.
  3. Ersetzen Sie {key} durch Ihren Schlüssel.

Anforderung

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

Untersuchen der Antwort

Sie erhalten die Antwort 200 (Success) mit einer JSON-Ausgabe.

  • Das "readResults"-Feld enthält alle Textzeilen, die aus der Rechnung extrahiert wurden.
  • "pageResults" beinhaltet die Tabellen und Informationen zu den Auswahlkästchen, die aus der Rechnung extrahiert wurden.
  • Das "documentResults"-Feld enthält die Schlüssel-/Wertinformationen für die relevantesten Teile der Rechnung.

Weitere Informationen finden Sie im Dokument mit der Beispielrechnung.

Antworttext

Auf GitHub finden Sie die vollständige Beispielausgabe.

Sie sind fertig. Gut gemacht!

Nächste Schritte

  • Testen Sie Dokument Intelligenz Studio für eine verbesserte Erfahrung und Modellqualität.

    • Studio unterstützt jedes Modell, das mit in v2.1 gekennzeichneten Daten trainiert wurde.

    • Die Änderungsprotokolle enthalten detaillierte Informationen zur Migration von v3.1 zu v4.0.