Udostępnij za pośrednictwem


Wprowadzenie do analizy dokumentów

Ważne

  • Rozpoznawanie formularzy usług Azure Cognitive Services to teraz analiza dokumentów usługi Azure AI.
  • Niektóre platformy nadal czekają na zmianę nazwy aktualizacji.
  • Wszystkie wzmianki o rozpoznawaniu formularzy lub analizie dokumentów w naszej dokumentacji odnoszą się do tej samej usługi platformy Azure.

Ta zawartość dotyczy: Znacznik wersja 4.0 (GA) Starsze wersje: niebieski znacznik wyboru v3.1 (GA) v3.0 (GA) niebieski znacznik wyboru

  • Rozpocznij pracę z usługą Azure AI Document Intelligence w najnowszej stabilnej wersji 4.0 2024-11-30 (GA).

Ta zawartość dotyczy: Znacznik wersja 3.1 (GA) Wcześniejsze wersje: niebieski znacznik wyboru v3.0 niebieski znacznik wyboru v2.1

  • Rozpoczynanie pracy z najnowszą wersją ogólnie dostępnej usługi Azure Form Recognizer (2023-07-31).

Ta zawartość dotyczy: Znacznik nowsza wersja niebieski znacznik wyboru 3.0 (GA): wersja 3.1niebieski znacznik wyboru v2.1

  • Wprowadzenie do starszej wersji ogólnie dostępnej usługi Azure Form Recognizer (2022-08-31).
  • Azure AI Document Intelligence / Form Recognizer to oparta na chmurze usługa Azure AI, która używa uczenia maszynowego do wyodrębniania par klucz-wartość, tekstu, tabel i kluczowych danych z dokumentów.

  • Modele przetwarzania dokumentów można łatwo zintegrować z przepływami pracy i aplikacjami przy użyciu zestawu SDK języka programowania lub wywoływania interfejsu API REST.

  • Zalecamy korzystanie z bezpłatnej usługi podczas nauki technologii na potrzeby tego przewodnika Szybki start. Pamiętaj, że liczba bezpłatnych stron jest ograniczona do 500 miesięcznie.

Aby dowiedzieć się więcej o funkcjach interfejsu API i opcjach programowania, odwiedź naszą stronę Przegląd .

W tym przewodniku Szybki start użyj następujących funkcji, aby analizować i wyodrębniać dane oraz wartości z formularzy i dokumentów:

  • Model układu — analizuj i wyodrębniaj tabele, linie, wyrazy i znaczniki zaznaczenia, takie jak przyciski radiowe i pola wyboru w dokumentach, bez konieczności trenowania modelu.

  • Wstępnie utworzony model — analizowanie i wyodrębnianie typowych pól z określonych typów dokumentów przy użyciu wstępnie utworzonego modelu.

Wymagania wstępne

  • Usługi azure AI lub zasób analizy dokumentów. Po utworzeniu subskrypcji platformy Azure utwórz zasób wielosób wielosłużytkowy usługi azure lub usługi Azure AI w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy.

  • Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

Napiwek

Utwórz zasób usług Azure AI, jeśli planujesz uzyskać dostęp do wielu usług azure AI w ramach jednego punktu końcowego/klucza. W przypadku dostępu tylko do analizy dokumentów utwórz zasób analizy dokumentów. Należy pamiętać, że jeśli zamierzasz używać uwierzytelniania firmy Microsoft Entra, potrzebujesz zasobu z jedną usługą.

  • Po wdrożeniu zasobu wybierz pozycję Przejdź do zasobu. Potrzebujesz klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API analizy dokumentów. Klucz i punkt końcowy wklejasz do kodu w dalszej części przewodnika Szybki start:

    Zrzut ekranu przedstawiający klucze i lokalizację punktu końcowego w witrynie Azure Portal.

  • Usługi azure AI lub zasób rozpoznawania formularzy. Po utworzeniu subskrypcji platformy Azure utwórz zasób wielosób wielosłużytkowy usługi azure lub usługi Azure AI w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy.

  • Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

Napiwek

Utwórz zasób usług Azure AI, jeśli planujesz uzyskać dostęp do wielu usług azure AI w ramach jednego punktu końcowego/klucza. W przypadku dostępu tylko do rozpoznawania formularzy utwórz zasób rozpoznawania formularzy. Należy pamiętać, że jeśli zamierzasz używać uwierzytelniania firmy Microsoft Entra, potrzebujesz zasobu z jedną usługą.

  • Po wdrożeniu zasobu wybierz pozycję Przejdź do zasobu. Potrzebny jest klucz i punkt końcowy z utworzonego zasobu, aby połączyć aplikację z interfejsem API rozpoznawania formularzy. Klucz i punkt końcowy wklejasz do kodu w dalszej części przewodnika Szybki start:

    Zrzut ekranu przedstawiający klucze i lokalizację punktu końcowego w witrynie Azure Portal.

Konfiguruj

  1. Uruchom program Visual Studio.

  2. Na stronie początkowej wybierz pozycję Utwórz nowy projekt.

    Zrzut ekranu przedstawiający okno uruchamiania programu Visual Studio.

  3. Na stronie Tworzenie nowego projektu wprowadź konsolę w polu wyszukiwania. Wybierz szablon Aplikacja konsolowa, a następnie wybierz pozycję Dalej.

    Zrzut ekranu przedstawiający stronę tworzenia nowego projektu programu Visual Studio.

  1. W oknie dialogowym Konfigurowanie nowego projektu wprowadź doc_intel_quickstart w polu Nazwa projektu. Następnie wybierz pozycję Dalej.
  1. W oknie dialogowym Konfigurowanie nowego projektu wprowadź form_recognizer_quickstart w polu Nazwa projektu. Następnie wybierz pozycję Dalej.
  1. W oknie dialogowym Dodatkowe informacje wybierz pozycję .NET 8.0 (obsługa długoterminowa), a następnie wybierz pozycję Utwórz.

    Zrzut ekranu przedstawiający okno dialogowe dodatkowych informacji programu Visual Studio.

Instalowanie biblioteki klienta za pomocą narzędzia NuGet

  1. Kliknij prawym przyciskiem myszy projekt doc_intel_quickstart i wybierz polecenie Zarządzaj pakietami NuGet... .

    Zrzut ekranu przedstawiający okno wybierania pakietu wersji wstępnej NuGet w programie Visual Studio.

  2. Wybierz kartę Przeglądaj i wpisz Azure.AI.DocumentIntelligence.

  3. Include prerelease Zaznacz pole wyboru.

    Zrzut ekranu przedstawiający wybieranie wstępnie wydanego pakietu NuGet w programie Visual Studio.

  4. Wybierz wersję z menu rozwijanego i zainstaluj pakiet w projekcie.

  1. Kliknij prawym przyciskiem myszy projekt form_recognizer_quickstart i wybierz polecenie Zarządzaj pakietami NuGet... .

    Zrzut ekranu przedstawiający okno znajdowania pakietu NuGet w programie Visual Studio.

  2. Wybierz kartę Przeglądaj i wpisz Azure.AI.FormRecognizer. Wybierz wersję 4.1.0 z menu rozwijanego

    Zrzut ekranu przedstawiający wybieranie pakietu Rozpoznawanie formularzy NuGet w programie Visual Studio.

  1. Kliknij prawym przyciskiem myszy projekt form_recognizer_quickstart i wybierz polecenie Zarządzaj pakietami NuGet... .

    Zrzut ekranu przedstawiający okno pakietu NuGet w programie Visual Studio.

  2. Wybierz kartę Przeglądaj i wpisz Azure.AI.FormRecognizer. Wybierz wersję 4.0.0 z menu rozwijanego

    Zrzut ekranu przedstawiający wybieranie starszego pakietu NuGet w programie Visual Studio.

Kompilowanie aplikacji

Aby wchodzić w interakcje z usługą Analizy dokumentów, musisz utworzyć wystąpienie DocumentIntelligenceClient klasy . W tym celu należy utworzyć element za AzureKeyCredential key pomocą witryny Azure Portal i DocumentIntelligenceClient wystąpienia za pomocą narzędzia AzureKeyCredential i analizy endpointdokumentów.

Aby wchodzić w interakcje z usługą rozpoznawania formularzy, musisz utworzyć wystąpienie DocumentAnalysisClient klasy. W tym celu należy utworzyć element AzureKeyCredential za key pomocą witryny Azure Portal i DocumentAnalysisClient wystąpienia za pomocą narzędzia AzureKeyCredential rozpoznawania formularzy endpointi .

Uwaga

  • Począwszy od platformy .NET 6, nowe projekty korzystające z console szablonu generują nowy styl programu, który różni się od poprzednich wersji.
  • Nowe dane wyjściowe korzystają z ostatnich funkcji języka C#, które upraszczają pisanie kodu.
  • W przypadku korzystania z nowszej wersji wystarczy napisać treść Main metody. Nie trzeba dołączać instrukcji najwyższego poziomu, globalnych dyrektyw using ani niejawnych dyrektyw using.
  • Aby uzyskać więcej informacji, zobacz Nowe szablony języka C# generują instrukcje najwyższego poziomu.
  1. Otwórz plik Program.cs.

  2. Usuń istniejący kod, w tym wiersz Console.Writeline("Hello World!"), i wybierz jeden z następujących przykładów kodu, aby skopiować i wkleić go do pliku Program.cs aplikacji:

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz Zabezpieczenia usług Azure AI.

Model układu

Wyodrębnij tekst, znaczniki zaznaczenia, style tekstu, struktury tabel i współrzędne regionu ograniczenia z dokumentów.

  • W tym przykładzie potrzebny będzie plik dokumentu z identyfikatora URI. W tym przewodniku Szybki start możesz użyć naszego przykładowego dokumentu .
  • Dodaliśmy wartość identyfikatora URI pliku do Uri fileUri zmiennej w górnej części skryptu.
  • Aby wyodrębnić układ z danego pliku w identyfikatorze URI, użyj StartAnalyzeDocumentFromUri metody i przekaż prebuilt-layout jako identyfikator modelu. Zwracana wartość jest obiektem zawierającym AnalyzeResult dane z przesłanego dokumentu.

Dodaj następujący przykładowy kod do pliku Program.cs. Pamiętaj, aby zaktualizować zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal:


