Megosztás a következőn keresztül:


A dokumentumintelligencia használatának első lépései

Fontos

  • Az Azure Cognitive Services Form Recognizer mostantól Azure AI-dokumentumintelligencia.
  • Egyes platformok továbbra is az átnevezési frissítésre várnak.
  • A Dokumentációnkban a Form Recognizer vagy a Document Intelligence minden említése ugyanarra az Azure-szolgáltatásra vonatkozik.

Ez a tartalom a következőre vonatkozik: Sakk v4.0 (előzetes verzió) Korábbi verziók:kék pipa v3.1 (GA) kék pipa v3.0 (GA)

  • Ismerkedés az Azure AI Document Intelligence legújabb előzetes verziójával (2024-07-31-preview).

Ez a tartalom a következőre vonatkozik: Sakk v3.1 (GA) Korábbi verziók: kék pipa v3.0 kék pipa v2.1

  • Ismerkedés az Azure Form Recognizer legújabb GA-verziójával (2023-07-31).

Ez a tartalom a következőre vonatkozik: Sakk v3.0 (GA) Újabb verzió: kék pipa v3.1kék pipa v2.1

  • Ismerkedés az Azure Form Recognizer örökölt GA-verziójával (2022-08-31).
  • Az Azure AI Document Intelligence /Form Recognizer egy felhőalapú Azure AI-szolgáltatás, amely gépi tanulással kinyeri a kulcs-érték párokat, szövegeket, táblákat és kulcsadatokat a dokumentumokból.

  • A dokumentumfeldolgozó modelleket egyszerűen integrálhatja munkafolyamataiba és alkalmazásaiba egy programozási nyelvű SDK használatával vagy a REST API meghívásával.

  • Ebben a rövid útmutatóban azt javasoljuk, hogy a technológia elsajátítása során használja az ingyenes szolgáltatást. Ne feledje, hogy az ingyenes oldalak száma havonta legfeljebb 500 lehet.

Ha többet szeretne megtudni az API-funkciókról és a fejlesztési lehetőségekről, látogasson el az Áttekintés oldalra.

Ebben a rövid útmutatóban az alábbi funkciókkal elemezheti és kinyerheti az adatokat és értékeket űrlapokból és dokumentumokból:

  • Elrendezési modell – Táblázatok, vonalak, szavak és kijelölési jelek, például választógombok és jelölőnégyzetek elemzése és kinyerése a dokumentumokban, modell betanítása nélkül.

  • Előre összeállított modell – Általános mezők elemzése és kinyerése adott dokumentumtípusokból előre összeállított modell használatával.

Előfeltételek

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos Azure AI-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez.

  • Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

Tipp.

Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.

  • Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:

    Képernyőkép a kulcsok és a végpontok helyéről az Azure Portalon.

  • Azure AI-szolgáltatások vagy Űrlap-felismerő erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos Azure AI-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez.

  • Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

Tipp.

Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak űrlap-felismerői hozzáférés esetén hozzon létre egy Űrlap-felismerő erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.

  • Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás form Recognizer API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:

    Képernyőkép a kulcsok és a végpontok helyéről az Azure Portalon.

Beállítás

  1. Indítsa el a Visual Studiót.

  2. A kezdőlapon válassza az Új projekt létrehozása lehetőséget.

    Képernyőkép a Visual Studio startablakáról.

  3. Az Új projekt létrehozása lapon adja meg a konzolt a keresőmezőbe. Válassza ki a konzolalkalmazás-sablont, majd válassza a Tovább gombot.

    Képernyőkép a Visual Studio új projektlapjáról.

  1. Az új projekt konfigurálása párbeszédpanelen írja be doc_intel_quickstart a Projekt neve mezőbe. Ezután válassza a Tovább gombot.
  1. Az új projekt konfigurálása párbeszédpanelen írja be form_recognizer_quickstart a Projekt neve mezőbe. Ezután válassza a Tovább gombot.
  1. A További információ párbeszédpanelen válassza a .NET 8.0 (Hosszú távú támogatás) lehetőséget, majd válassza a Létrehozás lehetőséget.

    Képernyőkép a Visual Studio további információk párbeszédpaneléről.

Az ügyfélkódtár telepítése a NuGettel

  1. Kattintson a jobb gombbal a doc_intel_quickstart projektre, és válassza a NuGet-csomagok kezelése... lehetőséget.

    Képernyőkép a NuGet előzetes csomag ablakáról a Visual Studióban.

  2. Válassza a Tallózás lapot, és írja be az Azure.AI.DocumentIntelligence parancsot.

  3. Jelölje be a Include prerelease jelölőnégyzetet.

    Képernyőkép a Visual Studióban az előzetes NuGet-csomag kiválasztásáról.

  4. Válasszon egy verziót a legördülő menüből, és telepítse a csomagot a projektbe.

  1. Kattintson a jobb gombbal a form_recognizer_quickstart projektre, és válassza a NuGet-csomagok kezelése... lehetőséget.

    Képernyőkép a NuGet-csomag ablakának megkereséséről a Visual Studióban.

  2. Válassza a Tallózás lapot, és írja be az Azure.AI.FormRecognizer parancsot. Válassza ki a 4.1.0-s verziót a legördülő menüből

    Képernyőkép a NuGet Form Recognizer csomag kiválasztásáról a Visual Studióban.

  1. Kattintson a jobb gombbal a form_recognizer_quickstart projektre, és válassza a NuGet-csomagok kezelése... lehetőséget.

    Képernyőkép a NuGet-csomag ablakáról a Visual Studióban.

  2. Válassza a Tallózás lapot, és írja be az Azure.AI.FormRecognizer parancsot. Válassza ki a 4.0.0-s verziót a legördülő menüből

    Képernyőkép a NuGet örökölt csomag kiválasztásáról a Visual Studióban.

Az alkalmazás összeállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentIntelligenceClient . Ehhez létre kell hoznia egy példányt AzureKeyCredential key az Azure Portalról, valamint egy DocumentIntelligenceClient példányt a dokumentumintelligencia és a AzureKeyCredential dokumentumintelligencia használatával endpoint.

A Form Recognizer szolgáltatás használatához létre kell hoznia egy osztálypéldányt DocumentAnalysisClient . Ehhez létre kell hoznia egy AzureKeyCredential key példányt az Azure Portalról, valamint egy példányt DocumentAnalysisClient a AzureKeyCredential Form Recognizerrel endpoint.

Feljegyzés

  • A .NET 6-tól kezdve a console sablont használó új projektek új programstílust hoznak létre, amely eltér a korábbi verzióktól.
  • Az új kimenet a legutóbbi C#-funkciókat használja, amelyek leegyszerűsítik az írandó kódot.
  • Az újabb verzió használatakor csak a metódus törzsét Main kell megírnia. Nem kell felső szintű utasításokat, globális irányelveket vagy implicit irányelveket használnia.
  • További információ: Új C#-sablonok legfelső szintű utasítások létrehozása.
  1. Nyissa meg a Program.cs fájlt.

  2. Törölje a már meglévő kódot, beleértve a sort Console.Writeline("Hello World!")is, és válassza ki az alábbi kódminták egyikét az alkalmazás Program.cs fájljába való másoláshoz és beillesztéshez:

Fontos

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.

Elrendezési modell

Szöveg, kijelölési jelek, szövegstílusok, táblázatstruktúrák és határolórégió koordinátáinak kinyerése dokumentumokból.

  • Ebben a példában egy URI-ból származó dokumentumfájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
  • Hozzáadtuk a fájl URI-értékét a Uri fileUri szkript tetején található változóhoz.
  • Ha ki szeretné nyerni az elrendezést egy adott fájlból egy URI-n, használja a StartAnalyzeDocumentFromUri metódust, és adja át prebuilt-layout a modellazonosítót. A visszaadott érték egy AnalyzeResult olyan objektum, amely az elküldött dokumentumból származó adatokat tartalmazza.

Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:


using Azure;
using Azure.AI.DocumentIntelligence;

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

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

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

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

