Začínáme s funkcí Document Intelligence

Důležité

  • Služba Azure Cognitive Services Rozpoznávání formulářů je teď azure AI Document Intelligence.
  • Některé platformy stále čekají na aktualizaci přejmenování.
  • Všechny zmínky o Rozpoznávání formulářů nebo funkci Document Intelligence v naší dokumentaci odkazují na stejnou službu Azure.

Tento obsah se vztahuje na:Zaškrtnutív4.0 (Preview)Dřívější verze:modrá značka zaškrtnutív3.1 (GA)modrá značka zaškrtnutív3.0 (GA)

  • Začínáme s nejnovější verzí Preview služby Azure Document Intelligence (2024-02-29-preview)

Tento obsah se vztahuje na:Zaškrtnutív3.1 (GA)Starší verze:modrá značka zaškrtnutív3.0modrá značka zaškrtnutív2.1

  • Začínáme s Azure Rozpoznávání formulářů nejnovější verzí GA (2023-07-31).

Tento obsah se vztahuje na:Zaškrtnutív3.0 (GA)Novější verze:modrá značka zaškrtnutív3.1modrá značka zaškrtnutív2.1

  • Začínáme s azure Rozpoznávání formulářů starší verzí GA (2022-08-31).
  • Azure AI Document Intelligence / Rozpoznávání formulářů je cloudová služba Azure AI, která využívá strojové učení k extrakci párů klíč-hodnota, textu, tabulek a klíčových dat z dokumentů.

  • Modely zpracování dokumentů můžete snadno integrovat do pracovních postupů a aplikací pomocí sady SDK programovacího jazyka nebo voláním rozhraní REST API.

  • Pro účely tohoto rychlého startu doporučujeme používat bezplatnou službu při učení technologie. Mějte na paměti, že počet bezplatných stránek je omezený na 500 za měsíc.

Další informace o funkcích rozhraní API a možnostech vývoje najdete na naší stránce Přehled .

Referenční referenční | informace k sadě SDK klientské knihovny | – Ukázky referenčních|balíčků| REST API | – Podporovaná verze rozhraní REST API

Referenční referenční | informace k sadě SDK klientské knihovny | – Ukázky referenčních |balíčků | REST API | – Podporovaná verze rozhraní REST API

V tomto rychlém startu můžete pomocí následujících funkcí analyzovat a extrahovat data a hodnoty z formulářů a dokumentů:

  • Model rozložení – Analýza a extrahování tabulek, čar, slov a výběrových značek, jako jsou přepínače a zaškrtávací políčka v dokumentech, aniž byste museli model trénovat.

  • Předem připravený model – Analýza a extrahování běžných polí z konkrétních typů dokumentů pomocí předem připraveného modelu

Požadavky

  • Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek s jednou službou nebo více službami Azure AI, abyste získali klíč a koncový bod.

  • K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

Tip

Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.

  • Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:

    Snímek obrazovky s klíči a umístěním koncového bodu na webu Azure Portal

  • Služby Azure AI nebo prostředek Rozpoznávání formulářů Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek s jednou službou nebo více službami Azure AI, abyste získali klíč a koncový bod.

  • K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

Tip

Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro Rozpoznávání formulářů přístup vytvořte prostředek Rozpoznávání formulářů. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.

  • Po nasazení prostředku vyberte Přejít k prostředku. K připojení aplikace k rozhraní API Rozpoznávání formulářů potřebujete klíč a koncový bod z prostředku, který vytvoříte. Klíč a koncový bod vložíte do kódu později v rychlém startu:

    Snímek obrazovky s klíči a umístěním koncového bodu na webu Azure Portal

Nastavení

  1. Spusťte Visual Studio.

  2. Na úvodní stránce zvolte Vytvořit nový projekt.

    Snímek obrazovky s úvodním oknem sady Visual Studio

  3. Na stránce Vytvořit nový projekt zadejte konzolu do vyhledávacího pole. Zvolte šablonu konzolové aplikace a pak zvolte Další.

    Snímek obrazovky se stránkou pro vytvoření nového projektu sady Visual Studio

  1. V dialogovém okně Konfigurovat nový projekt zadejte doc_intel_quickstart do pole Název projektu. Pak zvolte Další.
  1. V dialogovém okně Konfigurovat nový projekt zadejte form_recognizer_quickstart do pole Název projektu. Pak zvolte Další.
  1. V dialogovém okně Další informace vyberte .NET 6.0 (dlouhodobá podpora) a pak vyberte Vytvořit.

    Snímek obrazovky s dialogovým oknem s dalšími informacemi sady Visual Studio

Instalace klientské knihovny pomocí NuGetu

  1. Klikněte pravým tlačítkem na projekt doc_intel_quickstart a vyberte Spravovat balíčky NuGet... .

    Snímek obrazovky s oknem vybraného předběžného balíčku NuGet v sadě Visual Studio

  2. Vyberte kartu Procházet a zadejte Azure.AI.DocumentIntelligence. Include prerelease Zvolte zaškrtávací políčko a v rozevírací nabídce vyberte verzi 1.0.0-beta.1.

    Snímek obrazovky s výběrem předběžné verze balíčku NuGet document Intelligence v sadě Visual Studio

  1. Klikněte pravým tlačítkem na projekt form_recognizer_quickstart a vyberte Spravovat balíčky NuGet... .

    Snímek obrazovky s oknem najít balíček NuGet v sadě Visual Studio

  2. Vyberte kartu Procházet a zadejte Azure.AI.FormRecognizer. V rozevírací nabídce vyberte verzi 4.1.0.

    Snímek obrazovky s výběrem balíčku NuGet Rozpoznávání formulářů v sadě Visual Studio

  1. Klikněte pravým tlačítkem na projekt form_recognizer_quickstart a vyberte Spravovat balíčky NuGet... .

    Snímek obrazovky s oknem balíčku NuGet v sadě Visual Studio

  2. Vyberte kartu Procházet a zadejte Azure.AI.FormRecognizer. V rozevírací nabídce vyberte verzi 4.0.0.

    Snímek obrazovky s výběrem starší verze balíčku NuGet v sadě Visual Studio

Sestavení aplikace

Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentIntelligenceClient třídy. Uděláte to tak, že vytvoříte na key webu Azure Portal DocumentIntelligenceClient a AzureKeyCredential instanci s AzureKeyCredential funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint.

Pokud chcete pracovat se službou Rozpoznávání formulářů, musíte vytvořit instanci DocumentAnalysisClient třídy. Uděláte to tak, že vytvoříte na webu Azure Portal DocumentAnalysisClient a AzureKeyCredentialkey instanci s AzureKeyCredential Rozpoznávání formulářů endpoint.

Poznámka:

  • Od .NET 6 vygenerují nové projekty používající console šablonu nový styl programu, který se liší od předchozích verzí.
  • Nový výstup používá nedávné funkce jazyka C#, které zjednodušují psaní kódu.
  • Pokud používáte novější verzi, stačí napsat pouze tělo Main metody. Nemusíte zahrnovat příkazy nejvyšší úrovně, globální direktivy using ani implicitní direktivy using.
  • Další informace najdete v tématuNové šablony jazyka C#, které generují příkazy nejvyšší úrovně.
  1. Otevřete soubor Program.cs.

  2. Odstraňte existující kód, včetně řádku Console.Writeline("Hello World!"), a vyberte jednu z následujících ukázek kódu, které chcete zkopírovat a vložit do souboru Program.cs vaší aplikace:

Důležité

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.

Model rozložení