using Azure;
using Azure.AI.DocumentIntelligence;

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

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

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

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

AnalyzeResult result = operation.Value;

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

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

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

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

        Console.WriteLine();
    }

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

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

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

        Console.WriteLine();
    }
}

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

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

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

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

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

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

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

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

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

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

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji wybierz zielony przycisk Start obok formRecognizer_quickstart, aby skompilować i uruchomić program, lub naciśnij F5.

Zrzut ekranu przedstawiający przycisk Uruchom program Visual Studio.

Dodaj następujący przykładowy kod do pliku Program.cs. Upewnij się, że zaktualizowano zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia usługi Rozpoznawanie formularzy w witrynie Azure Portal:

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

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji wybierz zielony przycisk Start obok formRecognizer_quickstart, aby skompilować i uruchomić program, lub naciśnij F5.

Zrzut ekranu przedstawiający lokalizację przycisku programu Visual Studio.

Dane wyjściowe modelu układu

Oto fragment oczekiwanego danych wyjściowych:

  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

Aby wyświetlić wszystkie dane wyjściowe, odwiedź repozytorium przykładów platformy Azure w witrynie GitHub, aby wyświetlić dane wyjściowe modelu układu.

Dodaj następujący przykładowy kod do pliku Program.cs. Upewnij się, że zaktualizowano zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia usługi Rozpoznawanie formularzy w witrynie Azure Portal:

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

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji wybierz zielony przycisk Start obok formRecognizer_quickstart, aby skompilować i uruchomić program, lub naciśnij F5.

Zrzut ekranu przedstawiający uruchamianie programu Visual Studio.

Wstępnie utworzony model

Analizowanie i wyodrębnianie typowych pól z określonych typów dokumentów przy użyciu wstępnie utworzonego modelu. W tym przykładzie analizujemy fakturę przy użyciu wstępnie utworzonego modelu faktury .

Napiwek

Nie masz ograniczeń do faktur — istnieje kilka wstępnie utworzonych modeli do wyboru, z których każdy ma własny zestaw obsługiwanych pól. Model do użycia dla analyze operacji zależy od typu dokumentu do przeanalizowania. Zobacz wyodrębnianie danych modelu.

  • Analizowanie faktury przy użyciu wstępnie utworzonego modelu faktury. Na potrzeby tego przewodnika Szybki start możesz użyć naszego przykładowego dokumentu faktury.
  • Dodaliśmy wartość identyfikatora URI pliku do Uri invoiceUri zmiennej w górnej części pliku Program.cs.
  • Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyj StartAnalyzeDocumentFromUri metody i przekaż prebuilt-invoice go jako identyfikator modelu. Zwracana wartość jest obiektem zawierającym AnalyzeResult dane z przesłanego dokumentu.
  • Dla uproszczenia wszystkie pary klucz-wartość zwracane przez usługę nie są tutaj wyświetlane. Aby wyświetlić listę wszystkich obsługiwanych pól i odpowiednich typów, zobacz naszą stronę koncepcji faktury .

Dodaj następujący przykładowy kod do pliku Program.cs. Pamiętaj, aby zaktualizować zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal:


using Azure;
using Azure.AI.DocumentIntelligence;

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

//sample invoice document

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

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

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

AnalyzeResult result = operation.Value;

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

    AnalyzedDocument document = result.Documents[i];

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

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

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

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

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

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

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

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

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

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji wybierz zielony przycisk Start obok formRecognizer_quickstart, aby skompilować i uruchomić program, lub naciśnij F5.

Zrzut ekranu przedstawiający przycisk Uruchom program Visual Studio.

Dodaj następujący przykładowy kod do pliku Program.cs. Upewnij się, że zaktualizowano zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia usługi Rozpoznawanie formularzy w witrynie Azure Portal:


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

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji wybierz zielony przycisk Start obok formRecognizer_quickstart, aby skompilować i uruchomić program, lub naciśnij F5.

Zrzut ekranu przedstawiający lokalizację przycisku programu Visual Studio.

Wstępnie utworzone dane wyjściowe modelu

Oto fragment oczekiwanego danych wyjściowych:

  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

Aby wyświetlić wszystkie dane wyjściowe, odwiedź repozytorium przykładów platformy Azure w witrynie GitHub, aby wyświetlić wstępnie utworzone dane wyjściowe modelu faktur.

Dodaj następujący przykładowy kod do pliku Program.cs. Upewnij się, że zaktualizowano zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia usługi Rozpoznawanie formularzy w witrynie Azure Portal:


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

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji wybierz zielony przycisk Start obok formRecognizer_quickstart, aby skompilować i uruchomić program, lub naciśnij F5.

Zrzut ekranu przedstawiający uruchamianie programu Visual Studio.

W tym przewodniku Szybki start użyj następujących funkcji, aby analizować i wyodrębniać dane oraz wartości z formularzy i dokumentów:

  • Układ — analizuj i wyodrębniaj tabele, linie, wyrazy i znaczniki zaznaczenia, takie jak przyciski radiowe i pola wyboru w dokumentach, bez konieczności trenowania modelu.

  • Wstępnie utworzona faktura — analizowanie i wyodrębnianie typowych pól z określonych typów dokumentów przy użyciu wstępnie wytrenowanego modelu.

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz jedną bezpłatnie.

  • Najnowsza wersja programu Visual Studio Code lub preferowanego środowiska IDE. Zobacz Java w programie Visual Studio Code.

    Napiwek

    • Program Visual Studio Code oferuje pakiet kodowania dla języka Java dla systemów Windows i macOS. Pakiet kodowania jest pakietem programu VS Code, zestawem Java Development Kit (JDK) i kolekcją sugerowanych rozszerzeń firmy Microsoft. Pakiet kodowania może również służyć do naprawiania istniejącego środowiska programistycznego.
    • Jeśli używasz programu VS Code i pakietu programistycznego dla języka Java, zainstaluj rozszerzenie Gradle for Java .
  • Jeśli nie używasz programu Visual Studio Code, upewnij się, że w środowisku projektowym zainstalowano następujące elementy:

  • Usługi azure AI lub zasób analizy dokumentów. Po utworzeniu subskrypcji platformy Azure utwórz zasób analizy dokumentów z jedną usługą lub wieloma usługami w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

    Napiwek

    Utwórz zasób usług Azure AI, jeśli planujesz uzyskać dostęp do wielu usług azure AI w ramach jednego punktu końcowego/klucza. W przypadku dostępu tylko do analizy dokumentów utwórz zasób analizy dokumentów. Należy pamiętać, że jeśli zamierzasz używać uwierzytelniania firmy Microsoft Entra, potrzebujesz zasobu z jedną usługą.

  • Po wdrożeniu zasobu wybierz pozycję Przejdź do zasobu. Potrzebujesz klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API analizy dokumentów. Później wklejasz klucz i punkt końcowy do kodu:

    Zrzut ekranu przedstawiający klucze i lokalizację punktu końcowego w witrynie Azure Portal.

Konfiguruj

Tworzenie nowego projektu narzędzia Gradle

  1. W oknie konsoli (takim jak cmd, PowerShell lub Bash) utwórz nowy katalog dla aplikacji o nazwie doc-intel-app i przejdź do niego.

    mkdir doc-intel-app && doc-intel-app
    
    mkdir doc-intel-app; cd doc-intel-app
    
  2. gradle init Uruchom polecenie z katalogu roboczego. To polecenie tworzy podstawowe pliki kompilacji dla narzędzia Gradle, w tym build.gradle.kts, które są używane w czasie wykonywania do tworzenia i konfigurowania aplikacji.

    gradle init --type basic
    
  3. Po wyświetleniu monitu wybierz pozycję Język DSL, a następnie Kotlin.

  4. Zaakceptuj domyślną nazwę projektu (doc-intel-app), wybierając pozycję Return lub Enter.

  1. W oknie konsoli (takim jak cmd, PowerShell lub Bash) utwórz nowy katalog dla aplikacji o nazwie form-recognize-app i przejdź do niego.

    mkdir form-recognize-app && form-recognize-app
    
    mkdir form-recognize-app; cd form-recognize-app
    
  2. gradle init Uruchom polecenie z katalogu roboczego. To polecenie tworzy podstawowe pliki kompilacji dla narzędzia Gradle, w tym build.gradle.kts, które są używane w czasie wykonywania do tworzenia i konfigurowania aplikacji.

    gradle init --type basic
    
  3. Po wyświetleniu monitu wybierz pozycję Język DSL, a następnie Kotlin.

  4. Zaakceptuj domyślną nazwę projektu (form-recognize-app), wybierając pozycję Return lub Enter.

Instalowanie biblioteki klienta

W tym przewodniku Szybki start jest używany menedżer zależności narzędzia Gradle. Bibliotekę klienta i informacje dotyczące innych menedżerów zależności można znaleźć w repozytorium centralnym programu Maven.

Otwórz plik build.gradle.kts projektu w środowisku IDE. Copay i wklej następujący kod, aby dołączyć bibliotekę klienta jako instrukcję implementation wraz z wymaganymi wtyczkami i ustawieniami.

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

   }

W tym przewodniku Szybki start jest używany menedżer zależności narzędzia Gradle. Bibliotekę klienta i informacje dotyczące innych menedżerów zależności można znaleźć w repozytorium centralnym programu Maven.

Otwórz plik build.gradle.kts projektu w środowisku IDE. Copay i wklej następujący kod, aby dołączyć bibliotekę klienta jako instrukcję implementation wraz z wymaganymi wtyczkami i ustawieniami.

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

   }

W tym przewodniku Szybki start jest używany menedżer zależności narzędzia Gradle. Bibliotekę klienta i informacje dotyczące innych menedżerów zależności można znaleźć w repozytorium centralnym programu Maven.

Otwórz plik build.gradle.kts projektu w środowisku IDE. Copay i wklej następujący kod, aby dołączyć bibliotekę klienta jako instrukcję implementation wraz z wymaganymi wtyczkami i ustawieniami.

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


   }

Tworzenie aplikacji Java

Aby wchodzić w interakcje z usługą Analizy dokumentów, musisz utworzyć wystąpienie DocumentIntelligenceClient klasy . W tym celu należy utworzyć element za AzureKeyCredential key pomocą witryny Azure Portal i DocumentIntelligenceClient wystąpienia za pomocą narzędzia AzureKeyCredential i analizy endpointdokumentów.