AnalyzeResult result = operation.Value;

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

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

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

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

        Console.WriteLine();
    }

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

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

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

        Console.WriteLine();
    }
}

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

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

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

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

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

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

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

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

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

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

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.

Képernyőkép a Visual Studio program gombjának futtatásáról.

Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:

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

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.

Képernyőkép a Visual Studio program gomb helyének futtatásáról.

Elrendezési modell kimenete

Íme egy kódrészlet a várt kimenetről:

  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

A teljes kimenet megtekintéséhez látogasson el az Azure-minták adattárába a GitHubon az elrendezési modell kimenetének megtekintéséhez.

Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:

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

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.

Képernyőkép a Visual Studio-program futtatásáról.

Előre összeállított modell

Egy előre összeállított modell használatával elemezheti és kinyerheti a gyakori mezőket adott dokumentumtípusokból. Ebben a példában egy számlát elemezünk az előre összeállított számlamodell használatával.

Tipp.

Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. A művelethez analyze használandó modell az elemezni kívánt dokumentum típusától függ. Lásd: modelladatok kinyerése.

  • Számla elemzése az előre összeállított számlamodell használatával. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
  • Hozzáadtuk a fájl URI-értékét a Uri invoiceUri Program.cs fájl tetején lévő változóhoz.
  • Ha egy adott fájlt egy URI-n szeretne elemezni, használja a StartAnalyzeDocumentFromUri metódust, és adja át prebuilt-invoice a modellazonosítót. A visszaadott érték egy AnalyzeResult olyan objektum, amely az elküldött dokumentumból származó adatokat tartalmazza.
  • Az egyszerűség kedvéért a szolgáltatás által visszaadott kulcs-érték párok nem jelennek meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.

Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:


using Azure;
using Azure.AI.DocumentIntelligence;

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

//sample invoice document

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

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

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

AnalyzeResult result = operation.Value;

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

    AnalyzedDocument document = result.Documents[i];

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

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

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

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

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

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

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

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

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

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.

Képernyőkép a Visual Studio program gombjának futtatásáról.

Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:


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

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.

Képernyőkép a Visual Studio program gomb helyének futtatásáról.

Előre összeállított modell kimenete

Íme egy kódrészlet a várt kimenetről:

  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

A teljes kimenet megtekintéséhez látogasson el a GitHub Azure-mintaadattárába az előre összeállított számlamodell kimenetének megtekintéséhez.

Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:


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

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.

Képernyőkép a Visual Studio-program futtatásáról.

Ebben a rövid útmutatóban az alábbi funkciókkal elemezheti és kinyerheti az adatokat és értékeket űrlapokból és dokumentumokból:

  • Elrendezés – Táblázatok, vonalak, szavak és kijelölési jelek, például választógombok és jelölőnégyzetek elemzése és kinyerése a dokumentumokban, modell betanítása nélkül.

  • Előre összeállított számla – Általános mezők elemzése és kinyerése adott dokumentumtípusokból egy előre betanított modell használatával.

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen.

  • A Visual Studio Code legújabb verziója vagy az ön által előnyben részesített IDE. Lásd a Java-t a Visual Studio Code-ban.

    Tipp.

    • A Visual Studio Code a Java kódolási csomagját kínálja Windowshoz és macOS-hez. A kódolási csomag a VS Code, a Java Fejlesztői Készlet (JDK) és a Microsoft által javasolt bővítmények gyűjteménye. A kódolási csomag egy meglévő fejlesztési környezet javításához is használható.
    • Ha a VS Code-ot és a Java kódolási csomagját használja, telepítse a Gradle for Java bővítményt.
  • Ha nem a Visual Studio Code-ot használja, győződjön meg arról, hogy telepítve van a következő a fejlesztői környezetben:

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egy vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

    Tipp.

    Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.

  • Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. Később illessze be a kulcsot és a végpontot a kódba:

    Képernyőkép a kulcsok és a végpontok helyéről az Azure Portalon.

Beállítás

Új Gradle-projekt létrehozása

  1. A konzolablakban (például parancsmag, PowerShell vagy Bash) hozzon létre egy új könyvtárat az alkalmazáshoz doc-intel-app néven, és navigáljon hozzá.

    mkdir doc-intel-app && doc-intel-app
    
    mkdir doc-intel-app; cd doc-intel-app
    
  2. Futtassa a gradle init parancsot a munkakönyvtárból. Ez a parancs alapvető buildfájlokat hoz létre a Gradle számára, beleértve a build.gradle.kts fájlt is, amelyet futásidőben használnak az alkalmazás létrehozásához és konfigurálásához.

    gradle init --type basic
    
  3. Amikor a rendszer kéri, hogy válasszon egy DSL-t, válassza a Kotlin lehetőséget.

  4. Fogadja el az alapértelmezett projektnevet (doc-intel-app) a Return vagy az Enter billentyűkombinációval.

  1. A konzolablakban (például parancsmag, PowerShell vagy Bash) hozzon létre egy új könyvtárat az alkalmazáshoz, az úgynevezett form-recognize-apphoz, és navigáljon hozzá.

    mkdir form-recognize-app && form-recognize-app
    
    mkdir form-recognize-app; cd form-recognize-app
    
  2. Futtassa a gradle init parancsot a munkakönyvtárból. Ez a parancs alapvető buildfájlokat hoz létre a Gradle számára, beleértve a build.gradle.kts fájlt is, amelyet futásidőben használnak az alkalmazás létrehozásához és konfigurálásához.

    gradle init --type basic
    
  3. Amikor a rendszer kéri, hogy válasszon egy DSL-t, válassza a Kotlin lehetőséget.

  4. Fogadja el az alapértelmezett projektnevet (form-recognize-app) a Return vagy az Enter billentyűkombinációval.

Telepítse az ügyfélkódtárat

Ez a rövid útmutató a Gradle függőségkezelőt használja. A Maven Central-adattárban megtalálhatja a többi függőségkezelő ügyfélkódtárát és információit.

Nyissa meg a projekt build.gradle.kts fájlját az IDE-ben. A következő kódot fizetve adja meg az ügyfélkódtárat utasításként implementation , valamint a szükséges beépülő modulokat és beállításokat.

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

   }

Ez a rövid útmutató a Gradle függőségkezelőt használja. A Maven Central-adattárban megtalálhatja a többi függőségkezelő ügyfélkódtárát és információit.

Nyissa meg a projekt build.gradle.kts fájlját az IDE-ben. A következő kódot fizetve adja meg az ügyfélkódtárat utasításként implementation , valamint a szükséges beépülő modulokat és beállításokat.

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

   }

Ez a rövid útmutató a Gradle függőségkezelőt használja. A Maven Central-adattárban megtalálhatja a többi függőségkezelő ügyfélkódtárát és információit.

Nyissa meg a projekt build.gradle.kts fájlját az IDE-ben. A következő kódot fizetve adja meg az ügyfélkódtárat utasításként implementation , valamint a szükséges beépülő modulokat és beállításokat.

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


   }

Java-alkalmazás létrehozása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentIntelligenceClient . Ehhez létre kell hoznia egy példányt AzureKeyCredential key az Azure Portalról, valamint egy DocumentIntelligenceClient példányt a dokumentumintelligencia és a AzureKeyCredential dokumentumintelligencia használatával endpoint.

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez létre kell hoznia egy példányt AzureKeyCredential key az Azure Portalról, valamint egy DocumentAnalysisClient példányt a dokumentumintelligencia és a AzureKeyCredential dokumentumintelligencia használatával endpoint.

  1. A doc-intel-app könyvtárban futtassa a következő parancsot:

    mkdir -p src/main/java
    

    A következő könyvtárstruktúrát hozza létre:

    Képernyőkép a Java-címtár szerkezetéről

  1. Lépjen a java könyvtárra, és hozzon létre egy fájlt.DocIntelligence.java

    Tipp.

    • Új fájlt a PowerShell használatával hozhat létre.
    • Nyisson meg egy PowerShell-ablakot a projektkönyvtárban a Shift billentyűt lenyomva tartva kattintson a jobb gombbal a mappára.
    • Írja be a következő parancsot : New-Item DocIntelligence.java.
  2. Nyissa meg a(z) DocIntelligence.java fájlt. Másolja és illessze be az alábbi kódminták egyikét az alkalmazásba:

  1. Lépjen a java könyvtárra, és hozzon létre egy fájlt.FormRecognizer.java

    Tipp.

    • Új fájlt a PowerShell használatával hozhat létre.
    • Nyisson meg egy PowerShell-ablakot a projektkönyvtárban a Shift billentyűt lenyomva tartva kattintson a jobb gombbal a mappára.
    • Írja be a következő parancsot : New-Item FormRecognizer.java.
  2. Nyissa meg a(z) FormRecognizer.java fájlt. Másolja és illessze be az alábbi kódminták egyikét az alkalmazásba:

Fontos

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.

Elrendezési modell

Szöveg, kijelölési jelek, szövegstílusok, táblázatstruktúrák és határolórégió koordinátáinak kinyerése dokumentumokból.

  • Ebben a példában egy URI-fájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
  • Ha egy adott fájlt egy URI-n szeretne elemezni, használja a beginAnalyzeDocumentFromUrl metódust, és adja át prebuilt-layout a modellazonosítót. A visszaadott érték egy AnalyzeResult olyan objektum, amely adatokat tartalmaz az elküldött dokumentumról.
  • Hozzáadtuk a fájl URI-értékét a documentUrl fő metódus változóhoz.

Adja hozzá a következő kódmintát a DocIntelligence.java fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:


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

import java.util.List;

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

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

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

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

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

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

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

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

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

Az alkalmazás létrehozása és futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz – a doc-intel-apphoz.

  1. Az alkalmazás létrehozása a build következő paranccsal:

    gradle build
    
  2. Futtassa az alkalmazást a run következő paranccsal:

    gradle run
    

Adja hozzá a következő kódmintát a FormRecognizer.java fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:


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

Az alkalmazás létrehozása és futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz , a form-recognize-apphoz.

  1. Az alkalmazás létrehozása a build következő paranccsal:

    gradle build
    
  2. Futtassa az alkalmazást a run következő paranccsal:

    gradle run
    

Elrendezési modell kimenete

Íme egy kódrészlet a várt kimenetről:

  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.

A teljes kimenet megtekintéséhez látogasson el az Azure-minták adattárába a GitHubon az elrendezési modell kimenetének megtekintéséhez.

Adja hozzá a következő kódmintát a FormRecognizer.java fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:


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

Az alkalmazás létrehozása és futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz , a form-recognize-apphoz.

  1. Az alkalmazás létrehozása a build következő paranccsal:

    gradle build
    
  2. Futtassa az alkalmazást a run következő paranccsal:

    gradle run
    

Előre összeállított modell

Egy előre összeállított modell használatával elemezheti és kinyerheti a gyakori mezőket adott dokumentumtípusokból. Ebben a példában egy számlát elemezünk az előre összeállított számlamodell használatával.

Tipp.

Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. A művelethez analyze használandó modell az elemezni kívánt dokumentum típusától függ. Lásd: modelladatok kinyerése.

  • Számla elemzése az előre összeállított számlamodell használatával. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
  • Hozzáadtuk a fájl URL-címét a invoiceUrl fájl tetején lévő változóhoz.
  • Ha egy adott fájlt egy URI-n szeretne elemezni, használja a beginAnalyzeDocuments metódust, és adja át PrebuiltModels.Invoice a modellazonosítót. A visszaadott érték egy result olyan objektum, amely adatokat tartalmaz az elküldött dokumentumról.
  • Az egyszerűség kedvéért a szolgáltatás által visszaadott kulcs-érték párok nem jelennek meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.

Adja hozzá a következő kódmintát a DocIntelligence.java fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:


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

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

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Az alkalmazás létrehozása és futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz – a doc-intel-apphoz.

  1. Az alkalmazás létrehozása a build következő paranccsal:

    gradle build
    
  2. Futtassa az alkalmazást a run következő paranccsal:

    gradle run
    

Adja hozzá a következő kódmintát a FormRecognizer.java fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:


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

Az alkalmazás létrehozása és futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz – a doc-intel-apphoz.

  1. Az alkalmazás létrehozása a build következő paranccsal:

    gradle build
    
  2. Futtassa az alkalmazást a run következő paranccsal:

    gradle run
    

Előre összeállított modell kimenete

Íme egy kódrészlet a várt kimenetről:

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

A teljes kimenet megtekintéséhez látogasson el a GitHub Azure-mintaadattárába az előre összeállított számlamodell kimenetének megtekintéséhez.

Adja hozzá a következő kódmintát a FormRecognizer.java fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:


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

Az alkalmazás létrehozása és futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz – a doc-intel-apphoz.

  1. Az alkalmazás létrehozása a build következő paranccsal:

    gradle build
    
  2. Futtassa az alkalmazást a run következő paranccsal:

    gradle run
    

Ebben a rövid útmutatóban az alábbi funkciókkal elemezheti és kinyerheti az adatokat és értékeket űrlapokból és dokumentumokból:

  • Elrendezés – Táblázatok, vonalak, szavak és kijelölési jelek, például választógombok és jelölőnégyzetek elemzése és kinyerése a dokumentumokban, modell betanítása nélkül.

  • Előre összeállított számla – Általános mezők elemzése és kinyerése adott dokumentumtípusokból egy előre betanított számlamodell használatával.

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen.

  • A Visual Studio Code legújabb verziója vagy az ön által előnyben részesített IDE. További információ: Node.js a Visual Studio Code-ban.

  • A Node.js legújabb LTS verziója.

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egy vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

    Tipp.

    Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.

  • Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:

    Képernyőkép a kulcsok és a végpontok helyéről az Azure Portalon.

Beállítás

  1. Új Node.js Express-alkalmazás létrehozása: Egy konzolablakban (például parancsmag, PowerShell vagy Bash) hozzon létre egy új könyvtárat, és keresse meg az alkalmazás nevét doc-intel-app.

    mkdir doc-intel-app && cd doc-intel-app
    
  2. Futtassa a npm init parancsot az alkalmazás inicializálásához és a projekt létrehozásához.

    npm init
    
  3. Adja meg a projekt attribútumait a terminálban megjelenő parancssorok használatával.

    • A legfontosabb attribútumok a név, a verziószám és a belépési pont.
    • Javasoljuk, hogy tartsa meg index.js a belépési pont nevét. A leírás, a tesztparancs, a GitHub-adattár, a kulcsszavak, a szerző és a licencadatok opcionális attribútumok– ezek kihagyhatók ehhez a projekthez.
    • Fogadja el a javaslatokat zárójelben a Return vagy az Enter billentyűkombinációval.
    • A kérések elvégzése után létrejön egy package.json fájl a doc-intel-app könyvtárban.
  1. Telepítse az ügyfélkódtárat és azure/identity az ai-document-intelligence npm-csomagokat:

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

    Az alkalmazás fájlja package.json frissül a függőségekkel.

  1. Telepítse az ügyfélkódtárat és azure/identity az ai-form-recognizer npm-csomagokat:

    npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
    
    • Az alkalmazás fájlja package.json frissül a függőségekkel.
  1. Telepítse az ügyfélkódtárat és azure/identity az ai-form-recognizer npm-csomagokat:

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. Hozzon létre egy fájlt index.js az alkalmazáskönyvtárban.

    Tipp.

    • Új fájlt a PowerShell használatával hozhat létre.
    • Nyisson meg egy PowerShell-ablakot a projektkönyvtárban a Shift billentyűt lenyomva tartva kattintson a jobb gombbal a mappára.
    • Írja be a következő parancsot : New-Item index.js.

Az alkalmazás összeállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentIntelligenceClient . Ehhez létre kell hoznia egy példányt AzureKeyCredential key az Azure Portalról, valamint egy DocumentIntelligenceClient példányt a dokumentumintelligencia és a AzureKeyCredential dokumentumintelligencia használatával endpoint.

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez létre kell hoznia egy AzureKeyCredential key példányt az Azure Portalról, valamint egy példányt DocumentAnalysisClient a AzureKeyCredential Form Recognizerrel endpoint.

  1. Nyissa meg a fájlt a index.js Visual Studio Code-ban vagy a kedvenc IDE-ben. Másolja és illessze be az alábbi kódminták egyikét az alkalmazásba:

Fontos

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.

Elrendezési modell

Szöveg, kijelölési jelek, szövegstílusok, táblázatstruktúrák és határolórégió koordinátáinak kinyerése dokumentumokból.

  • Ebben a példában egy URL-címről származó dokumentumfájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
  • Hozzáadtuk a fájl URL-címét a formUrl fájl tetején található változóhoz.
  • Ha egy adott fájlt egy URL-címből szeretne elemezni, a beginAnalyzeDocuments metódust fogja használni, és modellazonosítóként adja át prebuilt-layout .
    const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
  { getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

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

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

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

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


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

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

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

    const documents = analyzeResult?.documents;

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

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

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

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, futtassa a programot:

  1. Lépjen arra a mappára, ahol a Dokumentumintelligencia-alkalmazás (doc-intel-app) található.

  2. Írja be a következő parancsot a terminálba:

    node index.js
    

Adja hozzá a következő kódmintát a index.js fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:


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

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, futtassa a programot:

  1. Lépjen arra a mappára, ahol a Dokumentumintelligencia-alkalmazás (doc-intel-app) található.

  2. Írja be a következő parancsot a terminálba:

    node index.js
    

Elrendezési modell kimenete

Íme egy kódrészlet a várt kimenetről:

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

A teljes kimenet megtekintéséhez látogasson el az Azure-minták adattárába a GitHubon az elrendezési modell kimenetének megtekintéséhez.

Előre összeállított modell

Ebben a példában egy számlát elemezünk az előre összeállított számlamodell használatával.

Tipp.

Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. A művelethez analyze használandó modell az elemezni kívánt dokumentum típusától függ. Lásd: modelladatok kinyerése.

  • Számla elemzése az előre összeállított számlamodell használatával. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
  • Hozzáadtuk a fájl URL-címét a invoiceUrl fájl tetején lévő változóhoz.
  • Ha egy adott fájlt egy URI-n szeretne elemezni, használja a beginAnalyzeDocuments metódust, és adja át PrebuiltModels.Invoice a modellazonosítót. A visszaadott érték egy result olyan objektum, amely adatokat tartalmaz az elküldött dokumentumról.
  • Az egyszerűség kedvéért a szolgáltatás által visszaadott kulcs-érték párok nem jelennek meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.

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

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

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

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

async function main() {

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

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

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

    const poller = await getLongRunningPoller(client, initialResponse);

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

    const documents = analyzeResult?.documents;

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

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


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

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, futtassa a programot:

  1. Lépjen arra a mappára, ahol a Dokumentumintelligencia-alkalmazás (doc-intel-app) található.

  2. Írja be a következő parancsot a terminálba:

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

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, futtassa a programot:

  1. Lépjen arra a mappára, ahol a Dokumentumintelligencia-alkalmazás (doc-intel-app) található.

  2. Írja be a következő parancsot a terminálba:

    node index.js
    

Előre összeállított modell kimenete

Íme egy kódrészlet a várt kimenetről:

  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

A teljes kimenet megtekintéséhez látogasson el a GitHub Azure-mintaadattárába az előre összeállított számlamodell kimenetének megtekintéséhez.

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

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

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

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

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


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

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

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

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

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


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

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, futtassa a programot:

  1. Lépjen arra a mappára, ahol a Dokumentumintelligencia-alkalmazás (doc-intel-app) található.

  2. Írja be a következő parancsot a terminálba:

    node index.js
    

Ebben a rövid útmutatóban az alábbi funkciókkal elemezheti és kinyerheti az adatokat űrlapokból és dokumentumokból:

  • Elrendezés – Táblázatok, vonalak, szavak és kijelölési jelek, például választógombok, jelölőnégyzetek és kulcs-érték párok elemzése és kinyerése anélkül, hogy be kellene tanítani egy modellt.

  • Előre összeállított számla – Általános mezők elemzése és kinyerése adott dokumentumtípusokból egy előre betanított modell használatával.

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen.

  • Python 3.7 vagy újabb.

    • A Python-telepítésnek tartalmaznia kell a pipet. A parancssorban való futtatással pip --version ellenőrizheti, hogy telepítve van-e a pip. Kérje le a pipet a Python legújabb verziójának telepítésével.
  • A Visual Studio Code legújabb verziója vagy az ön által előnyben részesített IDE. További információ: A Python használatának első lépései a Visual Studio Code-ban.

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egy vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

Tipp.

Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.

  • Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:

    Képernyőkép a kulcsok és a végpontok helyéről az Azure Portalon.

Beállítás

Nyisson meg egy terminálablakot a helyi környezetben, és telepítse a Pythonhoz készült Azure AI Document Intelligence ügyféloldali kódtárat pip használatával:

pip install azure-ai-documentintelligence==1.0.0b4

pip install azure-ai-formrecognizer==3.3.0

pip install azure-ai-formrecognizer==3.2.0b6

Python-alkalmazás létrehozása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentIntelligenceClient . Ehhez létre kell hoznia egy példányt AzureKeyCredential key az Azure Portalról, valamint egy DocumentIntelligenceClient példányt a dokumentumintelligencia és a AzureKeyCredential dokumentumintelligencia használatával endpoint.

  1. Hozzon létre egy doc_intel_quickstart.py nevű új Python-fájlt az előnyben részesített szerkesztőben vagy IDE-ben.

  2. Nyissa meg a doc_intel_quickstart.py fájlt, és válassza ki az alábbi kódminták egyikét az alkalmazásba való másoláshoz és beillesztéshez:

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez létre kell hoznia egy példányt AzureKeyCredential key az Azure Portalról, valamint egy DocumentAnalysisClient példányt a dokumentumintelligencia és a AzureKeyCredential dokumentumintelligencia használatával endpoint.

  1. Hozzon létre egy form_recognizer_quickstart.py nevű új Python-fájlt az előnyben részesített szerkesztőben vagy IDE-ben.

  2. Nyissa meg a form_recognizer_quickstart.py fájlt, és válassza ki az alábbi kódminták egyikét az alkalmazásba való másoláshoz és beillesztéshez:

Fontos

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.

Elrendezési modell

Szöveg, kijelölési jelek, szövegstílusok, táblázatstruktúrák és határolórégió koordinátáinak kinyerése dokumentumokból.

  • Ebben a példában egy URL-címről származó dokumentumfájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
  • Hozzáadtuk a fájl URL-címét a formUrl függvény változóhoz analyze_layout .

Adja hozzá a következő kódmintát a doc_intel_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:


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

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

# helper functions

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


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


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

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

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

    result: AnalyzeResult = poller.result()

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

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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:

  1. Lépjen arra a mappára, ahol a doc_intel_quickstart.py fájl található.

  2. Írja be a következő parancsot a terminálba:

    python doc_intel_quickstart.py
    

Ha egy adott fájlt egy URL-címen szeretne elemezni, használja a begin_analyze_document_from_url metódust, és adja meg prebuilt-layout a modellazonosítót. A visszaadott érték egy result olyan objektum, amely adatokat tartalmaz az elküldött dokumentumról.

Adja hozzá a következő kódmintát a form_recognizer_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:


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

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

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

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

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

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

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

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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()

Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:

  1. Lépjen arra a mappára, ahol a form_recognizer_quickstart.py fájl található.

  2. Írja be a következő parancsot a terminálba:

    python form_recognizer_quickstart.py
    

Elrendezési modell kimenete

Íme egy kódrészlet a várt kimenetről:

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

A teljes kimenet megtekintéséhez látogasson el az Azure-minták adattárába a GitHubon az elrendezési modell kimenetének megtekintéséhez.

Adja hozzá a következő kódmintát a form_recognizer_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:


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


Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:

  1. Lépjen arra a mappára, ahol a form_recognizer_quickstart.py fájl található.

  2. Írja be a következő parancsot a terminálba:

    python form_recognizer_quickstart.py
    

Előre összeállított modell

Egy előre összeállított modell használatával elemezheti és kinyerheti a gyakori mezőket adott dokumentumtípusokból. Ebben a példában egy számlát elemezünk az előre összeállított számlamodell használatával.

Tipp.

Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. A művelethez analyze használandó modell az elemezni kívánt dokumentum típusától függ. Lásd: modelladatok kinyerése.

  • Számla elemzése az előre összeállított számlamodell használatával. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
  • Hozzáadtuk a fájl URL-címét a invoiceUrl fájl tetején lévő változóhoz.
  • Az egyszerűség kedvéért a szolgáltatás által visszaadott kulcs-érték párok nem jelennek meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.

Adja hozzá a következő kódmintát a doc_intel_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:


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



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

def analyze_invoice():
    # sample document

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

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

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

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


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


if __name__ == "__main__":
    analyze_invoice()


Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:

  1. Lépjen arra a mappára, ahol a doc_intel_quickstart.py fájl található.

  2. Írja be a következő parancsot a terminálba:

    python doc_intel_quickstart.py
    

Ha egy adott fájlt egy URI-n szeretne elemezni, használja a begin_analyze_document_from_url metódust, és adja át prebuilt-invoice a modellazonosítót. A visszaadott érték egy result olyan objektum, amely adatokat tartalmaz az elküldött dokumentumról.

Adja hozzá a következő kódmintát a form_recognizer_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:

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


Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:

  1. Lépjen arra a mappára, ahol a form_recognizer_quickstart.py fájl található.

  2. Írja be a következő parancsot a terminálba:

    python form_recognizer_quickstart.py
    

Előre összeállított modell kimenete

Íme egy kódrészlet a várt kimenetről:

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

A teljes kimenet megtekintéséhez látogasson el a GitHub Azure-mintaadattárába az előre összeállított számlamodell kimenetének megtekintéséhez.

Adja hozzá a következő kódmintát a form_recognizer_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:


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


Az alkalmazás futtatása

Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:

  1. Lépjen arra a mappára, ahol a form_recognizer_quickstart.py fájl található.

  2. Írja be a következő parancsot a terminálba:

    python form_recognizer_quickstart.py
    

Ebben a rövid útmutatóban megtudhatja, hogy a Document Intelligence REST API használatával elemezheti és kinyerheti az adatokat és az értékeket a dokumentumokból:

Előfeltételek

  • Azure-előfizetés – Ingyenes létrehozás

  • curl parancssori eszköz telepítve.

  • A PowerShell 7.*+ verziója (vagy egy hasonló parancssori alkalmazás):

  • A PowerShell-verzió ellenőrzéséhez írja be az alábbi parancsot az operációs rendszerhez képest:

    • Windows: Get-Host | Select-Object Version
    • macOS vagy Linux: $PSVersionTable
  • Dokumentumintelligencia-(egyszolgáltatásos) vagy Azure AI-szolgáltatások (többszolgáltatásos) erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egy vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

Tipp.

Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.

  • Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:

    Képernyőkép a kulcsok és a végpontok helyéről az Azure Portalon.

Dokumentumok elemzése és eredmények lekérése

A POST-kérések egy előre összeállított vagy egyéni modellel rendelkező dokumentumok elemzésére szolgálnak. A GET kérés egy dokumentumelemzési hívás eredményének lekérésére szolgál. A modelId POST és resultId a GET műveletek esetén használatos.

Dokumentum elemzése (POST-kérelem)

A cURL parancs futtatása előtt végezze el a következő módosításokat a post requestben:

  1. Cserélje le {endpoint} az Azure Portal Dokumentumintelligencia-példányának végpontértékére.

  2. Cserélje le {key} az Azure Portal Dokumentumintelligencia-példányának kulcsértékére.

  3. Az alábbi táblázatot hivatkozásként használva cserélje le és {your-document-url} írja be {modelID} a kívánt értékeket.

  4. Egy URL-címen található dokumentumfájlra van szüksége. Ebben a rövid útmutatóban az alábbi táblázatban szereplő mintaűrlapokat használhatja az egyes funkciókhoz:

Mintadokumentumok

Szolgáltatás {modelID} {your-document-url}
Olvasás előre összeállított olvasás https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Elrendezés előre összeállított elrendezés https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Egészségbiztosítási kártya prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
W-2-nyomtatványok prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Számla előre összeállított számla https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Nyugta előre összeállított nyugta https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Személyazonosító okmányok előre összeállított-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

Mintadokumentumok

Szolgáltatás {modelID} {your-document-url}
Általános dokumentum előre összeállított dokumentum https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Olvasás előre összeállított olvasás https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Elrendezés előre összeállított elrendezés https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Egészségbiztosítási kártya prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
W-2-nyomtatványok prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Számla előre összeállított számla https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Nyugta előre összeállított nyugta https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Személyazonosító okmányok előre összeállított-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png
Névjegykártya előre összeállított-businessCard https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg

Fontos

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.

POST kérés

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

POST-válasz (resultID)

Olyan választ kap 202 (Success) , amely egy írásvédett műveleti hely fejlécet tartalmaz. Ennek az élőfejnek az értéke olyan resultID lekérdezést tartalmaz, amely lekérdezhető az aszinkron művelet állapotának lekéréséhez és az eredmények lekéréséhez egy GET kéréssel ugyanazzal az erőforrás-előfizetési kulccsal:

{alt-text}

Elemzési eredmények lekérése (GET-kérelem)

Az API meghívása Analyze document után hívja meg az Elemzés eredménye API-t a művelet állapotának és a kinyert adatok lekéréséhez. A parancs futtatása előtt végezze el a következő módosításokat:

Az API meghívása Analyze document után hívja meg az Elemzés eredménye API-t a művelet állapotának és a kinyert adatok lekéréséhez. A parancs futtatása előtt végezze el a következő módosításokat:

Az API meghívása Analyze document után hívja meg az Elemzés eredménye API-t a művelet állapotának és a kinyert adatok lekéréséhez. A parancs futtatása előtt végezze el a következő módosításokat:

  1. Cserélje le {resultID} az Operation-Location fejlécet a POST válaszból.

  2. Cserélje le {key} a Dokumentumintelligencia-példány kulcsértékére az Azure Portalon.

GET kérés

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

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

A válasz vizsgálata

JSON-kimenettel rendelkező választ kap 200 (Success) . Az első mező "status"a művelet állapotát jelzi. Ha a művelet nem fejeződött be, a művelet értéke "status" vagy "running" "notStarted", és újra meg kell hívnia az API-t manuálisan vagy egy szkripten keresztül. Javasoljuk, hogy a hívások között legalább egy másodperces időközt válasszon.

Mintaválasz előre összeállított számlához

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

Támogatott dokumentummezők

Az előre összeállított modellek előre definiált dokumentummezőket nyernek ki. A kinyert mezőnevekről, típusokról, leírásokról és példákról lásd a modell adatkinyerés című témakört.

Ennyi, gratulálok!

Ebben a rövid útmutatóban egy dokumentumintelligencia-modellt használt a különböző űrlapok és dokumentumok elemzéséhez. Ezután ismerkedjen meg a Document Intelligence Studióval, és referenciadokumentációt a Document Intelligence API részletes megismeréséhez.

Következő lépések

  • A továbbfejlesztett felhasználói élmény és a fejlett modellminőség érdekében próbálja ki a Document Intelligence Studiót

  • A 3.1-ről a 4.0-s verzióra történő migrálásról a Changelog Migration útmutatóiban olvashat.

Ez a tartalom a következőre vonatkozik: Sakk v2.1 | Legújabb verzió: kék pipa 4.0-s verzió (előzetes verzió)

Az Azure AI Document Intelligence használatának első lépései a választott programozási nyelv vagy a REST API használatával. A Dokumentumintelligencia egy felhőalapú Azure AI-szolgáltatás, amely gépi tanulással kinyeri a kulcs-érték párokat, a szöveget és a táblázatokat a dokumentumokból. Javasoljuk, hogy a technológia elsajátításakor használja az ingyenes szolgáltatást. Ne feledje, hogy az ingyenes oldalak száma havonta legfeljebb 500 lehet.

A Dokumentumintelligencia funkcióiról és a fejlesztési lehetőségekről az Áttekintés oldalon olvashat bővebben.

Referenciadokumentáció Kódtár forráskódcsomagja | (NuGet) | -minták |

Ebben a rövid útmutatóban a következő API-k segítségével nyerhet ki strukturált adatokat űrlapokból és dokumentumokból:

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen.

  • A Visual Studio IDE aktuális verziója.

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Miután megkapta az Azure-előfizetését, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

    Tipp.

    Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.

  • Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:

    Képernyőkép a kulcsok és a végpontok helyéről az Azure Portalon.

Beállítás

  1. Indítsa el a Visual Studio 2019-et.

  2. A kezdőlapon válassza az Új projekt létrehozása lehetőséget.

    Képernyőkép a Visual Studio startablakáról.

  3. Az Új projekt létrehozása lapon adja meg a konzolt a keresőmezőbe. Válassza ki a konzolalkalmazás-sablont, majd válassza a Tovább gombot.

    Képernyőkép a Visual Studio új projektlapjának létrehozásáról.

  4. Az új projekt konfigurálása párbeszédpanelen írja be formRecognizer_quickstart a Projekt neve mezőbe. Ezután válassza a Tovább gombot.

    Képernyőkép a Visual Studios új projektkonfigurálási párbeszédpaneléről.

  5. A További információ párbeszédpanelen válassza a .NET 5.0 (Aktuális), majd a Létrehozás lehetőséget.

    Képernyőkép a Visual Studio további információi párbeszédpanelről.

Az ügyfélkódtár telepítése a NuGettel

  1. Kattintson a jobb gombbal a formRecognizer_quickstart projektre, és válassza a NuGet-csomagok kezelése... lehetőséget.

    Képernyőkép a NuGet-csomag kiválasztásáról.

  2. Válassza a Tallózás lapot, és írja be az Azure.AI.FormRecognizer parancsot.

    Képernyőkép a Dokumentumintelligencia-csomag kiválasztása legördülő menüről.

  3. Válassza ki a 3.1.1-es verziót a legördülő menüből, és válassza a Telepítés lehetőséget.

Az alkalmazás összeállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát FormRecognizerClient . Ehhez létre kell hoznia egy AzureKeyCredential kulcsot és egy példányt FormRecognizerClient a dokumentumintelligencia és a AzureKeyCredential dokumentumintelligencia endpointhasználatával.

Feljegyzés

  • A .NET 6-tól kezdve a console sablont használó új projektek új programstílust hoznak létre, amely eltér a korábbi verzióktól.
  • Az új kimenet a legutóbbi C#-funkciókat használja, amelyek leegyszerűsítik az írandó kódot.
  • Az újabb verzió használatakor csak a metódus törzsét Main kell megírnia. Nem kell felső szintű utasításokat, globális irányelveket vagy implicit irányelveket használnia.
  • További információ: Új C#-sablonok legfelső szintű utasítások létrehozása.
  1. Nyissa meg a Program.cs fájlt.

  2. Adja meg az alábbi irányelveket:

using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
  1. Állítsa be a környezeti és a endpoint környezeti változókat, és hozza létre a saját és FormRecognizerClient a példányátAzureKeyCredential:key
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. Törölje a sort, Console.Writeline("Hello World!"); és adja hozzá a Try It kódmintákat Program.cs fájlhoz:

    Képernyőkép a mintakód fő metódushoz való hozzáadásáról.

  2. Válasszon ki egy kódmintát az alkalmazás fő metódusába való másoláshoz és beillesztéshez:

Fontos

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információkért tekintse meg az Azure AI-szolgáltatások biztonsági cikkét.

Próbálja ki: Elrendezési modell

Szöveg, kijelölési jelek, szövegstílusok és táblázatstruktúrák kinyerése a dokumentumokból a határolórégió koordinátáival együtt.

  • Ebben a példában egy URI-fájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
  • Hozzáadtuk a fájl URI-értékét a formUri változóhoz.
  • Ha ki szeretné nyerni az elrendezést egy adott fájlból egy URI-n, használja a metódust StartRecognizeContentFromUriAsync .

Adja hozzá a következő kódot az elrendezési alkalmazáshoz Program.cs fájlhoz:


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

Próbálja ki: Előre összeállított modell

Ez a minta bemutatja, hogyan elemezhet adatokat bizonyos típusú gyakori dokumentumokból előre betanított modellekkel, például számla használatával.

  • Ebben a példában egy előre összeállított modellel elemezünk egy számladokumentumot. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
  • Hozzáadtuk a fájl URI-értékét a invoiceUri Fő metódus tetején található változóhoz.
  • Ha egy adott fájlt egy URI-n szeretne elemezni, használja a metódust StartRecognizeInvoicesFromUriAsync .
  • Az egyszerűség kedvéért a szolgáltatás által visszaadott összes mező nem jelenik meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.

Előre összeállított modell kiválasztása

Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. Az elemzési művelethez használandó modell az elemezni kívánt dokumentum típusától függ. A Document Intelligence szolgáltatás jelenleg az alábbi előre összeállított modelleket támogatja:

  • Számla: a számlákból kinyeri a szöveget, a kijelölési jeleket, a táblákat, a mezőket és a kulcsadatokat.
  • Nyugta: szöveges és kulcsinformációkat nyer ki a nyugtákból.
  • Személyazonosító okmány: a vezetői engedélyekből és a nemzetközi útlevelekből kinyeri a szöveget és a kulcsadatokat.
  • Névjegykártya: kinyeri a névjegykártyák szövegét és kulcsadatait.

Adja hozzá az alábbi kódot az előre összeállított számlaalkalmazáshoz Program.cs fájlmetódushoz

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

Az alkalmazás futtatása

A program létrehozásához és futtatásához válassza a zöld Start gombot a formRecognizer_quickstart mellett, vagy nyomja le az F5 billentyűt.

Képernyőkép a Visual Studio-program futtatásáról.

Referenciadokumentáció Kódtár forráskódcsomagja | (Maven)Minták | |

Ebben a rövid útmutatóban a következő API-k segítségével nyerhet ki strukturált adatokat űrlapokból és dokumentumokból:

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen.

  • A Java Development Kit (JDK) 8-es vagy újabb verziója. További információ: támogatott Java-verziók és frissítési ütemezés.

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Miután megkapta az Azure-előfizetését, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

  • Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:

    Képernyőkép a kulcsok és a végpontok helyéről az Azure Portalon.

Beállítás

Új Gradle-projekt létrehozása

Egy konzolablakban (például parancsmag, PowerShell vagy Bash) hozzon létre egy új könyvtárat az alkalmazáshoz, az úgynevezett form-recognizer-apphoz, és navigáljon hozzá.

mkdir form-recognizer-app && form-recognizer-app
  1. Futtassa a gradle init parancsot a munkakönyvtárból. Ez a parancs alapvető buildfájlokat hoz létre a Gradle számára, beleértve a build.gradle.kts fájlt is, amelyet futásidőben használnak az alkalmazás létrehozásához és konfigurálásához.

    gradle init --type basic
    
  2. Amikor a rendszer kéri, hogy válasszon egy DSL-t, válassza a Kotlin lehetőséget.

  3. Fogadja el az alapértelmezett projektnevet (form-recognizer-app)

Telepítse az ügyfélkódtárat

Ez a rövid útmutató a Gradle függőségkezelőt használja. A Maven Central-adattárban megtalálhatja a többi függőségkezelő ügyfélkódtárát és információit.

A projekt build.gradle.kts fájljában adja meg az ügyfélkódtárat utasításkéntimplementation, valamint a szükséges beépülő modulokat és beállításokat.

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

Java-fájl létrehozása

Futtassa a következő parancsot a munkakönyvtárban:

mkdir -p src/main/java

A következő könyvtárstruktúrát hozza létre:

Képernyőkép az alkalmazás Java-címtárszerkezetéről.

Lépjen a Java könyvtárba, és hozzon létre egy FormRecognizer.java nevű fájlt. Nyissa meg az előnyben részesített szerkesztőben vagy IDE-ben, és adja hozzá a következő csomagdeklarációt és import -utasításokat:

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;

Válasszon ki egy kódmintát az alkalmazás fő módszerének másolásához és beillesztéséhez:

Fontos

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.

Próbálja ki: Elrendezési modell

Szöveg, kijelölési jelek, szövegstílusok és táblázatstruktúrák kinyerése a dokumentumokból a határolórégió koordinátáival együtt.

  • Ebben a példában egy URI-fájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
  • Ha egy adott fájlt egy URI-n szeretne elemezni, a metódust beginRecognizeContentFromUrl fogja használni.
  • Hozzáadtuk a fájl URI-értékét a formUrl fő metódus változóhoz.

Frissítse az alkalmazás FormRecognizer osztályát a következő kóddal (ügyeljen arra, hogy az Azure Portal Document Intelligence-példány értékeivel frissítse a kulcs- és végpontváltozókat):


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

Próbálja ki: Előre összeállított modell

Ez a minta bemutatja, hogyan elemezhet adatokat bizonyos típusú gyakori dokumentumokból előre betanított modellekkel, például számla használatával.

  • Ebben a példában egy előre összeállított modellel elemezünk egy számladokumentumot. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
  • Ha egy adott fájlt egy URI-n szeretne elemezni, a beginRecognizeInvoicesFromUrl .
  • Hozzáadtuk a fájl URI-értékét a invoiceUrl fő metódus változóhoz.
  • Az egyszerűség kedvéért a szolgáltatás által visszaadott összes mező nem jelenik meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.

Előre összeállított modell kiválasztása

Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. Az elemzési művelethez használandó modell az elemezni kívánt dokumentum típusától függ. A Document Intelligence szolgáltatás jelenleg az alábbi előre összeállított modelleket támogatja:

  • Számla: a számlákból kinyeri a szöveget, a kijelölési jeleket, a táblákat, a mezőket és a kulcsadatokat.
  • Nyugta: szöveges és kulcsinformációkat nyer ki a nyugtákból.
  • Személyazonosító okmány: a vezetői engedélyekből és a nemzetközi útlevelekből kinyeri a szöveget és a kulcsadatokat.
  • Névjegykártya: kinyeri a névjegykártyák szövegét és kulcsadatait.

Frissítse az alkalmazás FormRecognizer osztályát a következő kóddal (ügyeljen arra, hogy az Azure Portal Document Intelligence-példány értékeivel frissítse a kulcs- és végpontváltozókat):


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

Az alkalmazás létrehozása és futtatása

Lépjen vissza a fő projektkönyvtárhoz – a form-recognizer-apphoz.

  1. Az alkalmazás létrehozása a build következő paranccsal:
gradle build
  1. Futtassa az alkalmazást a run következő paranccsal:
gradle run

Referenciadokumentáció Kódtár forráskódcsomagja | (npm)Minták | |

Ebben a rövid útmutatóban a következő API-k segítségével nyerhet ki strukturált adatokat űrlapokból és dokumentumokból:

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen.

  • A Visual Studio Code legújabb verziója vagy az ön által előnyben részesített IDE.

  • A Node.js legújabb LTS-verziója

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Miután megkapta az Azure-előfizetését, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

    Tipp.

    Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.

  • Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:

    Képernyőkép a kulcsok és a végpontok helyéről az Azure Portalon.

Beállítás

  1. Hozzon létre egy új Node.js alkalmazást. Egy konzolablakban (pl. cmd, PowerShell vagy Bash) hozzon létre egy új mappát az alkalmazásnak, majd navigáljon oda.

    mkdir form-recognizer-app && cd form-recognizer-app
    
  2. Futtassa az npm init parancsot egy Node-alkalmazás package.json fájllal való létrehozásához.

    npm init
    
  3. Telepítse az ügyféloldali ai-form-recognizer kódtár npm-csomagjait:

    npm install @azure/ai-form-recognizer
    

    Az alkalmazás fájlja package.json frissül a függőségekkel.

  4. Hozzon létre egy fájlt, index.jsnyissa meg, és importálja a következő kódtárakat:

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. Változók létrehozása az erőforrás Azure-végpontjához és kulcsához:

    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    
  6. Ezen a ponton a JavaScript-alkalmazásnak a következő kódsorokat kell tartalmaznia:

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

Válasszon ki egy kódmintát az alkalmazásba való másoláshoz és beillesztéshez:

Fontos

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.

Próbálja ki: Elrendezési modell

  • Ebben a példában egy URI-fájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
  • Hozzáadtuk a fájl URI-értékét a formUrl fájl tetején található változóhoz.
  • Ha egy adott fájlt egy URI-n szeretne elemezni, a metódust beginRecognizeContent fogja használni.

Adja hozzá a következő kódot az elrendezési alkalmazáshoz a változó alatti key sorban

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

Próbálja ki: Előre összeállított modell

Ez a minta bemutatja, hogyan elemezhet adatokat bizonyos típusú gyakori dokumentumokból előre betanított modellekkel, például számla használatával. A számlamezők teljes listájának megtekintéséhez tekintse meg előre összeállított koncepcióoldalunkat

  • Ebben a példában egy előre összeállított modellel elemezünk egy számladokumentumot. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
  • Hozzáadtuk a fájl URI-értékét a invoiceUrl fájl tetején lévő változóhoz.
  • Ha egy adott fájlt egy URI-n szeretne elemezni, a metódust beginRecognizeInvoices fogja használni.
  • Az egyszerűség kedvéért a szolgáltatás által visszaadott összes mező nem jelenik meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.

Előre összeállított modell kiválasztása

Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. Az elemzési művelethez használandó modell az elemezni kívánt dokumentum típusától függ. A Document Intelligence szolgáltatás jelenleg az alábbi előre összeállított modelleket támogatja:

  • Számla: a számlákból kinyeri a szöveget, a kijelölési jeleket, a táblákat, a mezőket és a kulcsadatokat.
  • Nyugta: szöveges és kulcsinformációkat nyer ki a nyugtákból.
  • Személyazonosító okmány: a vezetői engedélyekből és a nemzetközi útlevelekből kinyeri a szöveget és a kulcsadatokat.
  • Névjegykártya: kinyeri a névjegykártyák szövegét és kulcsadatait.

Adja hozzá az alábbi kódot az előre összeállított számlaalkalmazáshoz a key változó alatt


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

Referenciadokumentáció Kódtár forráskódcsomagja | (PyPi) | -minták |

Ebben a rövid útmutatóban a következő API-k segítségével nyerhet ki strukturált adatokat űrlapokból és dokumentumokból:

Előfeltételek

  • Azure-előfizetés – Ingyenes létrehozás

  • Python 3.x

    • A Python-telepítésnek tartalmaznia kell a pipet. A parancssorban való futtatással pip --version ellenőrizheti, hogy telepítve van-e a pip. Kérje le a pipet a Python legújabb verziójának telepítésével.
  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Miután megkapta az Azure-előfizetését, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

    Tipp.

    Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.

  • Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:

    Képernyőkép a kulcsok és a végpontok helyéről az Azure Portalon.

Beállítás

Nyisson meg egy terminálablakot a helyi környezetben, és telepítse a Pythonhoz készült Azure AI Document Intelligence ügyféloldali kódtárat pip használatával:

pip install azure-ai-formrecognizer

Új Python-alkalmazás létrehozása

Hozzon létre egy form_recognizer_quickstart.py nevű új Python-alkalmazást az előnyben részesített szerkesztőben vagy IDE-ben. Ezután importálja a következő kódtárakat:

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

Változók létrehozása az Azure-erőforrásvégponthoz és -kulcshoz

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

Ezen a ponton a Python-alkalmazásnak a következő kódsorokat kell tartalmaznia:

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"

Válasszon ki egy kódmintát az alkalmazásba való másoláshoz és beillesztéshez:

Fontos

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.

Próbálja ki: Elrendezési modell

  • Ebben a példában egy URI-fájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
  • Hozzáadtuk a fájl URI-értékét a formUrl fájl tetején található változóhoz.
  • Ha egy adott fájlt egy URI-n szeretne elemezni, a metódust begin_recognize_content_from_url fogja használni.

Adja hozzá a következő kódot az elrendezési alkalmazáshoz a változó alatti key sorban


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

Próbálja ki: Előre összeállított modell

Ez a minta bemutatja, hogyan elemezhet adatokat bizonyos típusú gyakori dokumentumokból előre betanított modellekkel, például számla használatával. A számlamezők teljes listájának megtekintéséhez tekintse meg előre összeállított koncepcióoldalunkat

  • Ebben a példában egy előre összeállított modellel elemezünk egy számladokumentumot. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
  • Hozzáadtuk a fájl URI-értékét a fájl tetején található "formUrl" változóhoz.
  • Ha egy adott fájlt egy URI-n szeretne elemezni, használja a "begin_recognize_invoices_from_url" metódust.
  • Az egyszerűség kedvéért a szolgáltatás által visszaadott összes mező nem jelenik meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.

Előre összeállított modell kiválasztása

Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. Az elemzési művelethez használandó modell az elemezni kívánt dokumentum típusától függ. A Document Intelligence szolgáltatás jelenleg az alábbi előre összeállított modelleket támogatja:

  • Számla: a számlákból kinyeri a szöveget, a kijelölési jeleket, a táblákat, a mezőket és a kulcsadatokat.
  • Nyugta: szöveges és kulcsinformációkat nyer ki a nyugtákból.
  • Személyazonosító okmány: a vezetői engedélyekből és a nemzetközi útlevelekből kinyeri a szöveget és a kulcsadatokat.
  • Névjegykártya: kinyeri a névjegykártyák szövegét és kulcsadatait.

Adja hozzá az alábbi kódot az előre összeállított számlaalkalmazáshoz a key változó alatt


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

Az alkalmazás futtatása

  1. Lépjen arra a mappára, ahol a form_recognizer_quickstart.py fájl található.

  2. Írja be a következő parancsot a terminálba:

python form_recognizer_quickstart.py

| Document Intelligence REST API | Azure REST API-referencia |

Ebben a rövid útmutatóban a következő API-k segítségével nyerhet ki strukturált adatokat űrlapokból és dokumentumokból:

Előfeltételek

  • Azure-előfizetés – Ingyenes létrehozás

  • a cURL telepítve van.

  • PowerShell 6.0-s vagy hasonló parancssori alkalmazás.

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Miután megkapta az Azure-előfizetését, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

    Tipp.

    Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.

  • Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:

    Képernyőkép a kulcsok és a végpontok helyéről az Azure Portalon.

Válasszon ki egy kódmintát az alkalmazásba való másoláshoz és beillesztéshez:

Fontos

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.

Próbálja ki: Elrendezési modell

  • Ebben a példában egy URI-fájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
  1. Cserélje le {endpoint} a dokumentumintelligencia-előfizetéssel beszerzett végpontra.
  2. Cserélje le {key} az előző lépésből kimásolt kulccsal.
  3. Cserélje le \"{your-document-url} egy mintadokumentum URL-címére:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf

Kérés

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

Művelet helye

Egy műveleti hely fejlécet tartalmazó választ kap202 (Success). A fejléc értéke tartalmaz egy eredményazonosítót, amellyel lekérdezheti az aszinkron művelet állapotát, és lekérheti az eredményeket:

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

Az alábbi példában az URL-cím részeként a következő analyzeResults/ sztring az eredményazonosító.

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

Elrendezési eredmények lekérése

Miután meghívta az Elemzési elrendezés API-t, meghívja az Elemzési elrendezés eredménye API-t a művelet állapotának és a kinyert adatok lekéréséhez. A parancs futtatása előtt végezze el a következő módosításokat:

  1. Cserélje le {endpoint} a dokumentumintelligencia-előfizetéssel beszerzett végpontra.
  2. Cserélje le {key} az előző lépésből kimásolt kulccsal.
  3. Cserélje le {resultId} az előző lépés eredményazonosítóját.

Kérés

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

Az eredmények vizsgálata

JSON-tartalommal rendelkező választ kap 200 (success) .

Tekintse meg a következő számlarendszerképet és annak megfelelő JSON-kimenetét.

  • A "readResults" csomópont minden olyan szövegsort tartalmaz, amelynek a megfelelő határolókerete az oldalon van elhelyezve.
  • A selectionMarks csomópont minden kijelölési jelet (jelölőnégyzetet, választójelet) és annak állapotát selected unselectedvagy állapotát jeleníti meg.
  • A "pageResults" szakasz tartalmazza a kinyert táblákat. Minden táblázathoz ki lesz nyerve a szöveg, a sor és az oszlopindex, a sor- és oszlopfedés, a határolókeret és egyebek.

Contoso project statement document with a table.

Választörzs

A teljes mintakimenet megtekinthető a GitHubon.

Próbálja ki: Előre összeállított modell

  • Ebben a példában egy előre összeállított modellel elemezünk egy számladokumentumot. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.

Előre összeállított modell kiválasztása

Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. Az elemzési művelethez használandó modell az elemezni kívánt dokumentum típusától függ. A Document Intelligence szolgáltatás jelenleg az alábbi előre összeállított modelleket támogatja:

  • Számla: a számlákból kinyeri a szöveget, a kijelölési jeleket, a táblákat, a mezőket és a kulcsadatokat.
  • Nyugta: szöveges és kulcsinformációkat nyer ki a nyugtákból.
  • Személyazonosító okmány: a vezetői engedélyekből és a nemzetközi útlevelekből kinyeri a szöveget és a kulcsadatokat.
  • Névjegykártya: kinyeri a névjegykártyák szövegét és kulcsadatait.

A parancs futtatása előtt végezze el a következő módosításokat:

  1. Cserélje le {endpoint} a dokumentumintelligencia-előfizetéssel beszerzett végpontra.

  2. Cserélje le {key} az előző lépésből kimásolt kulccsal.

  3. Cserélje le \"{your-document-url} egy minta számla URL-címére:

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

Kérés

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

Művelet helye

Egy műveleti hely fejlécet tartalmazó választ kap202 (Success). A fejléc értéke tartalmaz egy eredményazonosítót, amellyel lekérdezheti az aszinkron művelet állapotát, és lekérheti az eredményeket:

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

Az alábbi példában az URL-cím részeként a következő analyzeResults/ sztring az eredményazonosító:

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

Számlaeredmények lekérése

Miután meghívta az Analyze Invoice API-t, meghívja a Számlaeredmény elemzése API-t a művelet állapotának és a kinyert adatok lekéréséhez. A parancs futtatása előtt végezze el a következő módosításokat:

  1. Cserélje le {endpoint} a dokumentumintelligencia-kulccsal beszerzett végpontra. A dokumentumintelligencia-erőforrás Áttekintés lapján található.
  2. Cserélje le {resultId} az előző lépés eredményazonosítóját.
  3. Írja felül a {key} változót a saját kulcsával.

Kérés

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

A válasz vizsgálata

JSON-kimenettel rendelkező választ kap 200 (Success) .

  • A "readResults" mező a számlából kinyert összes szövegsort tartalmazza.
  • Tartalmazza "pageResults" a számlából kinyert táblákat és kijelölési jeleket.
  • A "documentResults" mező a számla legrelevánsabb részeinek kulcs-érték adatait tartalmazza.

Tekintse meg a számlamintát.

Választörzs

Tekintse meg a teljes mintakimenetet a GitHubon.

Ennyi, jól sikerült!

Következő lépések

  • A továbbfejlesztett felhasználói élmény és a fejlett modellminőség érdekében próbálja ki a Document Intelligence Studiót.

    • A Studio támogatja a v2.1 címkével ellátott adatokkal betanított modelleket.

    • A változásnaplók részletes információkat nyújtanak a 3.1-ről a 4.0-s verzióra való migrálásról.