Extrahujte text, značky výběru, styly textu, struktury tabulky a souřadnice ohraničující oblasti z dokumentů.

  • V tomto příkladu budete potřebovat soubor dokumentu z identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
  • Do proměnné v horní části skriptu jsme přidali hodnotu Uri fileUri identifikátoru URI souboru.
  • Pokud chcete extrahovat rozložení z daného souboru na identifikátor URI, použijte metodu StartAnalyzeDocumentFromUri a předejte prebuilt-layout ji jako ID modelu. Vrácená AnalyzeResult hodnota je objekt obsahující data z odeslaného dokumentu.

Do souboru Program.cs přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu 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");

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(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)," +
        $" 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}");
    }
}

Spuštění aplikace

Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.

Snímek obrazovky s tlačítkem spustit program v sadě Visual Studio

Do souboru Program.cs přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:

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

Spuštění aplikace

Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.

Snímek obrazovky se spuštěním umístění tlačítka programu sady Visual Studio

Výstup modelu rozložení

Tady je fragment očekávaného výstupu:

  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

Pokud chcete zobrazit celý výstup, přejděte do úložiště ukázek Azure na GitHubu a zobrazte výstup modelu rozložení.

Do souboru Program.cs přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:

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

Spuštění aplikace

Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.

Snímek obrazovky se spuštěním programu sady Visual Studio

Předem připravený model

Analyzujte a extrahujte běžná pole z konkrétních typů dokumentů pomocí předem vytvořeného modelu. V tomto příkladu analyzujeme fakturu pomocí předem připraveného modelu faktury .

Tip

Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze operaci, závisí na typu dokumentu, který se má analyzovat. Viz extrakce dat modelu.

  • Analýza faktury pomocí předem vytvořeného modelu faktury Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
  • Do proměnné v horní části souboru Program.cs jsme přidali hodnotu Uri invoiceUri identifikátoru URI souboru.
  • Pokud chcete analyzovat daný soubor pomocí identifikátoru URI, použijte metodu StartAnalyzeDocumentFromUri a předejte prebuilt-invoice ji jako ID modelu. Vrácená AnalyzeResult hodnota je objekt obsahující data z odeslaného dokumentu.
  • Pro zjednodušení se zde nezobrazují všechny páry klíč-hodnota, které služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .

Do souboru Program.cs přidejte následující ukázku kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu 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");

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

Spuštění aplikace

Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.

Snímek obrazovky s tlačítkem spustit program v sadě Visual Studio

Do souboru Program.cs přidejte následující ukázku kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:


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

Spuštění aplikace

Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.

Snímek obrazovky se spuštěním umístění tlačítka programu sady Visual Studio

Předem připravený výstup modelu

Tady je fragment očekávaného výstupu:

  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

Pokud chcete zobrazit celý výstup, navštivte úložiště ukázek Azure na GitHubu a podívejte se na předem připravený výstup modelu faktury.

Do souboru Program.cs přidejte následující ukázku kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:


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

Spuštění aplikace

Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.

Snímek obrazovky se spuštěním programu sady Visual Studio

V tomto rychlém startu můžete pomocí následujících funkcí analyzovat a extrahovat data a hodnoty z formulářů a dokumentů:

  • Rozložení – Analýza a extrahování tabulek, řádků, slov a výběrových značek, jako jsou přepínače a zaškrtávací políčka v dokumentech, bez nutnosti trénovat model.

  • Předem připravená faktura – Analýza a extrakce běžných polí z konkrétních typů dokumentů pomocí předem natrénovaného modelu

Požadavky

  • Předplatné Azure – Vytvořte si ho zdarma.

  • Nejnovější verze editoru Visual Studio Code nebo preferované integrované vývojové prostředí (IDE) VizJava v editoru Visual Studio Code.

    Tip

    • Visual Studio Code nabízí balíček kódování pro Javu pro Windows a macOS.Balíček kódování je sada VS Code, sady Java Development Kit (JDK) a kolekce navrhovaných rozšíření od Microsoftu. Kódovací balíček lze také použít k opravě existujícího vývojového prostředí.
    • Pokud používáte VS Code a kódovací balíček pro Javu, nainstalujte rozšíření Gradle for Java .
  • Pokud visual Studio Code nepoužíváte, ujistěte se, že máte ve vývojovém prostředí nainstalované následující:

  • Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

    Tip

    Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.

  • Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Později do kódu vložíte klíč a koncový bod:

    Snímek obrazovky s klíči a umístěním koncového bodu na webu Azure Portal

Nastavení

Vytvoření nového projektu Gradle

  1. V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte nový adresář pro vaši aplikaci s názvem doc-intel-app a přejděte na ni.

    mkdir doc-intel-app && doc-intel-app
    
    mkdir doc-intel-app; cd doc-intel-app
    
  2. gradle init Spusťte příkaz z pracovního adresáře. Tento příkaz vytvoří základní soubory sestavení pro Gradle, včetně build.gradle.kts, které se používají za běhu k vytvoření a konfiguraci aplikace.

    gradle init --type basic
    
  3. Po zobrazení výzvy k výběru DSL vyberte Kotlin.

  4. Výběrem klávesy Return nebo Enter přijměte výchozí název projektu (doc-intel-app).

  1. V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte pro aplikaci nový adresář s názvem form-recognize-app a přejděte na ni.

    mkdir form-recognize-app && form-recognize-app
    
    mkdir form-recognize-app; cd form-recognize-app
    
  2. gradle init Spusťte příkaz z pracovního adresáře. Tento příkaz vytvoří základní soubory sestavení pro Gradle, včetně build.gradle.kts, které se používají za běhu k vytvoření a konfiguraci aplikace.

    gradle init --type basic
    
  3. Po zobrazení výzvy k výběru DSL vyberte Kotlin.

  4. Výběrem možnosti Return nebo Enter přijměte výchozí název projektu (form-recognize-app).

Instalace klientské knihovny

V tomto rychlém startu se používá správce závislostí Gradle. Klientskou knihovnu a informace pro další správce závislostí najdete v centrálním úložišti Maven.

Otevřete soubor build.gradle.kts projektu v integrovaném vývojovém prostředí (IDE). Spoluplatte a vložte následující kód, který zahrne klientskou knihovnu implementation jako příkaz spolu s požadovanými moduly plug-in a nastavením.

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

   }

V tomto rychlém startu se používá správce závislostí Gradle. Klientskou knihovnu a informace pro další správce závislostí najdete v centrálním úložišti Maven.

Otevřete soubor build.gradle.kts projektu v integrovaném vývojovém prostředí (IDE). Spoluplatte a vložte následující kód, který zahrne klientskou knihovnu implementation jako příkaz spolu s požadovanými moduly plug-in a nastavením.

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

   }

V tomto rychlém startu se používá správce závislostí Gradle. Klientskou knihovnu a informace pro další správce závislostí najdete v centrálním úložišti Maven.

Otevřete soubor build.gradle.kts projektu v integrovaném vývojovém prostředí (IDE). Spoluplatte a vložte následující kód, který zahrne klientskou knihovnu implementation jako příkaz spolu s požadovanými moduly plug-in a nastavením.

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


   }