Aby wchodzić w interakcje z usługą Analizy dokumentów, musisz utworzyć wystąpienie DocumentAnalysisClient klasy . W tym celu należy utworzyć element za AzureKeyCredential key pomocą witryny Azure Portal i DocumentAnalysisClient wystąpienia za pomocą narzędzia AzureKeyCredential i analizy endpointdokumentów.

  1. W katalogu doc-intel-app uruchom następujące polecenie:

    mkdir -p src/main/java
    

    Utworzysz następującą strukturę katalogów:

    Zrzut ekranu przedstawiający strukturę katalogu Java

  1. Przejdź do java katalogu i utwórz plik o nazwie DocIntelligence.java.

    Napiwek

    • Nowy plik można utworzyć przy użyciu programu PowerShell.
    • Otwórz okno programu PowerShell w katalogu projektu, trzymając wciśnięty Shift i klikając folder prawym przyciskiem myszy.
    • Wpisz następujące polecenie New-Item DocIntelligence.java.
  2. Otwórz plik DocIntelligence.java. Skopiuj i wklej jeden z następujących przykładów kodu do aplikacji:

  1. Przejdź do java katalogu i utwórz plik o nazwie FormRecognizer.java.

    Napiwek

    • Nowy plik można utworzyć przy użyciu programu PowerShell.
    • Otwórz okno programu PowerShell w katalogu projektu, trzymając wciśnięty Shift i klikając folder prawym przyciskiem myszy.
    • Wpisz następujące polecenie New-Item FormRecognizer.java.
  2. Otwórz plik FormRecognizer.java. Skopiuj i wklej jeden z następujących przykładów kodu do aplikacji:

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz Zabezpieczenia usług Azure AI.

Model układu

Wyodrębnij tekst, znaczniki zaznaczenia, style tekstu, struktury tabel i współrzędne regionu ograniczenia z dokumentów.

  • W tym przykładzie potrzebny będzie plik dokumentu w identyfikatorze URI. W tym przewodniku Szybki start możesz użyć naszego przykładowego dokumentu .
  • Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyjesz beginAnalyzeDocumentFromUrl metody i przekażesz prebuilt-layout go jako identyfikator modelu. Zwracana wartość to AnalyzeResult obiekt zawierający dane dotyczące przesłanego dokumentu.
  • Dodaliśmy wartość identyfikatora URI pliku do zmiennej documentUrl w metodzie main.

Dodaj następujący przykładowy kod do DocIntelligence.java pliku. Pamiętaj, aby zaktualizować zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal:


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

import java.util.List;

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

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

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

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

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

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

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

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

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

Kompilowanie i uruchamianie aplikacji

Po dodaniu przykładu kodu do aplikacji wróć do głównego katalogu projektu — doc-intel-app.

  1. Skompiluj aplikację za build pomocą polecenia :

    gradle build
    
  2. Uruchom aplikację za run pomocą polecenia :

    gradle run
    

Dodaj następujący przykładowy kod do FormRecognizer.java pliku. Pamiętaj, aby zaktualizować zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal:


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

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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();

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

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

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

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

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

Kompilowanie i uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji wróć do głównego katalogu projektu — form-recognize-app.

  1. Skompiluj aplikację za build pomocą polecenia :

    gradle build
    
  2. Uruchom aplikację za run pomocą polecenia :

    gradle run
    

Dane wyjściowe modelu układu

Oto fragment oczekiwanego danych wyjściowych:

  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.

Aby wyświetlić wszystkie dane wyjściowe, odwiedź repozytorium przykładów platformy Azure w witrynie GitHub, aby wyświetlić dane wyjściowe modelu układu.

Dodaj następujący przykładowy kod do FormRecognizer.java pliku. Pamiętaj, aby zaktualizować zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal:


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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();

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

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

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

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

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

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

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

Kompilowanie i uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji wróć do głównego katalogu projektu — form-recognize-app.

  1. Skompiluj aplikację za build pomocą polecenia :

    gradle build
    
  2. Uruchom aplikację za run pomocą polecenia :

    gradle run
    

Wstępnie utworzony model

Analizowanie i wyodrębnianie typowych pól z określonych typów dokumentów przy użyciu wstępnie utworzonego modelu. W tym przykładzie analizujemy fakturę przy użyciu wstępnie utworzonego modelu faktury .

Napiwek

Nie masz ograniczeń do faktur — istnieje kilka wstępnie utworzonych modeli do wyboru, z których każdy ma własny zestaw obsługiwanych pól. Model do użycia dla analyze operacji zależy od typu dokumentu do przeanalizowania. Zobacz wyodrębnianie danych modelu.

  • Analizowanie faktury przy użyciu wstępnie utworzonego modelu faktury. Na potrzeby tego przewodnika Szybki start możesz użyć naszego przykładowego dokumentu faktury.
  • Dodaliśmy wartość adresu URL pliku do zmiennej invoiceUrl w górnej części pliku.
  • Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyjesz beginAnalyzeDocuments metody i przekażesz PrebuiltModels.Invoice go jako identyfikator modelu. Zwracana wartość jest obiektem zawierającym result dane dotyczące przesłanego dokumentu.
  • Dla uproszczenia wszystkie pary klucz-wartość zwracane przez usługę nie są tutaj wyświetlane. Aby wyświetlić listę wszystkich obsługiwanych pól i odpowiednich typów, zobacz naszą stronę koncepcji faktury .

Dodaj następujący przykładowy kod do DocIntelligence.java pliku. Pamiętaj, aby zaktualizować zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal:


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

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

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Kompilowanie i uruchamianie aplikacji

Po dodaniu przykładu kodu do aplikacji wróć do głównego katalogu projektu — doc-intel-app.

  1. Skompiluj aplikację za build pomocą polecenia :

    gradle build
    
  2. Uruchom aplikację za run pomocą polecenia :

    gradle run
    

Dodaj następujący przykładowy kod do FormRecognizer.java pliku. Pamiętaj, aby zaktualizować zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal:


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

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

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

public class FormRecognizer {

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

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

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

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

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

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

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

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

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

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

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

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

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

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

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

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

Kompilowanie i uruchamianie aplikacji

Po dodaniu przykładu kodu do aplikacji wróć do głównego katalogu projektu — doc-intel-app.

  1. Skompiluj aplikację za build pomocą polecenia :

    gradle build
    
  2. Uruchom aplikację za run pomocą polecenia :

    gradle run
    

Wstępnie utworzone dane wyjściowe modelu

Oto fragment oczekiwanego danych wyjściowych:

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

Aby wyświetlić wszystkie dane wyjściowe, odwiedź repozytorium przykładów platformy Azure w witrynie GitHub, aby wyświetlić wstępnie utworzone dane wyjściowe modelu faktur.

Dodaj następujący przykładowy kod do FormRecognizer.java pliku. Pamiętaj, aby zaktualizować zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal:


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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

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

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

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

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

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

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

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

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

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

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

Kompilowanie i uruchamianie aplikacji

Po dodaniu przykładu kodu do aplikacji wróć do głównego katalogu projektu — doc-intel-app.

  1. Skompiluj aplikację za build pomocą polecenia :

    gradle build
    
  2. Uruchom aplikację za run pomocą polecenia :

    gradle run
    

W tym przewodniku Szybki start użyj następujących funkcji, aby analizować i wyodrębniać dane oraz wartości z formularzy i dokumentów:

  • Układ — analizuj i wyodrębniaj tabele, linie, wyrazy i znaczniki zaznaczenia, takie jak przyciski radiowe i pola wyboru w dokumentach, bez konieczności trenowania modelu.

  • Wstępnie utworzona faktura — analizowanie i wyodrębnianie typowych pól z określonych typów dokumentów przy użyciu wstępnie wytrenowanego modelu faktury.

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz jedną bezpłatnie.

  • Najnowsza wersja programu Visual Studio Code lub preferowanego środowiska IDE. Aby uzyskać więcej informacji, zobacz Node.js w programie Visual Studio Code.

  • Najnowsza LTS wersja Node.js.

  • Usługi azure AI lub zasób analizy dokumentów. Po utworzeniu subskrypcji platformy Azure utwórz zasób analizy dokumentów z jedną usługą lub wieloma usługami w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

    Napiwek

    Utwórz zasób usług Azure AI, jeśli planujesz uzyskać dostęp do wielu usług azure AI w ramach jednego punktu końcowego/klucza. W przypadku dostępu tylko do analizy dokumentów utwórz zasób analizy dokumentów. Należy pamiętać, że jeśli zamierzasz używać uwierzytelniania firmy Microsoft Entra, potrzebujesz zasobu z jedną usługą.

  • Po wdrożeniu zasobu wybierz pozycję Przejdź do zasobu. Potrzebujesz klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API analizy dokumentów. Klucz i punkt końcowy wklejasz do kodu w dalszej części przewodnika Szybki start:

    Zrzut ekranu przedstawiający klucze i lokalizację punktu końcowego w witrynie Azure Portal.

Konfiguruj

  1. Utwórz nową aplikację Node.js Express: w oknie konsoli (takim jak cmd, PowerShell lub Bash) utwórz i przejdź do nowego katalogu aplikacji o nazwie doc-intel-app.

    mkdir doc-intel-app && cd doc-intel-app
    
  2. Uruchom polecenie , npm init aby zainicjować aplikację i szkielet projektu.

    npm init
    
  3. Określ atrybuty projektu przy użyciu monitów przedstawionych w terminalu.

    • Najważniejsze atrybuty to nazwa, numer wersji i punkt wejścia.
    • Zalecamy zachowanie index.js nazwy punktu wejścia. Opis, polecenie testowe, repozytorium GitHub, słowa kluczowe, autor i informacje o licencji są atrybutami opcjonalnymi — można je pominąć dla tego projektu.
    • Zaakceptuj sugestie w nawiasach, wybierając pozycję Return lub Enter.
    • Po zakończeniu monitów package.json plik zostanie utworzony w katalogu doc-intel-app.
  1. Zainstaluj bibliotekę ai-document-intelligence klienta i azure/identity pakiety npm:

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

    Plik aplikacji package.json jest aktualizowany przy użyciu zależności.

  1. Zainstaluj bibliotekę ai-form-recognizer klienta i azure/identity pakiety npm:

    npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
    
    • Plik aplikacji package.json jest aktualizowany przy użyciu zależności.
  1. Zainstaluj bibliotekę ai-form-recognizer klienta i azure/identity pakiety npm:

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. Utwórz plik o nazwie index.js w katalogu aplikacji.

    Napiwek

    • Nowy plik można utworzyć przy użyciu programu PowerShell.
    • Otwórz okno programu PowerShell w katalogu projektu, trzymając wciśnięty Shift i klikając folder prawym przyciskiem myszy.
    • Wpisz następujące polecenie New-Item index.js.

Kompilowanie aplikacji

Aby wchodzić w interakcje z usługą Analizy dokumentów, musisz utworzyć wystąpienie DocumentIntelligenceClient klasy . W tym celu należy utworzyć element za AzureKeyCredential key pomocą witryny Azure Portal i DocumentIntelligenceClient wystąpienia za pomocą narzędzia AzureKeyCredential i analizy endpointdokumentów.

Aby wchodzić w interakcje z usługą Analizy dokumentów, musisz utworzyć wystąpienie DocumentAnalysisClient klasy . W tym celu należy utworzyć element AzureKeyCredential za key pomocą witryny Azure Portal i DocumentAnalysisClient wystąpienia za pomocą narzędzia AzureKeyCredential rozpoznawania formularzy endpointi .

  1. index.js Otwórz plik w programie Visual Studio Code lub ulubionym środowisku IDE. Skopiuj i wklej jeden z następujących przykładów kodu do aplikacji:

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz Zabezpieczenia usług Azure AI.

Model układu

Wyodrębnij tekst, znaczniki zaznaczenia, style tekstu, struktury tabel i współrzędne regionu ograniczenia z dokumentów.

  • W tym przykładzie potrzebny będzie plik dokumentu z adresu URL. W tym przewodniku Szybki start możesz użyć naszego przykładowego dokumentu .
  • Dodaliśmy wartość adresu URL pliku do zmiennej formUrl w górnej części pliku.
  • Aby przeanalizować dany plik z adresu URL, użyjesz beginAnalyzeDocuments metody i przekażesz prebuilt-layout go jako identyfikator modelu.
    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);
});

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji uruchom program:

  1. Przejdź do folderu, w którym masz aplikację analizy dokumentów (doc-intel-app).

  2. Wpisz następujące polecenie w terminalu:

    node index.js
    

Dodaj następujący przykładowy kod do index.js pliku. Pamiętaj, aby zaktualizować zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal:


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

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

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

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

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

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

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

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

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

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji uruchom program:

  1. Przejdź do folderu, w którym masz aplikację analizy dokumentów (doc-intel-app).

  2. Wpisz następujące polecenie w terminalu:

    node index.js
    

Dane wyjściowe modelu układu

Oto fragment oczekiwanego danych wyjściowych:

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

Aby wyświetlić wszystkie dane wyjściowe, odwiedź repozytorium przykładów platformy Azure w witrynie GitHub, aby wyświetlić dane wyjściowe modelu układu.

Wstępnie utworzony model

W tym przykładzie analizujemy fakturę przy użyciu wstępnie utworzonego modelu faktury .

Napiwek

Nie masz ograniczeń do faktur — istnieje kilka wstępnie utworzonych modeli do wyboru, z których każdy ma własny zestaw obsługiwanych pól. Model do użycia dla analyze operacji zależy od typu dokumentu do przeanalizowania. Zobacz wyodrębnianie danych modelu.

  • Analizowanie faktury przy użyciu wstępnie utworzonego modelu faktury. Na potrzeby tego przewodnika Szybki start możesz użyć naszego przykładowego dokumentu faktury.
  • Dodaliśmy wartość adresu URL pliku do zmiennej invoiceUrl w górnej części pliku.
  • Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyjesz beginAnalyzeDocuments metody i przekażesz PrebuiltModels.Invoice go jako identyfikator modelu. Zwracana wartość jest obiektem zawierającym result dane dotyczące przesłanego dokumentu.
  • Dla uproszczenia wszystkie pary klucz-wartość zwracane przez usługę nie są tutaj wyświetlane. Aby wyświetlić listę wszystkich obsługiwanych pól i odpowiednich typów, zobacz naszą stronę koncepcji faktury .

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

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji uruchom program:

  1. Przejdź do folderu, w którym masz aplikację analizy dokumentów (doc-intel-app).

  2. Wpisz następujące polecenie w terminalu:

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

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji uruchom program:

  1. Przejdź do folderu, w którym masz aplikację analizy dokumentów (doc-intel-app).

  2. Wpisz następujące polecenie w terminalu:

    node index.js
    

Wstępnie utworzone dane wyjściowe modelu

Oto fragment oczekiwanego danych wyjściowych:

  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

Aby wyświetlić wszystkie dane wyjściowe, odwiedź repozytorium przykładów platformy Azure w witrynie GitHub, aby wyświetlić wstępnie utworzone dane wyjściowe modelu faktur.

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

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji uruchom program:

  1. Przejdź do folderu, w którym masz aplikację analizy dokumentów (doc-intel-app).

  2. Wpisz następujące polecenie w terminalu:

    node index.js
    

W tym przewodniku Szybki start użyj następujących funkcji, aby analizować i wyodrębniać dane z formularzy i dokumentów:

  • Układ — analizuj i wyodrębniaj tabele, linie, wyrazy i znaczniki zaznaczenia, takie jak przyciski radiowe i pola wyboru, oraz pary klucz-wartość bez konieczności trenowania modelu.

  • Wstępnie utworzona faktura — analizowanie i wyodrębnianie typowych pól z określonych typów dokumentów przy użyciu wstępnie wytrenowanego modelu.

Wymagania wstępne

Napiwek

Utwórz zasób usług Azure AI, jeśli planujesz uzyskać dostęp do wielu usług azure AI w ramach jednego punktu końcowego/klucza. W przypadku dostępu tylko do analizy dokumentów utwórz zasób analizy dokumentów. Należy pamiętać, że jeśli zamierzasz używać uwierzytelniania firmy Microsoft Entra, potrzebujesz zasobu z jedną usługą.

  • Po wdrożeniu zasobu wybierz pozycję Przejdź do zasobu. Potrzebujesz klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API analizy dokumentów. Klucz i punkt końcowy wklejasz do kodu w dalszej części przewodnika Szybki start:

    Zrzut ekranu przedstawiający klucze i lokalizację punktu końcowego w witrynie Azure Portal.

Konfiguruj

Otwórz okno terminalu w środowisku lokalnym i zainstaluj bibliotekę klienta azure AI Document Intelligence dla języka Python za pomocą narzędzia:

pip install azure-ai-documentintelligence==1.0.0b4

pip install azure-ai-formrecognizer==3.3.0

pip install azure-ai-formrecognizer==3.2.0b6

Tworzenie aplikacji w języku Python

Aby wchodzić w interakcje z usługą Analizy dokumentów, musisz utworzyć wystąpienie DocumentIntelligenceClient klasy . W tym celu należy utworzyć element za AzureKeyCredential key pomocą witryny Azure Portal i DocumentIntelligenceClient wystąpienia za pomocą narzędzia AzureKeyCredential i analizy endpointdokumentów.

  1. Utwórz nowy plik języka Python o nazwie doc_intel_quickstart.py w preferowanym edytorze lub środowisku IDE.

  2. Otwórz plik doc_intel_quickstart.py i wybierz jeden z następujących przykładów kodu, aby skopiować i wkleić do aplikacji:

Aby wchodzić w interakcje z usługą Analizy dokumentów, musisz utworzyć wystąpienie DocumentAnalysisClient klasy . W tym celu należy utworzyć element za AzureKeyCredential key pomocą witryny Azure Portal i DocumentAnalysisClient wystąpienia za pomocą narzędzia AzureKeyCredential i analizy endpointdokumentów.

  1. Utwórz nowy plik języka Python o nazwie form_recognizer_quickstart.py w preferowanym edytorze lub środowisku IDE.

  2. Otwórz plik form_recognizer_quickstart.py i wybierz jeden z następujących przykładów kodu, aby skopiować i wkleić do aplikacji:

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz Zabezpieczenia usług Azure AI.

Model układu

Wyodrębnij tekst, znaczniki zaznaczenia, style tekstu, struktury tabel i współrzędne regionu ograniczenia z dokumentów.

  • W tym przykładzie potrzebny będzie plik dokumentu z adresu URL. W tym przewodniku Szybki start możesz użyć naszego przykładowego dokumentu .
  • Dodaliśmy wartość adresu URL pliku do zmiennej formUrl analyze_layout w funkcji .

Dodaj następujący przykładowy kod do aplikacji doc_intel_quickstart.py. Pamiętaj, aby zaktualizować zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal:


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

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

# helper functions

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


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


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

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

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

    result: AnalyzeResult = poller.result()

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

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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji skompiluj i uruchom program:

  1. Przejdź do folderu, w którym masz plik doc_intel_quickstart.py .

  2. Wpisz następujące polecenie w terminalu:

    python doc_intel_quickstart.py
    

Aby przeanalizować dany plik pod adresem URL, użyj begin_analyze_document_from_url metody i przekaż prebuilt-layout go jako identyfikator modelu. Zwracana wartość jest obiektem zawierającym result dane dotyczące przesłanego dokumentu.

Dodaj następujący przykładowy kod do aplikacji form_recognizer_quickstart.py. Upewnij się, że zaktualizowano zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia usługi Rozpoznawanie formularzy w witrynie Azure Portal:


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

Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji skompiluj i uruchom program:

  1. Przejdź do folderu, w którym masz plik form_recognizer_quickstart.py .

  2. Wpisz następujące polecenie w terminalu:

    python form_recognizer_quickstart.py
    

Dane wyjściowe modelu układu

Oto fragment oczekiwanego danych wyjściowych:

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

Aby wyświetlić wszystkie dane wyjściowe, odwiedź repozytorium przykładów platformy Azure w witrynie GitHub, aby wyświetlić dane wyjściowe modelu układu.