Vytvoření aplikace Java

Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentIntelligenceClient třídy. Uděláte to tak, že vytvoříte na key webu Azure Portal DocumentIntelligenceClient a AzureKeyCredential instanci s AzureKeyCredential funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint.

Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentAnalysisClient třídy. Uděláte to tak, že vytvoříte na key webu Azure Portal DocumentAnalysisClient a AzureKeyCredential instanci s AzureKeyCredential funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint.

  1. V adresáři doc-intel-app spusťte následující příkaz:

    mkdir -p src/main/java
    

    Vytvoříte následující adresářovou strukturu:

    Snímek obrazovky s adresářovou strukturou Javy

  1. Přejděte do java adresáře a vytvořte soubor s názvem DocIntelligence.java.

    Tip

    • Nový soubor můžete vytvořit pomocí PowerShellu.
    • Otevřete okno PowerShellu v adresáři projektu tak, že podržíte klávesu Shift a kliknete pravým tlačítkem na složku.
    • Zadejte následující příkaz New-Item DocIntelligence.java.
  2. Otevřete soubor DocIntelligence.java. Zkopírujte a vložte do aplikace jednu z následujících ukázek kódu:

  1. Přejděte do java adresáře a vytvořte soubor s názvem FormRecognizer.java.

    Tip

    • Nový soubor můžete vytvořit pomocí PowerShellu.
    • Otevřete okno PowerShellu v adresáři projektu tak, že podržíte klávesu Shift a kliknete pravým tlačítkem na složku.
    • Zadejte následující příkaz New-Item FormRecognizer.java.
  2. Otevřete soubor FormRecognizer.java. Zkopírujte a vložte do aplikace jednu z následujících ukázek kódu:

Důležité

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.

Model rozložení

Extrahujte text, značky výběru, styly textu, struktury tabulky a souřadnice ohraničující oblasti z dokumentů.

  • V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
  • K analýze daného souboru na identifikátoru URI použijete metodu a předáte prebuilt-layout ho beginAnalyzeDocumentFromUrl jako ID modelu. Vrácená AnalyzeResult hodnota je objekt obsahující data o odeslaném dokumentu.
  • Do proměnné v hlavní metodě jsme přidali hodnotu documentUrl identifikátoru URI souboru.

Do souboru přidejte následující ukázku DocIntelligence.java kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:


import com.azure.ai.documentintelligence;

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 `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
      .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 <AnalyzeResultOperation, AnalyzeResultOperation> analyzeLayoutResultPoller =
      client.beginAnalyzeDocument(modelId, 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()));
  }
}

Sestavení a spuštění aplikace

Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – doc-intel-app.

  1. Sestavte aplikaci pomocí build příkazu:

    gradle build
    
  2. Spusťte aplikaci pomocí run příkazu:

    gradle run
    

Do souboru přidejte následující ukázku FormRecognizer.java kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:


import com.azure.ai.formrecognizer.*;

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

Sestavení a spuštění aplikace

Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – form-recognize-app.

  1. Sestavte aplikaci pomocí build příkazu:

    gradle build
    
  2. Spusťte aplikaci pomocí run příkazu:

    gradle run
    

Výstup modelu rozložení

Tady je fragment očekávaného výstupu:

  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.

Pokud chcete zobrazit celý výstup, přejděte do úložiště ukázek Azure na GitHubu a zobrazte výstup modelu rozložení.

Do souboru přidejte následující ukázku FormRecognizer.java kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:

import com.azure.ai.formrecognizer;

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

Sestavení a spuštění aplikace

Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – form-recognize-app.

  1. Sestavte aplikaci pomocí build příkazu:

    gradle build
    
  2. Spusťte aplikaci pomocí run příkazu:

    gradle run
    

Předem připravený model

Analyzujte a extrahujte běžná pole z konkrétních typů dokumentů pomocí předem vytvořeného modelu. V tomto příkladu analyzujeme fakturu pomocí předem připraveného modelu faktury .

Tip

Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze operaci, závisí na typu dokumentu, který se má analyzovat. Viz extrakce dat modelu.

  • Analýza faktury pomocí předem vytvořeného modelu faktury Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
  • Do proměnné v horní části souboru jsme přidali hodnotu invoiceUrl ADRESY URL souboru.
  • K analýze daného souboru na identifikátoru URI použijete metodu a předáte PrebuiltModels.Invoice ho beginAnalyzeDocuments jako ID modelu. Vrácená result hodnota je objekt obsahující data o odeslaném dokumentu.
  • Pro zjednodušení se zde nezobrazují všechny páry klíč-hodnota, které služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .

Do souboru přidejte následující ukázku DocIntelligence.java kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:

import com.azure.ai.documentintelligence;

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

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

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

    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("https://{endpoint}.cognitiveservices.azure.com/")
        .buildClient();

      SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
        client.beginAnalyzeDocument(modelId, 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());
                  }
                }
              }));
          }
        }
      }
    }
  }
}

Sestavení a spuštění aplikace

Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – doc-intel-app.

  1. Sestavte aplikaci pomocí build příkazu:

    gradle build
    
  2. Spusťte aplikaci pomocí run příkazu:

    gradle run
    

Do souboru přidejte následující ukázku FormRecognizer.java kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:


import com.azure.ai.formrecognizer.*;

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

Sestavení a spuštění aplikace

Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – doc-intel-app.

  1. Sestavte aplikaci pomocí build příkazu:

    gradle build
    
  2. Spusťte aplikaci pomocí run příkazu:

    gradle run
    

Předem připravený výstup modelu

Tady je fragment očekávaného výstupu:

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

Pokud chcete zobrazit celý výstup, navštivte úložiště ukázek Azure na GitHubu a podívejte se na předem připravený výstup modelu faktury.

Do souboru přidejte následující ukázku FormRecognizer.java kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:

import com.azure.ai.formrecognizer;

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

Sestavení a spuštění aplikace

Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – doc-intel-app.

  1. Sestavte aplikaci pomocí build příkazu:

    gradle build
    
  2. Spusťte aplikaci pomocí run příkazu:

    gradle run
    

V tomto rychlém startu můžete pomocí následujících funkcí analyzovat a extrahovat data a hodnoty z formulářů a dokumentů:

  • Rozložení – Analýza a extrahování tabulek, řádků, slov a výběrových značek, jako jsou přepínače a zaškrtávací políčka v dokumentech, bez nutnosti trénovat model.

  • Předem připravená faktura – Analýza a extrahování běžných polí z konkrétních typů dokumentů pomocí předem natrénovaného modelu faktury

Požadavky

  • Předplatné Azure – Vytvořte si ho zdarma.

  • Nejnovější verze editoru Visual Studio Code nebo preferované integrované vývojové prostředí (IDE) Další informace najdete v tématuNode.js v editoru Visual Studio Code.

  • Nejnovější LTS verze Node.js.

  • Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

    Tip

    Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.

  • Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:

    Snímek obrazovky s klíči a umístěním koncového bodu na webu Azure Portal

Nastavení

  1. Vytvořte novou aplikaci Node.js Express: V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte a přejděte do nového adresáře aplikace s názvem doc-intel-app.

    mkdir doc-intel-app && cd doc-intel-app
    
  2. Spuštěním npm init příkazu inicializujete aplikaci a vygenerujte projekt.

    npm init
    
  3. Pomocí výzev zobrazených v terminálu zadejte atributy projektu.

    • Nejdůležitějšími atributy jsou název, číslo verze a vstupní bod.
    • Doporučujeme zachovat index.js název vstupního bodu. Popis, testovací příkaz, úložiště GitHub, klíčová slova, autor a informace o licencích jsou volitelné atributy – je možné je přeskočit pro tento projekt.
    • Návrhy v závorkách přijměte tak, že vyberete Return nebo Enter.
    • Po dokončení výzev package.json se v adresáři doc-intel-app vytvoří soubor.
  1. Nainstalujte klientskou knihovnu ai-document-intelligence a azure/identity balíčky npm:

    npm i @azure-rest/ai-document-intelligence@1.0.0-beta.2 @azure/identity
    
    

    Soubor vaší aplikace package.json se aktualizuje o závislosti.

  1. Nainstalujte klientskou knihovnu ai-form-recognizer a azure/identity balíčky npm:

    npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
    
    • Soubor vaší aplikace package.json se aktualizuje o závislosti.
  1. Nainstalujte klientskou knihovnu ai-form-recognizer a azure/identity balíčky npm:

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. Vytvořte soubor s názvem index.js v adresáři aplikace.

    Tip

    • Nový soubor můžete vytvořit pomocí PowerShellu.
    • Otevřete okno PowerShellu v adresáři projektu tak, že podržíte klávesu Shift a kliknete pravým tlačítkem na složku.
    • Zadejte následující příkaz New-Item index.js.

Sestavení aplikace

Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentIntelligenceClient třídy. Uděláte to tak, že vytvoříte na key webu Azure Portal DocumentIntelligenceClient a AzureKeyCredential instanci s AzureKeyCredential funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint.

Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentAnalysisClient třídy. Uděláte to tak, že vytvoříte na webu Azure Portal DocumentAnalysisClient a AzureKeyCredentialkey instanci s AzureKeyCredential Rozpoznávání formulářů endpoint.

  1. Otevřete soubor v editoru Visual Studio Code nebo v oblíbeném integrovaném index.js vývojovém prostředí (IDE). Zkopírujte a vložte do aplikace jednu z následujících ukázek kódu:

Důležité

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.

Model rozložení

Extrahujte text, značky výběru, styly textu, struktury tabulky a souřadnice ohraničující oblasti z dokumentů.

  • V tomto příkladu budete potřebovat soubor dokumentu z adresy URL. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
  • Do proměnné v horní části souboru jsme přidali hodnotu formUrl adresy URL souboru.
  • K analýze daného souboru z adresy URL použijete metodu beginAnalyzeDocuments a předáte prebuilt-layout ji jako ID modelu.
    const { DocumentIntelligenceClient } = 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 = DocumentIntelligenceClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginAnalyzeDocument("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);
});

Spuštění aplikace

Po přidání ukázky kódu do aplikace spusťte program:

  1. Přejděte do složky, ve které máte aplikaci Document Intelligence (doc-intel-app).

  2. Do terminálu zadejte následující příkaz:

    node index.js
    

Do souboru přidejte následující ukázku index.js kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu 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);
});

Spuštění aplikace

Po přidání ukázky kódu do aplikace spusťte program:

  1. Přejděte do složky, ve které máte aplikaci Document Intelligence (doc-intel-app).

  2. Do terminálu zadejte následující příkaz:

    node index.js
    

Výstup modelu rozložení

Tady je fragment očekávaného výstupu:

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

Pokud chcete zobrazit celý výstup, přejděte do úložiště ukázek Azure na GitHubu a zobrazte výstup modelu rozložení.

Předem připravený model

V tomto příkladu analyzujeme fakturu pomocí předem připraveného modelu faktury .

Tip

Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze operaci, závisí na typu dokumentu, který se má analyzovat. Viz extrakce dat modelu.

  • Analýza faktury pomocí předem vytvořeného modelu faktury Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
  • Do proměnné v horní části souboru jsme přidali hodnotu invoiceUrl ADRESY URL souboru.
  • K analýze daného souboru na identifikátoru URI použijete metodu a předáte PrebuiltModels.Invoice ho beginAnalyzeDocuments jako ID modelu. Vrácená result hodnota je objekt obsahující data o odeslaném dokumentu.
  • Pro zjednodušení se zde nezobrazují všechny páry klíč-hodnota, které služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .

const { DocumentIntelligenceClient } = 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
    invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

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

    const poller = await client.beginAnalyzeDocument("prebuilt-invoice", invoiceUrl);
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);
});

Spuštění aplikace

Po přidání ukázky kódu do aplikace spusťte program:

  1. Přejděte do složky, ve které máte aplikaci Document Intelligence (doc-intel-app).

  2. Do terminálu zadejte následující příkaz:

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

Spuštění aplikace

Po přidání ukázky kódu do aplikace spusťte program:

  1. Přejděte do složky, ve které máte aplikaci Document Intelligence (doc-intel-app).

  2. Do terminálu zadejte následující příkaz:

    node index.js
    

Předem připravený výstup modelu

Tady je fragment očekávaného výstupu:

  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

Pokud chcete zobrazit celý výstup, navštivte úložiště ukázek Azure na GitHubu a podívejte se na předem připravený výstup modelu faktury.

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](../../concept-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);
});

Spuštění aplikace

Po přidání ukázky kódu do aplikace spusťte program:

  1. Přejděte do složky, ve které máte aplikaci Document Intelligence (doc-intel-app).

  2. Do terminálu zadejte následující příkaz:

    node index.js
    

V tomto rychlém startu můžete pomocí následujících funkcí analyzovat a extrahovat data z formulářů a dokumentů:

  • Rozložení – Analýza a extrahování tabulek, řádků, slov a výběrových značek, jako jsou přepínače a zaškrtávací políčka a páry klíč-hodnota, bez nutnosti trénovat model.

  • Předem připravená faktura – Analýza a extrakce běžných polí z konkrétních typů dokumentů pomocí předem natrénovaného modelu

Požadavky

  • Předplatné Azure – Vytvořte si ho zdarma.

  • Python 3.7 nebo novější

    • Vaše instalace Pythonu by měla obsahovat pip. Spuštěním na příkazovém pip --version řádku můžete zkontrolovat, jestli máte nainstalovaný pip. Získejte pip instalací nejnovější verze Pythonu.
  • Nejnovější verze editoru Visual Studio Code nebo preferované integrované vývojové prostředí (IDE) Další informace najdete v tématuZačínáme s Pythonem v editoru Visual Studio Code.

  • Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

Tip

Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.

  • Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:

    Snímek obrazovky s klíči a umístěním koncového bodu na webu Azure Portal

Nastavení

Otevřete okno terminálu v místním prostředí a nainstalujte klientskou knihovnu Azure AI Document Intelligence pro Python s pip:

pip install azure-ai-documentintelligence==1.0.0b2

pip install azure-ai-formrecognizer==3.3.0

pip install azure-ai-formrecognizer==3.2.0b6

Vytvoření aplikace v Pythonu

Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentIntelligenceClient třídy. Uděláte to tak, že vytvoříte na key webu Azure Portal DocumentIntelligenceClient a AzureKeyCredential instanci s AzureKeyCredential funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint.

  1. V preferovaném editoru nebo integrovaném vývojovém prostředí (IDE) vytvořte nový soubor Pythonu s názvem doc_intel_quickstart.py .

  2. Otevřete soubor doc_intel_quickstart.py a vyberte jednu z následujících ukázek kódu, které chcete zkopírovat a vložit do aplikace:

Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentAnalysisClient třídy. Uděláte to tak, že vytvoříte na key webu Azure Portal DocumentAnalysisClient a AzureKeyCredential instanci s AzureKeyCredential funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint.

  1. V preferovaném editoru nebo integrovaném vývojovém prostředí (IDE) vytvořte nový soubor Pythonu s názvem form_recognizer_quickstart.py .

  2. Otevřete soubor form_recognizer_quickstart.py a vyberte jednu z následujících ukázek kódu, které chcete zkopírovat a vložit do aplikace:

Důležité

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.

Model rozložení

Extrahujte text, značky výběru, styly textu, struktury tabulky a souřadnice ohraničující oblasti z dokumentů.

  • V tomto příkladu budete potřebovat soubor dokumentu z adresy URL. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
  • Do proměnné ve analyze_layout funkci jsme přidali hodnotu formUrl adresy URL souboru.
  • K analýze daného souboru na adrese URL použijete metodu begin_analyze_document_from_url a předáte prebuilt-layout ji jako ID modelu. Vrácená result hodnota je objekt obsahující data o odeslaném dokumentu.

Do aplikace doc_intel_quickstart.py přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu 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

# 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", formUrl
    )

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

Spuštění aplikace

Po přidání ukázky kódu do aplikace sestavte a spusťte program:

  1. Přejděte do složky, ve které máte soubor doc_intel_quickstart.py .

  2. Do terminálu zadejte následující příkaz:

    python doc_intel_quickstart.py
    

Do form_recognizer_quickstart.py aplikace přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:


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

Spuštění aplikace

Po přidání ukázky kódu do aplikace sestavte a spusťte program:

  1. Přejděte do složky, ve které máte soubor form_recognizer_quickstart.py .

  2. Do terminálu zadejte následující příkaz:

    python form_recognizer_quickstart.py
    

Výstup modelu rozložení

Tady je fragment očekávaného výstupu:

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

Pokud chcete zobrazit celý výstup, přejděte do úložiště ukázek Azure na GitHubu a zobrazte výstup modelu rozložení.

Do form_recognizer_quickstart.py aplikace přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:


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


Spuštění aplikace

Po přidání ukázky kódu do aplikace sestavte a spusťte program:

  1. Přejděte do složky, ve které máte soubor form_recognizer_quickstart.py .

  2. Do terminálu zadejte následující příkaz:

    python form_recognizer_quickstart.py
    

Předem připravený model

Analyzujte a extrahujte běžná pole z konkrétních typů dokumentů pomocí předem vytvořeného modelu. V tomto příkladu analyzujeme fakturu pomocí předem připraveného modelu faktury .

Tip

Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze operaci, závisí na typu dokumentu, který se má analyzovat. Viz extrakce dat modelu.

  • Analýza faktury pomocí předem vytvořeného modelu faktury Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
  • Do proměnné v horní části souboru jsme přidali hodnotu invoiceUrl ADRESY URL souboru.
  • K analýze daného souboru na identifikátoru URI použijete metodu a předáte prebuilt-invoice ho begin_analyze_document_from_url jako ID modelu. Vrácená result hodnota je objekt obsahující data o odeslaném dokumentu.
  • Pro zjednodušení se zde nezobrazují všechny páry klíč-hodnota, které služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .

Do aplikace doc_intel_quickstart.py přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:


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


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


Spuštění aplikace

Po přidání ukázky kódu do aplikace sestavte a spusťte program:

  1. Přejděte do složky, ve které máte soubor doc_intel_quickstart.py .

  2. Do terminálu zadejte následující příkaz:

    python doc_intel_quickstart.py
    

Do form_recognizer_quickstart.py aplikace přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:

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


Spuštění aplikace

Po přidání ukázky kódu do aplikace sestavte a spusťte program:

  1. Přejděte do složky, ve které máte soubor form_recognizer_quickstart.py .

  2. Do terminálu zadejte následující příkaz:

    python form_recognizer_quickstart.py
    

Předem připravený výstup modelu

Tady je fragment očekávaného výstupu:

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

Pokud chcete zobrazit celý výstup, navštivte úložiště ukázek Azure na GitHubu a podívejte se na předem připravený výstup modelu faktury.

Do form_recognizer_quickstart.py aplikace přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:


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


Spuštění aplikace

Po přidání ukázky kódu do aplikace sestavte a spusťte program:

  1. Přejděte do složky, ve které máte soubor form_recognizer_quickstart.py .

  2. Do terminálu zadejte následující příkaz:

    python form_recognizer_quickstart.py
    

V tomto rychlém startu se naučíte používat rozhraní REST API document intelligence k analýze a extrahování dat a hodnot z dokumentů:

Požadavky

  • Předplatné Azure: Můžete si ho vytvořit zdarma.

  • Nainstalovaný nástroj příkazového řádku curl.

  • PowerShell verze 7.*+ (nebo podobná aplikace příkazového řádku):):

  • Pokud chcete zkontrolovat verzi PowerShellu, zadejte následující příkaz vzhledem k vašemu operačnímu systému:

    • Windows: Get-Host | Select-Object Version
    • macOS nebo Linux: $PSVersionTable
  • Prostředek Document Intelligence (jednoúčelová služba) nebo služby Azure AI (více služeb). Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

Tip

Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.

  • Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:

    Snímek obrazovky s klíči a umístěním koncového bodu na webu Azure Portal

Analýza dokumentů a získání výsledků

Požadavek POST slouží k analýze dokumentů s předem připraveným nebo vlastním modelem. Požadavek GET se používá k načtení výsledku volání analýzy dokumentu. Používá modelId se s post a resultId s operacemi GET.

Analýza dokumentu (požadavek POST)

Před spuštěním příkazu cURL proveďte následující změny požadavku post:

  1. Nahraďte {endpoint} hodnotou koncového bodu z instance Document Intelligence na webu Azure Portal.

  2. Nahraďte {key} hodnotou klíče z instance Document Intelligence na webu Azure Portal.

  3. Jako odkaz použijte {modelID} následující tabulku a {your-document-url} nahraďte požadované hodnoty.

  4. Potřebujete soubor dokumentu na adrese URL. Pro účely tohoto rychlého startu můžete pro každou funkci použít ukázkové formuláře uvedené v následující tabulce:

Ukázkové dokumenty

Funkce {modelID} {your-document-url}
Přečíst předem připravená čtení https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Rozložení předem připravené rozložení https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Zdravotní pojištění prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
Daňové přiznání prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Faktura předem připravená faktura https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Příjmu předem připravená potvrzení https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Průkaz totožnosti prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

Ukázkové dokumenty

Funkce {modelID} {your-document-url}
Obecný dokument předem připravený dokument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Přečíst předem připravená čtení https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Rozložení předem připravené rozložení https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Zdravotní pojištění prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
Daňové přiznání prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Faktura předem připravená faktura https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Příjmu předem připravená potvrzení https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Průkaz totožnosti prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png
Vizitka předem připravená vizitka https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg

Důležité

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.

Požadavek POST

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

Odpověď POST (resultID)

Obdržíte 202 (Success) odpověď, která obsahuje hlavičku Operation-Location určenou jen pro čtení. Hodnota této hlavičky obsahuje resultID dotaz, který umožňuje získat stav asynchronní operace a načíst výsledky pomocí požadavku GET se stejným klíčem předplatného prostředku:

{alt-text}

Získání výsledků analýzy (požadavek GET)

Po volání Analyze document rozhraní API zavolejte rozhraní API pro analýzu výsledků , abyste získali stav operace a extrahovaná data. Před spuštěním příkazu proveďte tyto změny:

Po volání Analyze document rozhraní API zavolejte rozhraní API pro analýzu výsledků , abyste získali stav operace a extrahovaná data. Před spuštěním příkazu proveďte tyto změny:

Po volání Analyze document rozhraní API zavolejte rozhraní API pro analýzu výsledků , abyste získali stav operace a extrahovaná data. Před spuštěním příkazu proveďte tyto změny:

  1. Nahraďte {resultID} hlavičku Umístění operace z odpovědi POST.

  2. Nahraďte {key} hodnotou klíče z instance Document Intelligence na webu Azure Portal.

Požadavek GET

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

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

Prozkoumání odpovědi

Obdržíte odpověď s výstupem 200 (Success) JSON. První pole "status"označuje stav operace. Pokud operace není dokončená, hodnota "status" je "running" nebo "notStarted"a měli byste rozhraní API volat znovu, a to buď ručně, nebo prostřednictvím skriptu. Doporučujeme interval jedné sekundy nebo více mezi voláními.

Ukázková odpověď pro předem připravenou fakturu

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

Podporovaná pole dokumentů

Předem připravené modely extrahuje předdefinované sady polí dokumentu. Viz Extrakce dat modelu pro extrahované názvy polí, typy, popisy a příklady.

To je to, blahopřejeme!

V tomto rychlém startu jste použili model document Intelligence k analýze různých formulářů a dokumentů. V dalším kroku prozkoumejte sadu Document Intelligence Studio a referenční dokumentaci, kde najdete podrobné informace o rozhraní Document Intelligence API.

Další kroky

  • Pro vylepšené prostředí a pokročilou kvalitu modelu vyzkoušejte Document Intelligence Studio.

  • Informace o migraci verze 3.1 na verzi 4.0 najdete v průvodcích migrací protokolu změn.

Tento obsah se vztahuje na:Zaškrtnutív2.1 | Nejnovější verze:modrá značka zaškrtnutív4.0 (Preview)

Začínáme s azure AI Document Intelligence s využitím programovacího jazyka podle vašeho výběru nebo rozhraní REST API. Document Intelligence je cloudová služba Azure AI, která pomocí strojového učení extrahuje páry klíč-hodnota, text a tabulky z dokumentů. Při učení technologie doporučujeme používat bezplatnou službu. Mějte na paměti, že počet bezplatných stránek je omezený na 500 za měsíc.

Další informace o funkcích Document Intelligence a možnostech vývoje najdete na naší stránce Přehled .

Referenční dokumentace | – ukázky balíčku zdrojového kódu | knihovny (NuGet) |

V tomto rychlém startu použijete následující rozhraní API k extrakci strukturovaných dat z formulářů a dokumentů:

Požadavky

  • Předplatné Azure – Vytvořte si ho zdarma.

  • Aktuální verze integrovaného vývojového prostředí sady Visual Studio.

  • Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

    Tip

    Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.

  • Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:

    Snímek obrazovky s klíči a umístěním koncového bodu na webu Azure Portal

Nastavení

  1. Spusťte Visual Studio 2019.

  2. Na úvodní stránce zvolte Vytvořit nový projekt.

    Snímek obrazovky s úvodním oknem sady Visual Studio

  3. Na stránce Vytvořit nový projekt zadejte konzolu do vyhledávacího pole. Zvolte šablonu konzolové aplikace a pak zvolte Další.

    Snímek obrazovky se stránkou pro vytvoření nového projektu v sadě Visual Studio

  4. V dialogovém okně Konfigurovat nový projekt zadejte formRecognizer_quickstart do pole Název projektu. Pak zvolte Další.

    Snímek obrazovky s dialogovým oknem pro konfiguraci nového projektu v sadě Visual Studios

  5. V dialogovém okně Další informace vyberte .NET 5.0 (Aktuální) a pak vyberte Vytvořit.

    Snímek obrazovky s dialogovým oknem s dalšími informacemi sady Visual Studio

Instalace klientské knihovny pomocí NuGetu

  1. Klikněte pravým tlačítkem na projekt formRecognizer_quickstart a vyberte Spravovat balíčky NuGet... .

    Snímek obrazovky s oknem vybrat balíček NuGet

  2. Vyberte kartu Procházet a zadejte Azure.AI.FormRecognizer.

    Snímek obrazovky s rozevírací nabídkou pro výběr balíčku Document Intelligence

  3. V rozevírací nabídce vyberte verzi 3.1.1 a vyberte Nainstalovat.

Sestavení aplikace

Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci FormRecognizerClient třídy. Uděláte to tak, že vytvoříte klíč AzureKeyCredential a instanci s AzureKeyCredential funkcí Document Intelligence endpointFormRecognizerClient .

Poznámka:

  • Od .NET 6 vygenerují nové projekty používající console šablonu nový styl programu, který se liší od předchozích verzí.
  • Nový výstup používá nedávné funkce jazyka C#, které zjednodušují psaní kódu.
  • Pokud používáte novější verzi, stačí napsat pouze tělo Main metody. Nemusíte zahrnovat příkazy nejvyšší úrovně, globální direktivy using ani implicitní direktivy using.
  • Další informace najdete v tématuNové šablony jazyka C#, které generují příkazy nejvyšší úrovně.
  1. Otevřete soubor Program.cs.

  2. Zahrňte následující direktivy using:

using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
  1. Nastavte proměnné prostředí endpoint a key vytvořte instanci AzureKeyCredentialFormRecognizerClient :
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. Odstraňte řádek Console.Writeline("Hello World!"); a přidejte jeden z ukázek kódu Try It do Program.cs souboru:

    Snímek obrazovky s přidáním ukázkového kódu do metody Main

  2. Vyberte vzorový kód, který chcete zkopírovat a vložit do metody Main vaší aplikace:

Důležité

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v článku zabezpečení služeb Azure AI.

Vyzkoušejte si to: Model rozložení

Extrahujte text, značky výběru, styly textu a struktury tabulky spolu s souřadnicemi ohraničující oblasti z dokumentů.

  • V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
  • Do proměnné jsme přidali hodnotu identifikátoru formUri URI souboru.
  • Pokud chcete extrahovat rozložení z daného souboru na identifikátor URI, použijte metodu StartRecognizeContentFromUriAsync .

Do souboru Program.cs aplikace rozložení přidejte následující kód:


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

Vyzkoušejte si to: Předem připravený model

Tato ukázka ukazuje, jak analyzovat data z určitých typů běžných dokumentů s předem natrénovanými modely pomocí faktury jako příkladu.

  • V tomto příkladu analyzujeme dokument faktury pomocí předem vytvořeného modelu. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
  • Do proměnné jsme přidali hodnotu invoiceUri identifikátoru URI souboru v horní části metody Main.
  • K analýze daného souboru na identifikátoru URI použijte metodu StartRecognizeInvoicesFromUriAsync .
  • Pro zjednodušení se zde nezobrazují všechna pole, která služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .

Volba předem vytvořeného modelu

Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro operaci analýzy, závisí na typu dokumentu, který se má analyzovat. Tady jsou předem připravené modely, které služba Document Intelligence aktuálně podporuje:

  • Faktura: extrahuje text, značky výběru, tabulky, pole a klíčové informace z faktur.
  • Potvrzení: extrahuje z účtenek text a klíčové informace.
  • Dokument s ID: extrahuje text a klíčové informace z řidičských licencí a mezinárodních pasů.
  • Vizitka: extrahuje text a klíčové informace z vizitek.

Do předem vytvořené aplikace faktury přidejte následující kód Program.cs metody souboru.

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

Spusťte aplikaci

Zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.

Snímek obrazovky se spuštěním programu sady Visual Studio

Referenční dokumentace | – ukázky balíčku zdrojového kódu | knihovny (Maven) |

V tomto rychlém startu použijete následující rozhraní API k extrakci strukturovaných dat z formulářů a dokumentů:

Požadavky

  • Předplatné Azure – Vytvořte si ho zdarma.

  • Sada Java Development Kit (JDK) verze 8 nebo novější. Další informace najdete v podporovanýchverzích Javy a plánu aktualizací.

  • Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

  • Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:

    Snímek obrazovky s klíči a umístěním koncového bodu na webu Azure Portal

Nastavení

Vytvoření nového projektu Gradle

V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte pro aplikaci nový adresář s názvem form-recognizer-app a přejděte na něj.

mkdir form-recognizer-app && form-recognizer-app
  1. gradle init Spusťte příkaz z pracovního adresáře. Tento příkaz vytvoří základní soubory sestavení pro Gradle, včetně build.gradle.kts, které se používají za běhu k vytvoření a konfiguraci aplikace.

    gradle init --type basic
    
  2. Po zobrazení výzvy k výběru DSL vyberte Kotlin.

  3. Přijměte výchozí název projektu (form-recognizer-app).

Instalace klientské knihovny

V tomto rychlém startu se používá správce závislostí Gradle. Klientskou knihovnu a informace pro další správce závislostí najdete v centrálním úložišti Maven.

Do souboru build.gradle.kts projektu zahrňte klientskou knihovnu implementation jako příkaz spolu s požadovanými moduly plug-in a nastavením.

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

Vytvoření souboru Java

Z pracovního adresáře spusťte následující příkaz:

mkdir -p src/main/java

Vytvoříte následující adresářovou strukturu:

Snímek obrazovky adresářové struktury Java aplikace

Přejděte do adresáře Java a vytvořte soubor s názvem FormRecognizer.java. Otevřete ho v preferovaném editoru nebo integrovaném vývojovém prostředí a přidejte následující deklarace a import příkazy balíčku:

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;

Vyberte vzorový kód, který chcete zkopírovat a vložit do hlavní metody vaší aplikace:

Důležité

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.

Vyzkoušejte si to: Model rozložení

Extrahujte text, značky výběru, styly textu a struktury tabulky spolu s souřadnicemi ohraničující oblasti z dokumentů.

  • V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
  • K analýze daného souboru pomocí identifikátoru URI použijete metodu beginRecognizeContentFromUrl .
  • Do proměnné v hlavní metodě jsme přidali hodnotu formUrl identifikátoru URI souboru.

Aktualizujte třídu FormRecognizer vaší aplikace pomocí následujícího kódu (nezapomeňte aktualizovat klíč a proměnné koncového bodu hodnotami z instance Document Intelligence na webu 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();
            });
        });
    }

Vyzkoušejte si to: Předem připravený model

Tato ukázka ukazuje, jak analyzovat data z určitých typů běžných dokumentů s předem natrénovanými modely pomocí faktury jako příkladu.

  • V tomto příkladu analyzujeme dokument faktury pomocí předem vytvořeného modelu. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
  • K analýze daného souboru pomocí identifikátoru beginRecognizeInvoicesFromUrl URI použijete .
  • Do proměnné v hlavní metodě jsme přidali hodnotu invoiceUrl identifikátoru URI souboru.
  • Pro zjednodušení se zde nezobrazují všechna pole, která služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .

Volba předem vytvořeného modelu

Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro operaci analýzy, závisí na typu dokumentu, který se má analyzovat. Tady jsou předem připravené modely, které služba Document Intelligence aktuálně podporuje:

  • Faktura: extrahuje text, značky výběru, tabulky, pole a klíčové informace z faktur.
  • Potvrzení: extrahuje z účtenek text a klíčové informace.
  • Dokument s ID: extrahuje text a klíčové informace z řidičských licencí a mezinárodních pasů.
  • Vizitka: extrahuje text a klíčové informace z vizitek.

Aktualizujte třídu FormRecognizer vaší aplikace pomocí následujícího kódu (nezapomeňte aktualizovat klíč a proměnné koncového bodu hodnotami z instance Document Intelligence na webu 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());
            }
        }
    }
}

Sestavení a spuštění aplikace

Vraťte se do hlavního adresáře projektu – form-recognizer-app.

  1. Sestavte aplikaci pomocí build příkazu:
gradle build
  1. Spusťte aplikaci pomocí run příkazu:
gradle run

Referenční dokumentace | – ukázky balíčku zdrojového kódu | knihovny (npm) |

V tomto rychlém startu použijete následující rozhraní API k extrakci strukturovaných dat z formulářů a dokumentů:

Požadavky

  • Předplatné Azure – Vytvořte si ho zdarma.

  • Nejnovější verze editoru Visual Studio Code nebo preferované integrované vývojové prostředí (IDE)

  • Nejnovější verze lts Node.js

  • Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

    Tip

    Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.

  • Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:

    Snímek obrazovky s klíči a umístěním koncového bodu na webu Azure Portal

Nastavení

  1. Vytvořte novou aplikaci Node.js. V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte pro vaši aplikaci nový adresář a přejděte do něj.

    mkdir form-recognizer-app && cd form-recognizer-app
    
  2. Spuštěním příkazu npm init vytvoříte aplikaci uzlu se souborem package.json.

    npm init
    
  3. ai-form-recognizer Nainstalujte balíček npm klientské knihovny:

    npm install @azure/ai-form-recognizer
    

    Soubor vaší aplikace package.json se aktualizuje o závislosti.

  4. Vytvořte soubor s názvem index.js, otevřete ho a naimportujte následující knihovny:

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. Vytvořte proměnné pro koncový bod a klíč Azure vašeho prostředku:

    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    
  6. V tuto chvíli by vaše aplikace v JavaScriptu měla obsahovat následující řádky kódu:

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

Vyberte vzorový kód, který chcete zkopírovat a vložit do aplikace:

Důležité

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.

Vyzkoušejte si to: Model rozložení

  • V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
  • Do proměnné v horní části souboru jsme přidali hodnotu formUrl identifikátoru URI souboru.
  • K analýze daného souboru pomocí identifikátoru URI použijete metodu beginRecognizeContent .

Do aplikace rozložení přidejte následující kód na řádku pod proměnnou 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);
});

Vyzkoušejte si to: Předem připravený model

Tato ukázka ukazuje, jak analyzovat data z určitých typů běžných dokumentů s předem natrénovanými modely pomocí faktury jako příkladu. Kompletní seznam polí faktury najdete na naší předem připravené stránce konceptů .

  • V tomto příkladu analyzujeme dokument faktury pomocí předem vytvořeného modelu. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
  • Do proměnné v horní části souboru jsme přidali hodnotu invoiceUrl identifikátoru URI souboru.
  • K analýze daného souboru pomocí identifikátoru URI použijete metodu beginRecognizeInvoices .
  • Pro zjednodušení se zde nezobrazují všechna pole, která služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .

Volba předem vytvořeného modelu

Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro operaci analýzy, závisí na typu dokumentu, který se má analyzovat. Tady jsou předem připravené modely, které služba Document Intelligence aktuálně podporuje:

  • Faktura: extrahuje text, značky výběru, tabulky, pole a klíčové informace z faktur.
  • Potvrzení: extrahuje z účtenek text a klíčové informace.
  • Dokument s ID: extrahuje text a klíčové informace z řidičských licencí a mezinárodních pasů.
  • Vizitka: extrahuje text a klíčové informace z vizitek.

Pod proměnnou přidejte následující kód do předem připravené aplikace key faktury.


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

Referenční dokumentace | – ukázky balíčku zdrojového kódu | knihovny (PyPi) |

V tomto rychlém startu použijete následující rozhraní API k extrakci strukturovaných dat z formulářů a dokumentů:

Požadavky

  • Předplatné Azure: Můžete si ho vytvořit zdarma.

  • Python 3.x

    • Vaše instalace Pythonu by měla obsahovat pip. Spuštěním na příkazovém pip --version řádku můžete zkontrolovat, jestli máte nainstalovaný pip. Získejte pip instalací nejnovější verze Pythonu.
  • Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

    Tip

    Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.

  • Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:

    Snímek obrazovky s klíči a umístěním koncového bodu na webu Azure Portal

Nastavení

Otevřete okno terminálu v místním prostředí a nainstalujte klientskou knihovnu Azure AI Document Intelligence pro Python s pip:

pip install azure-ai-formrecognizer

Vytvoření nové aplikace v Pythonu

V preferovaném editoru nebo integrovaném vývojovém prostředí (IDE) vytvořte novou aplikaci Pythonu s názvem form_recognizer_quickstart.py . Pak naimportujte následující knihovny:

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

Vytvoření proměnných pro koncový bod prostředku Azure a klíč

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

V tuto chvíli by vaše aplikace v Pythonu měla obsahovat následující řádky kódu:

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"

Vyberte vzorový kód, který chcete zkopírovat a vložit do aplikace:

Důležité

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.

Vyzkoušejte si to: Model rozložení

  • V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
  • Do proměnné v horní části souboru jsme přidali hodnotu formUrl identifikátoru URI souboru.
  • K analýze daného souboru pomocí identifikátoru URI použijete metodu begin_recognize_content_from_url .

Do aplikace rozložení přidejte následující kód na řádku pod proměnnou 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()

Vyzkoušejte si to: Předem připravený model

Tato ukázka ukazuje, jak analyzovat data z určitých typů běžných dokumentů s předem natrénovanými modely pomocí faktury jako příkladu. Kompletní seznam polí faktury najdete na naší předem připravené stránce konceptů .

  • V tomto příkladu analyzujeme dokument faktury pomocí předem vytvořeného modelu. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
  • Do proměnné formUrl v horní části souboru jsme přidali hodnotu identifikátoru URI souboru.
  • K analýze daného souboru pomocí identifikátoru URI použijete metodu "begin_recognize_invoices_from_url".
  • Pro zjednodušení se zde nezobrazují všechna pole, která služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .

Volba předem vytvořeného modelu

Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro operaci analýzy, závisí na typu dokumentu, který se má analyzovat. Tady jsou předem připravené modely, které služba Document Intelligence aktuálně podporuje:

  • Faktura: extrahuje text, značky výběru, tabulky, pole a klíčové informace z faktur.
  • Potvrzení: extrahuje z účtenek text a klíčové informace.
  • Dokument s ID: extrahuje text a klíčové informace z řidičských licencí a mezinárodních pasů.
  • Vizitka: extrahuje text a klíčové informace z vizitek.

Pod proměnnou přidejte následující kód do předem připravené aplikace key faktury.


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

Spusťte aplikaci

  1. Přejděte do složky, ve které máte soubor form_recognizer_quickstart.py .

  2. Do terminálu zadejte následující příkaz:

python form_recognizer_quickstart.py

| Referenční informace k rozhraní REST API | služby Document Intelligence v Azure REST API |

V tomto rychlém startu použijete následující rozhraní API k extrakci strukturovaných dat z formulářů a dokumentů:

Požadavky

  • Předplatné Azure: Můžete si ho vytvořit zdarma.

  • Nainstalovaný cURL .

  • PowerShell verze 6.0 nebo podobná aplikace příkazového řádku

  • Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

    Tip

    Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.

  • Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:

    Snímek obrazovky s klíči a umístěním koncového bodu na webu Azure Portal

Vyberte vzorový kód, který chcete zkopírovat a vložit do aplikace:

Důležité

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.

Vyzkoušejte si to: Model rozložení

  • V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
  1. Nahraďte {endpoint} koncovým bodem, který jste získali v předplatném Document Intelligence.
  2. Nahraďte {key} klíčem, který jste zkopírovali z předchozího kroku.
  3. Nahraďte \"{your-document-url} ukázkovou adresou URL dokumentu:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf

Žádost

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

Umístění operace

Obdržíte 202 (Success) odpověď, která obsahuje hlavičku Operation-Location . Hodnota této hlavičky obsahuje ID výsledku, které můžete použít k dotazování na stav asynchronní operace a získání výsledků:

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

V následujícím příkladu jako součást adresy URL je řetězec za analyzeResults/ ID výsledku.

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

Získání výsledků rozložení

Jakmile zavoláte rozhraní API pro analýzu rozložení, zavoláte rozhraní API Pro analýzu výsledků rozložení, abyste získali stav operace a extrahovaná data. Před spuštěním příkazu proveďte tyto změny:

  1. Nahraďte {endpoint} koncovým bodem, který jste získali v předplatném Document Intelligence.
  2. Nahraďte {key} klíčem, který jste zkopírovali z předchozího kroku.
  3. Nahraďte {resultId} ID výsledku z předchozího kroku.

Žádost

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

Prozkoumání výsledků

Obdržíte 200 (success) odpověď s obsahem JSON.

Podívejte se na následující obrázek faktury a odpovídající výstup JSON.

  • Uzel "readResults" obsahuje každý řádek textu s příslušným umístěním ohraničujícího rámečku na stránce.
  • Uzel selectionMarks zobrazuje každou značku výběru (zaškrtávací políčko, značku rádia) a informace o tom, jestli je selectedunselectednebo .
  • Oddíl "pageResults" obsahuje extrahované tabulky. Pro každou tabulku se extrahují text, řádek a index sloupců, řádky a sloupce, které pokrývají, ohraničující pole a další.

Dokument s příkazem projektu Contoso s tabulkou

Text odpovědi

Úplný ukázkový výstup můžete zobrazit na GitHubu.

Vyzkoušejte si to: Předem připravený model

  • V tomto příkladu analyzujeme dokument faktury pomocí předem vytvořeného modelu. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.

Volba předem vytvořeného modelu

Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro operaci analýzy, závisí na typu dokumentu, který se má analyzovat. Tady jsou předem připravené modely, které služba Document Intelligence aktuálně podporuje:

  • Faktura: extrahuje text, značky výběru, tabulky, pole a klíčové informace z faktur.
  • Potvrzení: extrahuje z účtenek text a klíčové informace.
  • Dokument s ID: extrahuje text a klíčové informace z řidičských licencí a mezinárodních pasů.
  • Vizitka: extrahuje text a klíčové informace z vizitek.

Před spuštěním příkazu proveďte tyto změny:

  1. Nahraďte {endpoint} koncovým bodem, který jste získali v předplatném Document Intelligence.

  2. Nahraďte {key} klíčem, který jste zkopírovali z předchozího kroku.

  3. Nahraďte \"{your-document-url} ukázkovou adresou URL faktury:

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

Žádost

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

Umístění operace

Obdržíte 202 (Success) odpověď, která obsahuje hlavičku Operation-Location . Hodnota této hlavičky obsahuje ID výsledku, které můžete použít k dotazování na stav asynchronní operace a získání výsledků:

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

V následujícím příkladu jako součást adresy URL je řetězec za analyzeResults/ ID výsledku:

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

Získání výsledků faktury

Jakmile zavoláte rozhraní API pro analýzu faktur, zavoláte rozhraní API Pro analýzu výsledku faktury, abyste získali stav operace a extrahovaná data. Před spuštěním příkazu proveďte tyto změny:

  1. Nahraďte {endpoint} koncovým bodem, který jste získali klíčem Document Intelligence. Najdete ho na kartě Přehled prostředku Document Intelligence.
  2. Nahraďte {resultId} ID výsledku z předchozího kroku.
  3. {key} nahraďte tímto klíčem.

Žádost

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

Prozkoumání odpovědi

Obdržíte odpověď s výstupem 200 (Success) JSON.

  • Pole "readResults" obsahuje každý řádek textu extrahovaný z faktury.
  • Zahrnuje "pageResults" tabulky a značky výběru extrahované z faktury.
  • Pole "documentResults" obsahuje informace o klíči a hodnotě pro nejrelevavantnější části faktury.

Podívejte se na ukázkový dokument faktury .

Text odpovědi

Podívejte se na úplný ukázkový výstup na GitHubu.

To je to, dobře hotovo!

Další kroky

  • Pokud chcete vylepšit prostředí a pokročilou kvalitu modelu, vyzkoušejte Sadu Document Intelligence Studio.

    • Studio podporuje jakýkoli model natrénovaný s daty označenými v2.1.

    • Protokoly změn poskytují podrobné informace o migraci z verze 3.1 na verzi 4.0.