Dodaj następujący przykładowy kod do aplikacji form_recognizer_quickstart.py. Upewnij się, że zaktualizowano zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia usługi Rozpoznawanie formularzy w witrynie Azure Portal:


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


Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji skompiluj i uruchom program:

  1. Przejdź do folderu, w którym masz plik form_recognizer_quickstart.py .

  2. Wpisz następujące polecenie w terminalu:

    python form_recognizer_quickstart.py
    

Wstępnie utworzony model

Analizowanie i wyodrębnianie typowych pól z określonych typów dokumentów przy użyciu wstępnie utworzonego modelu. W tym przykładzie analizujemy fakturę przy użyciu wstępnie utworzonego modelu faktury .

Napiwek

Nie masz ograniczeń do faktur — istnieje kilka wstępnie utworzonych modeli do wyboru, z których każdy ma własny zestaw obsługiwanych pól. Model do użycia dla analyze operacji zależy od typu dokumentu do przeanalizowania. Zobacz wyodrębnianie danych modelu.

  • Analizowanie faktury przy użyciu wstępnie utworzonego modelu faktury. Na potrzeby tego przewodnika Szybki start możesz użyć naszego przykładowego dokumentu faktury.
  • Dodaliśmy wartość adresu URL pliku do zmiennej invoiceUrl w górnej części pliku.
  • Dla uproszczenia wszystkie pary klucz-wartość zwracane przez usługę nie są tutaj wyświetlane. Aby wyświetlić listę wszystkich obsługiwanych pól i odpowiednich typów, zobacz naszą stronę koncepcji faktury .

Dodaj następujący przykładowy kod do aplikacji doc_intel_quickstart.py. Pamiętaj, aby zaktualizować zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal:


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



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

def analyze_invoice():
    # sample document

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

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

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

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


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


if __name__ == "__main__":
    analyze_invoice()


Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji skompiluj i uruchom program:

  1. Przejdź do folderu, w którym masz plik doc_intel_quickstart.py .

  2. Wpisz następujące polecenie w terminalu:

    python doc_intel_quickstart.py
    

Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyj begin_analyze_document_from_url metody i przekaż prebuilt-invoice go jako identyfikator modelu. Zwracana wartość jest obiektem zawierającym result dane dotyczące przesłanego dokumentu.

Dodaj następujący przykładowy kod do aplikacji form_recognizer_quickstart.py. Upewnij się, że zaktualizowano zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia usługi Rozpoznawanie formularzy w witrynie Azure Portal:

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


Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji skompiluj i uruchom program:

  1. Przejdź do folderu, w którym masz plik form_recognizer_quickstart.py .

  2. Wpisz następujące polecenie w terminalu:

    python form_recognizer_quickstart.py
    

Wstępnie utworzone dane wyjściowe modelu

Oto fragment oczekiwanego danych wyjściowych:

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

Aby wyświetlić wszystkie dane wyjściowe, odwiedź repozytorium przykładów platformy Azure w witrynie GitHub, aby wyświetlić wstępnie utworzone dane wyjściowe modelu faktur.

Dodaj następujący przykładowy kod do aplikacji form_recognizer_quickstart.py. Upewnij się, że zaktualizowano zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia usługi Rozpoznawanie formularzy w witrynie Azure Portal:


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


Uruchamianie aplikacji

Po dodaniu przykładowego kodu do aplikacji skompiluj i uruchom program:

  1. Przejdź do folderu, w którym masz plik form_recognizer_quickstart.py .

  2. Wpisz następujące polecenie w terminalu:

    python form_recognizer_quickstart.py
    

W tym przewodniku Szybki start dowiesz się, jak używać interfejsu API REST analizy dokumentów do analizowania i wyodrębniania danych i wartości z dokumentów:

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie

  • Zainstalowane narzędzie wiersza polecenia curl.

  • PowerShell w wersji 7.*+ (lub podobnej aplikacji wiersza polecenia).):

  • Aby sprawdzić wersję programu PowerShell, wpisz następujące polecenie względem systemu operacyjnego:

    • Windows: Get-Host | Select-Object Version
    • macOS lub Linux: $PSVersionTable
  • Zasób analizy dokumentów (pojedynczej usługi) lub usługi Azure AI (multi-service). Po utworzeniu subskrypcji platformy Azure utwórz zasób analizy dokumentów z jedną usługą lub wieloma usługami w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

Napiwek

Utwórz zasób usług Azure AI, jeśli planujesz uzyskać dostęp do wielu usług azure AI w ramach jednego punktu końcowego/klucza. W przypadku dostępu tylko do analizy dokumentów utwórz zasób analizy dokumentów. Należy pamiętać, że jeśli zamierzasz używać uwierzytelniania firmy Microsoft Entra, potrzebujesz zasobu z jedną usługą.

  • Po wdrożeniu zasobu wybierz pozycję Przejdź do zasobu. Potrzebujesz klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API analizy dokumentów. Klucz i punkt końcowy wklejasz do kodu w dalszej części przewodnika Szybki start:

    Zrzut ekranu przedstawiający klucze i lokalizację punktu końcowego w witrynie Azure Portal.

Analizowanie dokumentów i uzyskiwanie wyników

Żądanie POST służy do analizowania dokumentów przy użyciu wstępnie utworzonego lub niestandardowego modelu. Żądanie GET służy do pobierania wyniku wywołania analizy dokumentu. Element modelId jest używany z operacjami POST i resultId GET.

Analizowanie dokumentu (żądanie POST)

Przed uruchomieniem polecenia cURL wprowadź następujące zmiany w żądaniu post:

  1. Zastąp {endpoint} element wartością punktu końcowego z wystąpienia analizy dokumentów w witrynie Azure Portal.

  2. Zastąp {key} ciąg wartością klucza z wystąpienia analizy dokumentów w witrynie Azure Portal.

  3. Korzystając z poniższej tabeli jako odwołania, zastąp {modelID} wartości i {your-document-url} żądanymi wartościami.

  4. Potrzebny jest plik dokumentu pod adresem URL. W tym przewodniku Szybki start możesz użyć przykładowych formularzy podanych w poniższej tabeli dla każdej funkcji:

Przykładowe dokumenty

Funkcja {modelID} {twój-dokument-url}
Przeczytaj odczyt wstępnie utworzony https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Układ wstępnie utworzony układ https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Karta ubezpieczenia zdrowotnego 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
Faktura wstępnie utworzona faktura https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Paragon wstępnie utworzone potwierdzenie https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Dokument tożsamości prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

Przykładowe dokumenty

Funkcja {modelID} {twój-dokument-url}
Dokument ogólny wstępnie utworzony dokument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Przeczytaj odczyt wstępnie utworzony https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Układ wstępnie utworzony układ https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Karta ubezpieczenia zdrowotnego 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
Faktura wstępnie utworzona faktura https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Paragon wstępnie utworzone potwierdzenie https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Dokument tożsamości prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png
Wizytówka wstępnie utworzona karta biznesowa https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz Zabezpieczenia usług Azure AI.

Żądanie POST

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}'}"

Odpowiedź POST (resultID)

Otrzymasz odpowiedź zawierającą 202 (Success) nagłówek Operation-Location tylko do odczytu. Wartość tego nagłówka zawiera element resultID , który można wysłać do zapytania w celu uzyskania stanu operacji asynchronicznej i pobrania wyników przy użyciu żądania GET z tym samym kluczem subskrypcji zasobu:

{alt-text}

Pobieranie wyników analizy (żądanie GET)

Po wywołaniu interfejsu Analyze documentAPI &preserve-view=true&tabs=HTTP wywołaj interfejs API Get analyze result&preserve-view=true&tabs=HTTP), aby uzyskać stan operacji i wyodrębnionych danych. Przed uruchomieniem polecenia wprowadź następujące zmiany:

Po wywołaniu interfejsu Analyze document API wywołaj interfejs API Uzyskiwanie wyników analizy, aby uzyskać stan operacji i wyodrębnione dane. Przed uruchomieniem polecenia wprowadź następujące zmiany:

Po wywołaniu interfejsu Analyze document API wywołaj interfejs API Uzyskiwanie wyników analizy, aby uzyskać stan operacji i wyodrębnione dane. Przed uruchomieniem polecenia wprowadź następujące zmiany:

  1. Zastąp {resultID} nagłówek Operation-Location z odpowiedzi POST.

  2. Zastąp {key} ciąg wartością klucza z wystąpienia analizy dokumentów w witrynie Azure Portal.

Żądanie GET

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

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

Sprawdzanie odpowiedzi

200 (Success) Otrzymasz odpowiedź z danymi wyjściowymi JSON. Pierwsze pole , "status"wskazuje stan operacji. Jeśli operacja nie jest ukończona, wartość "status" to "running" lub "notStarted", a należy wywołać interfejs API ponownie, ręcznie lub za pomocą skryptu. Zalecamy interwał co najmniej jednej sekundy między wywołaniami.

Przykładowa odpowiedź dla wstępnie utworzonej faktury

{
    "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
                                }
                      }],
              }]
      }
}

Obsługiwane pola dokumentów

Wstępnie utworzone modele wyodrębniają wstępnie zdefiniowane zestawy pól dokumentów. Zobacz Wyodrębnianie danych modelu, aby uzyskać wyodrębnione nazwy pól, typy, opisy i przykłady.

To wszystko, gratulacje!

W tym przewodniku Szybki start użyto modelu analizy dokumentów do analizowania różnych formularzy i dokumentów. Następnie zapoznaj się z dokumentacją narzędzia Document Intelligence Studio i dokumentacją referencyjną, aby dowiedzieć się więcej o interfejsie API analizy dokumentów.

Następne kroki

Ta zawartość dotyczy: Znacznik wersja 2.1 | Najnowsza wersja: niebieski znacznik wyboru wersja 4.0 (OGÓLNA)

Rozpocznij pracę z analizą dokumentów sztucznej inteligencji platformy Azure przy użyciu wybranego języka programowania lub interfejsu API REST. Analiza dokumentów to oparta na chmurze usługa Azure AI, która używa uczenia maszynowego do wyodrębniania par klucz-wartość, tekstu i tabel z dokumentów. Zalecamy korzystanie z bezpłatnej usługi podczas uczenia się technologii. Pamiętaj, że liczba bezpłatnych stron jest ograniczona do 500 miesięcznie.

Aby dowiedzieć się więcej na temat funkcji analizy dokumentów i opcji programowania, odwiedź naszą stronę Przegląd .

Dokumentacja referencyjna — pakiet | kodu | źródłowego biblioteki źródłowej (NuGet)Samples |

W tym przewodniku Szybki start użyjesz następujących interfejsów API, aby wyodrębnić dane ustrukturyzowane z formularzy i dokumentów:

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz jedną bezpłatnie.

  • Bieżąca wersja środowiska IDE programu Visual Studio.

  • Usługi azure AI lub zasób analizy dokumentów. Po utworzeniu subskrypcji platformy Azure utwórz zasób analizy dokumentów z jedną usługą lub wieloma usługami w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

    Napiwek

    Utwórz zasób usług Azure AI, jeśli planujesz uzyskać dostęp do wielu usług azure AI w ramach jednego punktu końcowego/klucza. W przypadku dostępu tylko do analizy dokumentów utwórz zasób analizy dokumentów. Należy pamiętać, że jeśli zamierzasz używać uwierzytelniania firmy Microsoft Entra, potrzebujesz zasobu z jedną usługą.

  • Po wdrożeniu zasobu wybierz pozycję Przejdź do zasobu. Potrzebujesz klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API analizy dokumentów. Klucz i punkt końcowy wklejasz do kodu w dalszej części przewodnika Szybki start:

    Zrzut ekranu przedstawiający klucze i lokalizację punktu końcowego w witrynie Azure Portal.

Konfiguruj

  1. Uruchom program Visual Studio 2019.

  2. Na stronie początkowej wybierz pozycję Utwórz nowy projekt.

    Zrzut ekranu przedstawiający okno uruchamiania programu Visual Studio.

  3. Na stronie Tworzenie nowego projektu wprowadź konsolę w polu wyszukiwania. Wybierz szablon Aplikacja konsolowa, a następnie wybierz pozycję Dalej.

    Zrzut ekranu przedstawiający stronę tworzenia nowego projektu w programie Visual Studio.

  4. W oknie dialogowym Konfigurowanie nowego projektu wprowadź formRecognizer_quickstart w polu Nazwa projektu. Następnie wybierz pozycję Dalej.

    Zrzut ekranu przedstawiający okno dialogowe Konfigurowanie nowego projektu w programie Visual Studios.

  5. W oknie dialogowym Dodatkowe informacje wybierz pozycję .NET 5.0 (bieżący), a następnie wybierz pozycję Utwórz.

    Zrzut ekranu przedstawiający okno dialogowe dodatkowych informacji programu Visual Studio.

Instalowanie biblioteki klienta za pomocą narzędzia NuGet

  1. Kliknij prawym przyciskiem myszy projekt formRecognizer_quickstart i wybierz polecenie Zarządzaj pakietami NuGet... .

    Zrzut ekranu przedstawiający okno wybierz pakiet NuGet.

  2. Wybierz kartę Przeglądaj i wpisz Azure.AI.FormRecognizer.

    Zrzut ekranu przedstawiający menu rozwijane select Document Intelligence package (Wybieranie pakietu analizy dokumentów).

  3. Wybierz wersję 3.1.1 z menu rozwijanego i wybierz pozycję Zainstaluj.

Kompilowanie aplikacji

Aby wchodzić w interakcje z usługą Analizy dokumentów, musisz utworzyć wystąpienie FormRecognizerClient klasy . W tym celu należy utworzyć element AzureKeyCredential z kluczem i wystąpieniem z AzureKeyCredential elementem i analizą FormRecognizerClient dokumentów endpoint.

Uwaga

  • Począwszy od platformy .NET 6, nowe projekty korzystające z console szablonu generują nowy styl programu, który różni się od poprzednich wersji.
  • Nowe dane wyjściowe korzystają z ostatnich funkcji języka C#, które upraszczają pisanie kodu.
  • W przypadku korzystania z nowszej wersji wystarczy napisać treść Main metody. Nie trzeba dołączać instrukcji najwyższego poziomu, globalnych dyrektyw using ani niejawnych dyrektyw using.
  • Aby uzyskać więcej informacji, zobacz Nowe szablony języka C# generują instrukcje najwyższego poziomu.
  1. Otwórz plik Program.cs.

  2. Uwzględnij następujące dyrektywy using:

using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
  1. endpoint Ustaw zmienne środowiskowe i key i utwórz wystąpienieAzureKeyCredential: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. Usuń wiersz , Console.Writeline("Hello World!"); i dodaj jeden z przykładów kodu Wypróbuj, aby Program.cs pliku:

    Zrzut ekranu przedstawiający dodawanie przykładowego kodu do metody Main.

  2. Wybierz przykładowy kod, aby skopiować i wkleić do metody Main aplikacji:

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz artykuł Azure AI Services security (Zabezpieczenia usług Azure AI).

Wypróbuj: model układu

Wyodrębnij tekst, znaczniki zaznaczenia, style tekstu i struktury tabel wraz ze współrzędnymi regionów ograniczenia z dokumentów.

  • W tym przykładzie potrzebny będzie plik dokumentu w identyfikatorze URI. W tym przewodniku Szybki start możesz użyć naszego przykładowego dokumentu .
  • Dodaliśmy wartość identyfikatora URI pliku do zmiennej formUri .
  • Aby wyodrębnić układ z danego pliku w identyfikatorze URI, użyj StartRecognizeContentFromUriAsync metody .

Dodaj następujący kod do pliku Program.cs aplikacji układu:


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

Wypróbuj: wstępnie utworzony model

W tym przykładzie pokazano, jak analizować dane z niektórych typów typowych dokumentów przy użyciu wstępnie wytrenowanych modeli przy użyciu faktury jako przykładu.

  • W tym przykładzie analizujemy dokument faktury przy użyciu wstępnie utworzonego modelu. Na potrzeby tego przewodnika Szybki start możesz użyć naszego przykładowego dokumentu faktury.
  • Dodaliśmy wartość identyfikatora URI pliku do invoiceUri zmiennej w górnej części metody Main.
  • Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyj StartRecognizeInvoicesFromUriAsync metody .
  • Dla uproszczenia wszystkie pola zwracane przez usługę nie są tutaj wyświetlane. Aby wyświetlić listę wszystkich obsługiwanych pól i odpowiednich typów, zobacz naszą stronę koncepcji faktury .

Wybieranie wstępnie utworzonego modelu

Nie masz ograniczeń do faktur — istnieje kilka wstępnie utworzonych modeli do wyboru, z których każdy ma własny zestaw obsługiwanych pól. Model do użycia na potrzeby operacji analizy zależy od typu dokumentu do przeanalizowania. Poniżej przedstawiono wstępnie utworzone modele obecnie obsługiwane przez usługę Analizy dokumentów:

  • Faktura: wyodrębnia tekst, znaczniki wyboru, tabele, pola i kluczowe informacje z faktur.
  • Potwierdzenie: wyodrębnia tekst i kluczowe informacje z paragonów.
  • Dokument identyfikacyjny: wyodrębnia tekst i kluczowe informacje z licencji kierowców i międzynarodowych paszportów.
  • Wizytówka: wyodrębnia tekst i kluczowe informacje z wizytówek.

Dodaj następujący kod do wstępnie utworzonej aplikacji faktury Program.cs metody pliku

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

Uruchamianie aplikacji

Wybierz zielony przycisk Start obok formRecognizer_quickstart, aby skompilować i uruchomić program, lub naciśnij F5.

Zrzut ekranu przedstawiający uruchamianie programu Visual Studio.

Dokumentacja referencyjna — pakiet | kodu | źródłowego biblioteki źródłowej (Maven)Samples |

W tym przewodniku Szybki start użyjesz następujących interfejsów API, aby wyodrębnić dane ustrukturyzowane z formularzy i dokumentów:

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz jedną bezpłatnie.

  • Zestaw Java Development Kit (JDK) w wersji 8 lub nowszej. Aby uzyskać więcej informacji, zobacz obsługiwane wersje języka Java i harmonogram aktualizacji.

  • Usługi azure AI lub zasób analizy dokumentów. Po utworzeniu subskrypcji platformy Azure utwórz zasób analizy dokumentów z jedną usługą lub wieloma usługami w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

  • Po wdrożeniu zasobu wybierz pozycję Przejdź do zasobu. Potrzebujesz klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API analizy dokumentów. Klucz i punkt końcowy wklejasz do kodu w dalszej części przewodnika Szybki start:

    Zrzut ekranu przedstawiający klucze i lokalizację punktu końcowego w witrynie Azure Portal.

Konfiguruj

Tworzenie nowego projektu narzędzia Gradle

W oknie konsoli (takim jak cmd, PowerShell lub Bash) utwórz nowy katalog dla aplikacji o nazwie form-recognizer-app i przejdź do niego.

mkdir form-recognizer-app && form-recognizer-app
  1. gradle init Uruchom polecenie z katalogu roboczego. To polecenie tworzy podstawowe pliki kompilacji dla narzędzia Gradle, w tym build.gradle.kts, które są używane w czasie wykonywania do tworzenia i konfigurowania aplikacji.

    gradle init --type basic
    
  2. Po wyświetleniu monitu wybierz pozycję Język DSL, a następnie Kotlin.

  3. Zaakceptuj domyślną nazwę projektu (form-recognizer-app)

Instalowanie biblioteki klienta

W tym przewodniku Szybki start jest używany menedżer zależności narzędzia Gradle. Bibliotekę klienta i informacje dotyczące innych menedżerów zależności można znaleźć w repozytorium centralnym programu Maven.

W pliku build.gradle.kts projektu dołącz bibliotekę klienta jako instrukcję implementation wraz z wymaganymi wtyczkami i ustawieniami.

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

Tworzenie pliku języka Java

W katalogu roboczym uruchom następujące polecenie:

mkdir -p src/main/java

Utworzysz następującą strukturę katalogów:

Zrzut ekranu przedstawiający strukturę katalogu Java aplikacji.

Przejdź do katalogu Java i utwórz plik o nazwie FormRecognizer.java. Otwórz go w preferowanym edytorze lub środowisku IDE i dodaj następującą deklarację i import instrukcje pakietu:

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;

Wybierz przykładowy kod, aby skopiować i wkleić do głównej metody aplikacji:

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz Zabezpieczenia usług Azure AI.

Wypróbuj: model układu

Wyodrębnij tekst, znaczniki zaznaczenia, style tekstu i struktury tabel wraz ze współrzędnymi regionów ograniczenia z dokumentów.

  • W tym przykładzie potrzebny będzie plik dokumentu w identyfikatorze URI. W tym przewodniku Szybki start możesz użyć naszego przykładowego dokumentu .
  • Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyjesz beginRecognizeContentFromUrl metody .
  • Dodaliśmy wartość identyfikatora URI pliku do zmiennej formUrl w metodzie main.

Zaktualizuj klasę FormRecognizer aplikacji przy użyciu następującego kodu (należy mieć pewność, że zaktualizuj zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal):


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

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

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

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

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

Wypróbuj: wstępnie utworzony model

W tym przykładzie pokazano, jak analizować dane z niektórych typów typowych dokumentów przy użyciu wstępnie wytrenowanych modeli przy użyciu faktury jako przykładu.

  • W tym przykładzie analizujemy dokument faktury przy użyciu wstępnie utworzonego modelu. Na potrzeby tego przewodnika Szybki start możesz użyć naszego przykładowego dokumentu faktury.
  • Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyjesz elementu beginRecognizeInvoicesFromUrl .
  • Dodaliśmy wartość identyfikatora URI pliku do zmiennej invoiceUrl w metodzie main.
  • Dla uproszczenia wszystkie pola zwracane przez usługę nie są tutaj wyświetlane. Aby wyświetlić listę wszystkich obsługiwanych pól i odpowiednich typów, zobacz naszą stronę koncepcji faktury .

Wybieranie wstępnie utworzonego modelu

Nie masz ograniczeń do faktur — istnieje kilka wstępnie utworzonych modeli do wyboru, z których każdy ma własny zestaw obsługiwanych pól. Model do użycia dla analyze operacji zależy od typu dokumentu do przeanalizowania. Poniżej przedstawiono wstępnie utworzone modele obecnie obsługiwane przez usługę Analizy dokumentów:

  • Faktura: wyodrębnia tekst, znaczniki wyboru, tabele, pola i kluczowe informacje z faktur.
  • Potwierdzenie: wyodrębnia tekst i kluczowe informacje z paragonów.
  • Dokument identyfikacyjny: wyodrębnia tekst i kluczowe informacje z licencji kierowców i międzynarodowych paszportów.
  • Wizytówka: wyodrębnia tekst i kluczowe informacje z wizytówek.

Zaktualizuj klasę FormRecognizer aplikacji przy użyciu następującego kodu (należy mieć pewność, że zaktualizuj zmienne klucza i punktu końcowego przy użyciu wartości z wystąpienia analizy dokumentów w witrynie Azure Portal):


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

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

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

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

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

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

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

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

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

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

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

Kompilowanie i uruchamianie aplikacji

Wróć do głównego katalogu projektu — aplikacja rozpoznawania formularzy.

  1. Skompiluj aplikację za build pomocą polecenia :
gradle build
  1. Uruchom aplikację za run pomocą polecenia :
gradle run

Dokumentacja referencyjna — przykłady | pakietu kodu | źródłowego biblioteki źródłowej (npm)Samples |

W tym przewodniku Szybki start użyjesz następujących interfejsów API, aby wyodrębnić dane ustrukturyzowane z formularzy i dokumentów:

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz jedną bezpłatnie.

  • Najnowsza wersja programu Visual Studio Code lub preferowanego środowiska IDE.

  • Najnowsza LTS wersja Node.js

  • Usługi azure AI lub zasób analizy dokumentów. Po utworzeniu subskrypcji platformy Azure utwórz zasób analizy dokumentów z jedną usługą lub wieloma usługami w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

    Napiwek

    Utwórz zasób usług Azure AI, jeśli planujesz uzyskać dostęp do wielu usług azure AI w ramach jednego punktu końcowego/klucza. W przypadku dostępu tylko do analizy dokumentów utwórz zasób analizy dokumentów. Należy pamiętać, że jeśli zamierzasz używać uwierzytelniania firmy Microsoft Entra, potrzebujesz zasobu z jedną usługą.

  • Po wdrożeniu zasobu wybierz pozycję Przejdź do zasobu. Potrzebujesz klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API analizy dokumentów. Klucz i punkt końcowy wklejasz do kodu w dalszej części przewodnika Szybki start:

    Zrzut ekranu przedstawiający klucze i lokalizację punktu końcowego w witrynie Azure Portal.

Konfiguruj

  1. Tworzenie nowej aplikacji Node.js. W oknie konsoli (na przykład cmd, PowerShell lub Bash) utwórz nowy katalog dla aplikacji i przejdź do niego.

    mkdir form-recognizer-app && cd form-recognizer-app
    
  2. Uruchom polecenie npm init, aby utworzyć aplikację Node przy użyciu pliku package.json.

    npm init
    
  3. ai-form-recognizer Zainstaluj pakiet npm biblioteki klienta:

    npm install @azure/ai-form-recognizer
    

    Plik aplikacji package.json jest aktualizowany przy użyciu zależności.

  4. Utwórz plik o nazwie index.js, otwórz go i zaimportuj następujące biblioteki:

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. Utwórz zmienne dla punktu końcowego i klucza platformy Azure zasobu:

    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    
  6. Na tym etapie aplikacja JavaScript powinna zawierać następujące wiersze kodu:

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

Wybierz przykładowy kod, aby skopiować i wkleić do aplikacji:

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz Zabezpieczenia usług Azure AI.

Wypróbuj: model układu

  • W tym przykładzie potrzebny będzie plik dokumentu w identyfikatorze URI. W tym przewodniku Szybki start możesz użyć naszego przykładowego dokumentu .
  • Dodaliśmy wartość identyfikatora URI pliku do formUrl zmiennej w górnej części pliku.
  • Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyjesz beginRecognizeContent metody .

Dodaj następujący kod do aplikacji układu w wierszu poniżej zmiennej key

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

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

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

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

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

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

Wypróbuj: wstępnie utworzony model

W tym przykładzie pokazano, jak analizować dane z niektórych typów typowych dokumentów przy użyciu wstępnie wytrenowanych modeli przy użyciu faktury jako przykładu. Zobacz naszą wstępnie utworzoną stronę koncepcji, aby uzyskać pełną listę pól faktury

  • W tym przykładzie analizujemy dokument faktury przy użyciu wstępnie utworzonego modelu. Na potrzeby tego przewodnika Szybki start możesz użyć naszego przykładowego dokumentu faktury.
  • Dodaliśmy wartość identyfikatora URI pliku do invoiceUrl zmiennej w górnej części pliku.
  • Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyjesz beginRecognizeInvoices metody .
  • Dla uproszczenia wszystkie pola zwracane przez usługę nie są tutaj wyświetlane. Aby wyświetlić listę wszystkich obsługiwanych pól i odpowiednich typów, zobacz naszą stronę koncepcji faktury .

Wybieranie wstępnie utworzonego modelu

Nie masz ograniczeń do faktur — istnieje kilka wstępnie utworzonych modeli do wyboru, z których każdy ma własny zestaw obsługiwanych pól. Model do użycia dla analyze operacji zależy od typu dokumentu do przeanalizowania. Poniżej przedstawiono wstępnie utworzone modele obecnie obsługiwane przez usługę Analizy dokumentów:

  • Faktura: wyodrębnia tekst, znaczniki wyboru, tabele, pola i kluczowe informacje z faktur.
  • Potwierdzenie: wyodrębnia tekst i kluczowe informacje z paragonów.
  • Dokument identyfikacyjny: wyodrębnia tekst i kluczowe informacje z licencji kierowców i międzynarodowych paszportów.
  • Wizytówka: wyodrębnia tekst i kluczowe informacje z wizytówek.

Dodaj następujący kod do wstępnie utworzonej aplikacji faktury poniżej zmiennej key


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

async function recognizeInvoices() {

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

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

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

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

    console.log("Invoice fields:");

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

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

    console.log("- Items:");

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

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

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

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

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

Dokumentacja referencyjna — przykłady | pakietu kodu | źródłowego biblioteki źródłowej (PyPi)Samples |

W tym przewodniku Szybki start użyjesz następujących interfejsów API, aby wyodrębnić dane ustrukturyzowane z formularzy i dokumentów:

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie

  • Python 3.x

    • Instalacja języka Python powinna zawierać narzędzie. Możesz sprawdzić, czy masz zainstalowane narzędzie, uruchamiając polecenie pip --version w wierszu polecenia. Pobierz narzędzie, instalując najnowszą wersję języka Python.
  • Usługi azure AI lub zasób analizy dokumentów. Po utworzeniu subskrypcji platformy Azure utwórz zasób analizy dokumentów z jedną usługą lub wieloma usługami w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

    Napiwek

    Utwórz zasób usług Azure AI, jeśli planujesz uzyskać dostęp do wielu usług azure AI w ramach jednego punktu końcowego/klucza. W przypadku dostępu tylko do analizy dokumentów utwórz zasób analizy dokumentów. Należy pamiętać, że jeśli zamierzasz używać uwierzytelniania firmy Microsoft Entra, potrzebujesz zasobu z jedną usługą.

  • Po wdrożeniu zasobu wybierz pozycję Przejdź do zasobu. Potrzebujesz klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API analizy dokumentów. Klucz i punkt końcowy wklejasz do kodu w dalszej części przewodnika Szybki start:

    Zrzut ekranu przedstawiający klucze i lokalizację punktu końcowego w witrynie Azure Portal.

Konfiguruj

Otwórz okno terminalu w środowisku lokalnym i zainstaluj bibliotekę klienta azure AI Document Intelligence dla języka Python za pomocą narzędzia:

pip install azure-ai-formrecognizer

Tworzenie nowej aplikacji w języku Python

Utwórz nową aplikację w języku Python o nazwie form_recognizer_quickstart.py w preferowanym edytorze lub środowisku IDE. Następnie zaimportuj następujące biblioteki:

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

Tworzenie zmiennych dla punktu końcowego i klucza zasobu platformy Azure

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

Na tym etapie aplikacja w języku Python powinna zawierać następujące wiersze kodu:

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"

Wybierz przykładowy kod, aby skopiować i wkleić do aplikacji:

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz Zabezpieczenia usług Azure AI.

Wypróbuj: model układu

  • W tym przykładzie potrzebny będzie plik dokumentu w identyfikatorze URI. W tym przewodniku Szybki start możesz użyć naszego przykładowego dokumentu .
  • Dodaliśmy wartość identyfikatora URI pliku do formUrl zmiennej w górnej części pliku.
  • Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyjesz begin_recognize_content_from_url metody .

Dodaj następujący kod do aplikacji układu w wierszu poniżej zmiennej key


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

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

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

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

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

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

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


if __name__ == "__main__":
    recognize_content()

Wypróbuj: wstępnie utworzony model

W tym przykładzie pokazano, jak analizować dane z niektórych typów typowych dokumentów przy użyciu wstępnie wytrenowanych modeli przy użyciu faktury jako przykładu. Zobacz naszą wstępnie utworzoną stronę koncepcji, aby uzyskać pełną listę pól faktury

  • W tym przykładzie analizujemy dokument faktury przy użyciu wstępnie utworzonego modelu. Na potrzeby tego przewodnika Szybki start możesz użyć naszego przykładowego dokumentu faktury.
  • Dodaliśmy wartość identyfikatora URI pliku do zmiennej "formUrl" w górnej części pliku.
  • Aby przeanalizować dany plik przy użyciu identyfikatora URI, użyjesz metody ""begin_recognize_invoices_from_url".
  • Dla uproszczenia wszystkie pola zwracane przez usługę nie są tutaj wyświetlane. Aby wyświetlić listę wszystkich obsługiwanych pól i odpowiednich typów, zobacz naszą stronę koncepcji faktury .

Wybieranie wstępnie utworzonego modelu

Nie masz ograniczeń do faktur — istnieje kilka wstępnie utworzonych modeli do wyboru, z których każdy ma własny zestaw obsługiwanych pól. Model do użycia dla analyze operacji zależy od typu dokumentu do przeanalizowania. Poniżej przedstawiono wstępnie utworzone modele obecnie obsługiwane przez usługę Analizy dokumentów:

  • Faktura: wyodrębnia tekst, znaczniki wyboru, tabele, pola i kluczowe informacje z faktur.
  • Potwierdzenie: wyodrębnia tekst i kluczowe informacje z paragonów.
  • Dokument identyfikacyjny: wyodrębnia tekst i kluczowe informacje z licencji kierowców i międzynarodowych paszportów.
  • Wizytówka: wyodrębnia tekst i kluczowe informacje z wizytówek.

Dodaj następujący kod do wstępnie utworzonej aplikacji faktury poniżej zmiennej key


def recognize_invoice():

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

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

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

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


if __name__ == "__main__":
    recognize_invoice()

Uruchamianie aplikacji

  1. Przejdź do folderu, w którym masz plik form_recognizer_quickstart.py .

  2. Wpisz następujące polecenie w terminalu:

python form_recognizer_quickstart.py

| Dokumentacja interfejsu API REST interfejsu API | REST analizy dokumentów |

W tym przewodniku Szybki start użyjesz następujących interfejsów API, aby wyodrębnić dane ustrukturyzowane z formularzy i dokumentów:

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie

  • Zainstalowano bibliotekę cURL .

  • PowerShell w wersji 6.0 lub podobnej aplikacji wiersza polecenia.

  • Usługi azure AI lub zasób analizy dokumentów. Po utworzeniu subskrypcji platformy Azure utwórz zasób analizy dokumentów z jedną usługą lub wieloma usługami w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

    Napiwek

    Utwórz zasób usług Azure AI, jeśli planujesz uzyskać dostęp do wielu usług azure AI w ramach jednego punktu końcowego/klucza. W przypadku dostępu tylko do analizy dokumentów utwórz zasób analizy dokumentów. Należy pamiętać, że jeśli zamierzasz używać uwierzytelniania firmy Microsoft Entra, potrzebujesz zasobu z jedną usługą.

  • Po wdrożeniu zasobu wybierz pozycję Przejdź do zasobu. Potrzebujesz klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API analizy dokumentów. Klucz i punkt końcowy wklejasz do kodu w dalszej części przewodnika Szybki start:

    Zrzut ekranu przedstawiający klucze i lokalizację punktu końcowego w witrynie Azure Portal.

Wybierz przykładowy kod, aby skopiować i wkleić do aplikacji:

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz Zabezpieczenia usług Azure AI.

Wypróbuj: model układu

  • W tym przykładzie potrzebny będzie plik dokumentu w identyfikatorze URI. W tym przewodniku Szybki start możesz użyć naszego przykładowego dokumentu .
  1. Zastąp {endpoint} element punktem końcowym uzyskanym przy użyciu subskrypcji analizy dokumentów.
  2. Zastąp {key} ciąg kluczem skopiowany z poprzedniego kroku.
  3. Zastąp \"{your-document-url} ciąg adresem URL przykładowego dokumentu:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf

Żądanie

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}'}​​​​​​​​"

Lokalizacja operacji

Otrzymasz odpowiedź zawierającą 202 (Success) nagłówek Operation-Location . Wartość tego nagłówka zawiera identyfikator wyniku, którego można użyć do wykonywania zapytań o stan operacji asynchronicznej i uzyskiwania wyników:

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

W poniższym przykładzie jako część adresu URL ciąg po analyzeResults/ jest identyfikatorem wyniku.

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

Pobieranie wyników układu

Po wywołaniu interfejsu Analyze Layout API wywołasz interfejs API uzyskiwania wyników układu analizy, aby uzyskać stan operacji i wyodrębnione dane. Przed uruchomieniem polecenia wprowadź następujące zmiany:

  1. Zastąp {endpoint} element punktem końcowym uzyskanym przy użyciu subskrypcji analizy dokumentów.
  2. Zastąp {key} ciąg kluczem skopiowany z poprzedniego kroku.
  3. Zastąp {resultId} element identyfikatorem wyniku z poprzedniego kroku.

Żądanie

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

Sprawdzanie wyników

Otrzymasz odpowiedź z zawartością 200 (success) JSON.

Zobacz poniższy obraz faktury i odpowiadające mu dane wyjściowe JSON.

  • Węzeł "readResults" zawiera każdy wiersz tekstu z odpowiednim umieszczeniem pola ograniczenia na stronie.
  • Węzeł selectionMarks pokazuje każdy znacznik zaznaczenia (pole wyboru, znacznik radiowy) i określa, czy jego stan to selected , czy unselected.
  • Sekcja "pageResults" zawiera wyodrębnione tabele. Dla każdej tabeli wyodrębniono tekst, wiersz i indeks kolumn, zakres wierszy i kolumn, pole ograniczenia i nie tylko.

Dokument instrukcji projektu firmy Contoso z tabelą.

Treść odpowiedzi

Pełne przykładowe dane wyjściowe można wyświetlić w witrynie GitHub.

Wypróbuj: wstępnie utworzony model

  • W tym przykładzie analizujemy dokument faktury przy użyciu wstępnie utworzonego modelu. Na potrzeby tego przewodnika Szybki start możesz użyć naszego przykładowego dokumentu faktury.

Wybieranie wstępnie utworzonego modelu

Nie masz ograniczeń do faktur — istnieje kilka wstępnie utworzonych modeli do wyboru, z których każdy ma własny zestaw obsługiwanych pól. Model do użycia dla analyze operacji zależy od typu dokumentu do przeanalizowania. Poniżej przedstawiono wstępnie utworzone modele obecnie obsługiwane przez usługę Analizy dokumentów:

  • Faktura: wyodrębnia tekst, znaczniki wyboru, tabele, pola i kluczowe informacje z faktur.
  • Potwierdzenie: wyodrębnia tekst i kluczowe informacje z paragonów.
  • Dokument identyfikacyjny: wyodrębnia tekst i kluczowe informacje z licencji kierowców i międzynarodowych paszportów.
  • Wizytówka: wyodrębnia tekst i kluczowe informacje z wizytówek.

Przed uruchomieniem polecenia wprowadź następujące zmiany:

  1. Zastąp {endpoint} element punktem końcowym uzyskanym przy użyciu subskrypcji analizy dokumentów.

  2. Zastąp {key} ciąg kluczem skopiowany z poprzedniego kroku.

  3. Zastąp \"{your-document-url} ciąg adresem URL przykładowej faktury:

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

Żądanie

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}'}​​​​​​​​"

Lokalizacja operacji

Otrzymasz odpowiedź zawierającą 202 (Success) nagłówek Operation-Location . Wartość tego nagłówka zawiera identyfikator wyniku, którego można użyć do wykonywania zapytań o stan operacji asynchronicznej i uzyskiwania wyników:

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

W poniższym przykładzie jako część adresu URL ciąg po analyzeResults/ jest identyfikatorem wyniku:

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

Pobieranie wyników faktury

Po wywołaniu interfejsu Analyze Invoice API wywołasz interfejs API Pobierz wynik faktury, aby uzyskać stan operacji i wyodrębnione dane. Przed uruchomieniem polecenia wprowadź następujące zmiany:

  1. Zastąp {endpoint} element punktem końcowym uzyskanym za pomocą klucza analizy dokumentów. Można go znaleźć na karcie Przegląd zasobu analizy dokumentów.
  2. Zastąp {resultId} element identyfikatorem wyniku z poprzedniego kroku.
  3. Zastąp element {key} swoim kluczem.

Żądanie

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

Sprawdzanie odpowiedzi

200 (Success) Otrzymasz odpowiedź z danymi wyjściowymi JSON.

  • Pole "readResults" zawiera każdy wiersz tekstu wyodrębniony z faktury.
  • Element "pageResults" zawiera tabele i znaczniki wyboru wyodrębnione z faktury.
  • Pole "documentResults" zawiera informacje o kluczu/wartości dla najbardziej odpowiednich części faktury.

Zobacz przykładowy dokument faktury .

Treść odpowiedzi

Zobacz pełne przykładowe dane wyjściowe w witrynie GitHub.

To wszystko, dobrze zrobione!

Następne kroki

  • Aby uzyskać ulepszone środowisko i zaawansowaną jakość modelu, wypróbuj narzędzie Document Intelligence Studio.

    • Program Studio obsługuje dowolny model przeszkolony z danymi oznaczonymi etykietami w wersji 2.1.

    • Dzienniki zmian zawierają szczegółowe informacje na temat migracji z wersji 3.1 do wersji 4.0.