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


Dokumentumintelligencia-modellek használata

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) kék pipa v2.1 (GA)

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

Ez a tartalom a következőre vonatkozik: Sakk v3.0 (GA) | Legújabb verziók:lila pipa v4.0 (előzetes verzió) lila pipa v3.1 | Korábbi verzió: kék pipa 2.1-es verzió

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

Ebben az útmutatóban megtudhatja, hogyan adhat hozzá dokumentumintelligencia-modelleket az alkalmazásokhoz és munkafolyamatokhoz. Használjon egy tetszőleges programozási nyelvű SDK-t vagy a REST API-t.

Az Azure AI-dokumentumintelligencia egy felhőalapú Azure AI-szolgáltatás, amely gépi tanulással kinyeri a kulcsfontosságú szövegeket és szerkezeti elemeket a dokumentumokból. 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.

Válasszon a következő Dokumentumintelligencia-modellek közül, és elemezze és nyerje ki az adatokat és értékeket űrlapokból és dokumentumokból:

  • Az előre összeállított olvasási modell az összes Dokumentumintelligencia-modell középpontjában áll, és képes észlelni a vonalakat, szavakat, helyeket és nyelveket. Az elrendezés, az általános dokumentum, az előre összeállított és az egyéni modellek mind a modellt használják a read szövegek dokumentumokból való kinyerése alapjául.

  • Az előre összeállított elrendezési modell szöveg- és szöveghelyeket, táblázatokat, kijelölési jeleket és szerkezeti információkat nyer ki a dokumentumokból és képekből. Kulcs-érték párokat az elrendezési modell használatával nyerhet ki, és engedélyezve van a választható lekérdezési sztringparaméter features=keyValuePairs .

  • Az előre összeállított szerződési modell kulcsfontosságú információkat nyer ki a szerződéses szerződésekből.

  • A prebuilt-healthInsuranceCard.us modell kulcsfontosságú információkat nyer ki az EGYESÜLT Államok egészségbiztosítási kártyáiból.

  • Az előre összeállított adódokumentummodell-modell kinyeri az egyesült államokbeli adózási űrlapokon jelentett információkat.

  • Az előre összeállított számlamodell különböző formátumokban és minőségben nyeri ki a kulcsmezőket és a sorelemeket az értékesítési számlákból. A mezők közé tartoznak a telefonon rögzített képek, a beolvasott dokumentumok és a digitális PDF-fájlok.

  • Az előre összeállított nyugtamodell a nyomtatott és kézzel írt értékesítési nyugtákból nyeri ki a kulcsadatokat.

  • Az előre összeállított idDocument modell kulcsfontosságú információkat nyer ki az egyesült államokbeli jogosítványokból, a nemzetközi útlevél-életrajzi oldalakról, az USA államigazolványairól, a társadalombiztosítási kártyákról és az állandó rezidens kártyákról.

Ügyfélkódtár SDK-referencia | REST API-referenciacsomagminták| | | támogatott REST API-verziója |

Előfeltételek

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

  • A Visual Studio IDE.

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos szolgáltatást. 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 alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

  • Dokumentumfájl URL-címen. Ebben a projektben az alábbi táblázatban szereplő mintaűrlapokat használhatja az egyes funkciókhoz:

    Szolgáltatás modelID dokumentum url-címe
    Modell olvasása előre összeállított olvasás Minta brosúra
    Elrendezési modell előre összeállított elrendezés Foglalási visszaigazolás mintája
    W-2 űrlapmodell prebuilt-tax.us.w2 W-2 mintaűrlap
    Számlamodell előre összeállított számla Mintaszámla
    Nyugtamodell előre összeállított nyugta Minta nyugta
    Azonosító dokumentummodell előre összeállított-idDocument Mintaazonosító dokumentum

Környezeti változók beállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez példányosíthatja az ügyfelet az Ön key és endpoint az Azure Portal használatával. Ebben a projektben környezeti változókkal tárolhatja és érheti el a hitelesítő adatokat.

Fontos

HA API-kulcsot használ, biztonságosan tárolja valahol máshol, például az Azure Key Vaultban. Ne foglalja bele közvetlenül az API-kulcsot a kódba, és soha ne tegye közzé nyilvánosan.

Az AI-szolgáltatások biztonságáról további információt az Azure AI-szolgáltatásokhoz érkező kérelmek hitelesítése című témakörben talál.

A Dokumentumintelligencia erőforráskulcs környezeti változójának beállításához nyisson meg egy konzolablakot, és kövesse az operációs rendszer és a fejlesztési környezet utasításait. Cserélje le aKey> és <a YourEndpoint> értékét az azure portalon található erőforrás értékeire.<

A Windows környezeti változói nem érzékenyek a kis- és nagybetűkre. Ezek általában nagybetűvel vannak deklarálva, aláhúzással összekapcsolt szavakkal. A parancssorban futtassa a következő parancsokat:

  1. Állítsa be a kulcsváltozót:

    setx DI_KEY <yourKey>
    
  2. A végpontváltozó beállítása

    setx DI_ENDPOINT <yourEndpoint>
    
  3. Zárja be a parancssori ablakot a környezeti változók beállítása után. Az értékek mindaddig megmaradnak, amíg újra nem módosítja őket.

  4. Indítsa újra a környezeti változót olvasó futó programokat. Ha például a Visual Studio-t vagy a Visual Studio Code-ot használja szerkesztőként, indítsa újra a mintakód futtatása előtt.

Íme néhány hasznosabb parancs a környezeti változókkal való használathoz:

Parancs Művelet Példa
setx VARIABLE_NAME= Törölje a környezeti változót úgy, hogy az értéket üres sztringre állítja. setx DI_KEY=
setx VARIABLE_NAME=value Környezeti változó értékének beállítása vagy módosítása. setx DI_KEY=<yourKey>
set VARIABLE_NAME Egy adott környezeti változó értékének megjelenítése. set DI_KEY
set Az összes környezeti változó megjelenítése. set

A programozási környezet beállítása

  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 kattintson a Tovább gombra.

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

  4. Az új projekt konfigurálása lap Projekt neve területén adja meg a docIntelligence_app. Ezután válassza a Tovább gombra.

    Képernyőkép a Visual Studio új projektlapjának konfigurálásához.

  5. A További információ lapon 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óoldaláról.

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

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

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

  2. Válassza a Tallózás lapot, és írja be az Azure.AI.FormRecognizer 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.

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

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ó: A C#-konzolalkalmazás sablonja legfelső szintű utasításokat hoz létre.

  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.

  3. Válasszon az alábbi kódminták közül, és másolja/illessze be az alkalmazás Program.cs fájljába:

  4. Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a projekt neve melletti zöld Start gombot 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.

Az Olvasási modell használata

using Azure;
using Azure.AI.DocumentIntelligence;

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
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/rest-api/read.png");

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-read", 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}");
        }
    }
}

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("Detected languages:");

foreach (DocumentLanguage language in result.Languages)
{
    Console.WriteLine($"  Found language with locale'{language.Locale}' with confidence {language.Confidence}.");
}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a modell kimenetétread.

Az Elrendezési modell használata

using Azure;
using Azure.AI.DocumentIntelligence;

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

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

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

AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
    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}'.");
    }
}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az elrendezési modell kimenetét.

Az Általános dokumentummodell használata

using Azure;
using Azure.AI.DocumentIntelligence;

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

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

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

AnalyzeResult result = operation.Value;

Console.WriteLine("Detected key-value pairs:");

foreach (DocumentKeyValuePair kvp in result.KeyValuePairs)
{
    if (kvp.Value == null)
    {
        Console.WriteLine($"  Found key with no value: '{kvp.Key.Content}'");
    }
    else
    {
        Console.WriteLine($"  Found key-value pair: '{kvp.Key.Content}' and '{kvp.Value.Content}'");
    }
}

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

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az általános dokumentummodell kimenetét.

A W-2 adómodell használata


using Azure;
using Azure.AI.DocumentIntelligence;

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

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

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-tax.us.w2", w2Uri);

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("AdditionalInfo", out DocumentField? additionalInfoField))
    {
        if (additionalInfoField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField infoField in additionalInfoField.Value.AsList())
            {
                Console.WriteLine("AdditionalInfo:");

                if (infoField.FieldType == DocumentFieldType.Dictionary)
                {
                    IReadOnlyDictionary<string, DocumentField> infoFields = infoField.Value.AsDictionary();

                    if (infoFields.TryGetValue("Amount", out DocumentField? amountField))
                    {
                        if (amountField.FieldType == DocumentFieldType.Double)
                        {
                            double amount = amountField.Value.AsDouble();

                            Console.WriteLine($"  Amount: '{amount}', with confidence {amountField.Confidence}");
                        }
                    }

                    if (infoFields.TryGetValue("LetterCode", out DocumentField? letterCodeField))
                    {
                        if (letterCodeField.FieldType == DocumentFieldType.String)
                        {
                            string letterCode = letterCodeField.Value.AsString();

                            Console.WriteLine($"  LetterCode: '{letterCode}', with confidence {letterCodeField.Confidence}");
                        }
                    }
                }
            }
        }
    }


    if (document.Fields.TryGetValue("AllocatedTips", out DocumentField? allocatedTipsField))
    {
        if (allocatedTipsField.FieldType == DocumentFieldType.Double)
        {
            double allocatedTips = allocatedTipsField.Value.AsDouble();
            Console.WriteLine($"Allocated Tips: '{allocatedTips}', with confidence {allocatedTipsField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("Employer", out DocumentField? employerField))
    {
        if (employerField.FieldType == DocumentFieldType.Dictionary)
        {
            IReadOnlyDictionary<string, DocumentField> employerFields = employerField.Value.AsDictionary();

            if (employerFields.TryGetValue("Name", out DocumentField? employerNameField))
            {
                if (employerNameField.FieldType == DocumentFieldType.String)
                {
                    string name = employerNameField.Value.AsString();

                    Console.WriteLine($"Employer Name: '{name}', with confidence {employerNameField.Confidence}");
                }
            }

            if (employerFields.TryGetValue("IdNumber", out DocumentField? idNumberField))
            {
                if (idNumberField.FieldType == DocumentFieldType.String)
                {
                    string id = idNumberField.Value.AsString();

                    Console.WriteLine($"Employer ID Number: '{id}', with confidence {idNumberField.Confidence}");
                }
            }

            if (employerFields.TryGetValue("Address", out DocumentField? addressField))
            {
                if (addressField.FieldType == DocumentFieldType.Address)
                {
                    Console.WriteLine($"Employer Address: '{addressField.Content}', with confidence {addressField.Confidence}");
                }
            }
        }
    }
}

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a W-2 adómodell kimenetét.

A számlamodell használata

using Azure;
using Azure.AI.DocumentIntelligence;

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

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

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

AnalyzeResult result = operation.Value;

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

    AnalyzedDocument document = result.Documents[i];

    if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField))
    {
        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}");
        }
    }
}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a számlamodell kimenetét.

A Nyugtamodell használata


using Azure;
using Azure.AI.DocumentIntelligence;

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

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

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

AnalyzeResult receipts = operation.Value;

foreach (AnalyzedDocument receipt in receipts.Documents)
{
    if (receipt.Fields.TryGetValue("MerchantName", out DocumentField merchantNameField))
    {
        if (merchantNameField.FieldType == DocumentFieldType.String)
        {
            string merchantName = merchantNameField.Value.AsString();

            Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}");
        }
    }

    if (receipt.Fields.TryGetValue("TransactionDate", out DocumentField transactionDateField))
    {
        if (transactionDateField.FieldType == DocumentFieldType.Date)
        {
            DateTimeOffset transactionDate = transactionDateField.Value.AsDate();

            Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}");
        }
    }

    if (receipt.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("TotalPrice", out DocumentField itemTotalPriceField))
                    {
                        if (itemTotalPriceField.FieldType == DocumentFieldType.Double)
                        {
                            double itemTotalPrice = itemTotalPriceField.Value.AsDouble();

                            Console.WriteLine($"  Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (receipt.Fields.TryGetValue("Total", out DocumentField totalField))
    {
        if (totalField.FieldType == DocumentFieldType.Double)
        {
            double total = totalField.Value.AsDouble();

            Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'");
        }
    }
}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a nyugtamodell kimenetét.

Az azonosító dokumentummodell használata


using Azure;
using Azure.AI.DocumentIntelligence;

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

// sample document document

Uri idDocumentUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png");

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

AnalyzeResult identityDocuments = operation.Value;

AnalyzedDocument identityDocument = identityDocuments.Documents.Single();

if (identityDocument.Fields.TryGetValue("Address", out DocumentField addressField))
{
    if (addressField.FieldType == DocumentFieldType.String)
    {
        string address = addressField.Value. AsString();
        Console.WriteLine($"Address: '{address}', with confidence {addressField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("CountryRegion", out DocumentField countryRegionField))
{
    if (countryRegionField.FieldType == DocumentFieldType.CountryRegion)
    {
        string countryRegion = countryRegionField.Value.AsCountryRegion();
        Console.WriteLine($"CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DateOfBirth", out DocumentField dateOfBirthField))
{
    if (dateOfBirthField.FieldType == DocumentFieldType.Date)
    {
        DateTimeOffset dateOfBirth = dateOfBirthField.Value.AsDate();
        Console.WriteLine($"Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DateOfExpiration", out DocumentField dateOfExpirationField))
{
    if (dateOfExpirationField.FieldType == DocumentFieldType.Date)
    {
        DateTimeOffset dateOfExpiration = dateOfExpirationField.Value.AsDate();
        Console.WriteLine($"Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DocumentNumber", out DocumentField documentNumberField))
{
    if (documentNumberField.FieldType == DocumentFieldType.String)
    {
        string documentNumber = documentNumberField.Value.AsString();
        Console.WriteLine($"Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("FirstName", out DocumentField firstNameField))
{
    if (firstNameField.FieldType == DocumentFieldType.String)
    {
        string firstName = firstNameField.Value.AsString();
        Console.WriteLine($"First Name: '{firstName}', with confidence {firstNameField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("LastName", out DocumentField lastNameField))
{
    if (lastNameField.FieldType == DocumentFieldType.String)
    {
        string lastName = lastNameField.Value.AsString();
        Console.WriteLine($"Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("Region", out DocumentField regionfield))
{
    if (regionfield.FieldType == DocumentFieldType.String)
    {
        string region = regionfield.Value.AsString();
        Console.WriteLine($"Region: '{region}', with confidence {regionfield.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("Sex", out DocumentField sexfield))
{
    if (sexfield.FieldType == DocumentFieldType.String)
    {
        string sex = sexfield.Value.AsString();
        Console.WriteLine($"Sex: '{sex}', with confidence {sexfield.Confidence}");
    }
}

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg az azonosító dokumentummodell kimenetét.

Előfeltételek

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

  • A Visual Studio IDE.

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos szolgáltatást. 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 alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

  • Dokumentumfájl URL-címen. Ebben a projektben az alábbi táblázatban szereplő mintaűrlapokat használhatja az egyes funkciókhoz:

    Szolgáltatás modelID dokumentum url-címe
    Modell olvasása előre összeállított olvasás Minta brosúra
    Elrendezési modell előre összeállított elrendezés Foglalási visszaigazolás mintája
    W-2 űrlapmodell prebuilt-tax.us.w2 W-2 mintaűrlap
    Számlamodell előre összeállított számla Mintaszámla
    Nyugtamodell előre összeállított nyugta Minta nyugta
    Azonosító dokumentummodell előre összeállított-idDocument Mintaazonosító dokumentum
    Névjegykártya-modell előre összeállított-businessCard Névjegykártya minta

Környezeti változók beállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez példányosíthatja az ügyfelet az Ön key és endpoint az Azure Portal használatával. Ebben a projektben környezeti változókkal tárolhatja és érheti el a hitelesítő adatokat.

Fontos

HA API-kulcsot használ, biztonságosan tárolja valahol máshol, például az Azure Key Vaultban. Ne foglalja bele közvetlenül az API-kulcsot a kódba, és soha ne tegye közzé nyilvánosan.

Az AI-szolgáltatások biztonságáról további információt az Azure AI-szolgáltatásokhoz érkező kérelmek hitelesítése című témakörben talál.

A Dokumentumintelligencia erőforráskulcs környezeti változójának beállításához nyisson meg egy konzolablakot, és kövesse az operációs rendszer és a fejlesztési környezet utasításait. Cserélje le aKey> és <a YourEndpoint> értékét az azure portalon található erőforrás értékeire.<

A Windows környezeti változói nem érzékenyek a kis- és nagybetűkre. Ezek általában nagybetűvel vannak deklarálva, aláhúzással összekapcsolt szavakkal. A parancssorban futtassa a következő parancsokat:

  1. Állítsa be a kulcsváltozót:

    setx DI_KEY <yourKey>
    
  2. A végpontváltozó beállítása

    setx DI_ENDPOINT <yourEndpoint>
    
  3. Zárja be a parancssori ablakot a környezeti változók beállítása után. Az értékek mindaddig megmaradnak, amíg újra nem módosítja őket.

  4. Indítsa újra a környezeti változót olvasó futó programokat. Ha például a Visual Studio-t vagy a Visual Studio Code-ot használja szerkesztőként, indítsa újra a mintakód futtatása előtt.

Íme néhány hasznosabb parancs a környezeti változókkal való használathoz:

Parancs Művelet Példa
setx VARIABLE_NAME= Törölje a környezeti változót úgy, hogy az értéket üres sztringre állítja. setx DI_KEY=
setx VARIABLE_NAME=value Környezeti változó értékének beállítása vagy módosítása. setx DI_KEY=<yourKey>
set VARIABLE_NAME Egy adott környezeti változó értékének megjelenítése. set DI_KEY
set Az összes környezeti változó megjelenítése. set

A programozási környezet beállítása

  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 kattintson a Tovább gombra.

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

  4. Az új projekt konfigurálása lap Projekt neve területén adja meg a docIntelligence_app. Ezután válassza a Tovább gombra.

    Képernyőkép a Visual Studio új projektlapjának konfigurálásához.

  5. A További információ lapon 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óoldaláról.

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

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

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

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

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

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

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

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ó: A C#-konzolalkalmazás sablonja legfelső szintű utasításokat hoz létre.

  1. Nyissa meg a Program.cs fájlt.

  2. Törölje a meglévő kódot, beleértve a sort Console.Writeline("Hello World!")is.

  3. Válasszon az alábbi kódminták közül, és másolja/illessze be az alkalmazás Program.cs fájljába:

  4. Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a projekt neve melletti zöld Start gombot 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.

Az Olvasási modell használata

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
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/rest-api/read.png");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-read", 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}");
        }
    }
}

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("Detected languages:");

foreach (DocumentLanguage language in result.Languages)
{
    Console.WriteLine($"  Found language with locale'{language.Locale}' with confidence {language.Confidence}.");
}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a modell kimenetétread.

Az Elrendezési modell használata

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

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

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az elrendezési modell kimenetét.

Az Általános dokumentummodell használata

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document 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-document", fileUri);

AnalyzeResult result = operation.Value;

Console.WriteLine("Detected key-value pairs:");

foreach (DocumentKeyValuePair kvp in result.KeyValuePairs)
{
    if (kvp.Value == null)
    {
        Console.WriteLine($"  Found key with no value: '{kvp.Key.Content}'");
    }
    else
    {
        Console.WriteLine($"  Found key-value pair: '{kvp.Key.Content}' and '{kvp.Value.Content}'");
    }
}

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

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az általános dokumentummodell kimenetét.

A W-2 adómodell használata


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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

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

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-tax.us.w2", w2Uri);

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("AdditionalInfo", out DocumentField? additionalInfoField))
    {
        if (additionalInfoField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField infoField in additionalInfoField.Value.AsList())
            {
                Console.WriteLine("AdditionalInfo:");

                if (infoField.FieldType == DocumentFieldType.Dictionary)
                {
                    IReadOnlyDictionary<string, DocumentField> infoFields = infoField.Value.AsDictionary();

                    if (infoFields.TryGetValue("Amount", out DocumentField? amountField))
                    {
                        if (amountField.FieldType == DocumentFieldType.Double)
                        {
                            double amount = amountField.Value.AsDouble();

                            Console.WriteLine($"  Amount: '{amount}', with confidence {amountField.Confidence}");
                        }
                    }

                    if (infoFields.TryGetValue("LetterCode", out DocumentField? letterCodeField))
                    {
                        if (letterCodeField.FieldType == DocumentFieldType.String)
                        {
                            string letterCode = letterCodeField.Value.AsString();

                            Console.WriteLine($"  LetterCode: '{letterCode}', with confidence {letterCodeField.Confidence}");
                        }
                    }
                }
            }
        }
    }


    if (document.Fields.TryGetValue("AllocatedTips", out DocumentField? allocatedTipsField))
    {
        if (allocatedTipsField.FieldType == DocumentFieldType.Double)
        {
            double allocatedTips = allocatedTipsField.Value.AsDouble();
            Console.WriteLine($"Allocated Tips: '{allocatedTips}', with confidence {allocatedTipsField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("Employer", out DocumentField? employerField))
    {
        if (employerField.FieldType == DocumentFieldType.Dictionary)
        {
            IReadOnlyDictionary<string, DocumentField> employerFields = employerField.Value.AsDictionary();

            if (employerFields.TryGetValue("Name", out DocumentField? employerNameField))
            {
                if (employerNameField.FieldType == DocumentFieldType.String)
                {
                    string name = employerNameField.Value.AsString();

                    Console.WriteLine($"Employer Name: '{name}', with confidence {employerNameField.Confidence}");
                }
            }

            if (employerFields.TryGetValue("IdNumber", out DocumentField? idNumberField))
            {
                if (idNumberField.FieldType == DocumentFieldType.String)
                {
                    string id = idNumberField.Value.AsString();

                    Console.WriteLine($"Employer ID Number: '{id}', with confidence {idNumberField.Confidence}");
                }
            }

            if (employerFields.TryGetValue("Address", out DocumentField? addressField))
            {
                if (addressField.FieldType == DocumentFieldType.Address)
                {
                    Console.WriteLine($"Employer Address: '{addressField.Content}', with confidence {addressField.Confidence}");
                }
            }
        }
    }
}

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a W-2 adómodell kimenetét.

A számlamodell használata

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document document
Uri invoiceUri = new Uri("https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/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}");
        }
    }
}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a számlamodell kimenetét.

A Nyugtamodell használata


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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

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

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

AnalyzeResult receipts = operation.Value;

foreach (AnalyzedDocument receipt in receipts.Documents)
{
    if (receipt.Fields.TryGetValue("MerchantName", out DocumentField merchantNameField))
    {
        if (merchantNameField.FieldType == DocumentFieldType.String)
        {
            string merchantName = merchantNameField.Value.AsString();

            Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}");
        }
    }

    if (receipt.Fields.TryGetValue("TransactionDate", out DocumentField transactionDateField))
    {
        if (transactionDateField.FieldType == DocumentFieldType.Date)
        {
            DateTimeOffset transactionDate = transactionDateField.Value.AsDate();

            Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}");
        }
    }

    if (receipt.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("TotalPrice", out DocumentField itemTotalPriceField))
                    {
                        if (itemTotalPriceField.FieldType == DocumentFieldType.Double)
                        {
                            double itemTotalPrice = itemTotalPriceField.Value.AsDouble();

                            Console.WriteLine($"  Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (receipt.Fields.TryGetValue("Total", out DocumentField totalField))
    {
        if (totalField.FieldType == DocumentFieldType.Double)
        {
            double total = totalField.Value.AsDouble();

            Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'");
        }
    }
}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a nyugtamodell kimenetét.

Azonosító dokumentummodell


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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document document

Uri idDocumentUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png");

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

AnalyzeResult identityDocuments = operation.Value;

AnalyzedDocument identityDocument = identityDocuments.Documents.Single();

if (identityDocument.Fields.TryGetValue("Address", out DocumentField addressField))
{
    if (addressField.FieldType == DocumentFieldType.String)
    {
        string address = addressField.Value. AsString();
        Console.WriteLine($"Address: '{address}', with confidence {addressField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("CountryRegion", out DocumentField countryRegionField))
{
    if (countryRegionField.FieldType == DocumentFieldType.CountryRegion)
    {
        string countryRegion = countryRegionField.Value.AsCountryRegion();
        Console.WriteLine($"CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DateOfBirth", out DocumentField dateOfBirthField))
{
    if (dateOfBirthField.FieldType == DocumentFieldType.Date)
    {
        DateTimeOffset dateOfBirth = dateOfBirthField.Value.AsDate();
        Console.WriteLine($"Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DateOfExpiration", out DocumentField dateOfExpirationField))
{
    if (dateOfExpirationField.FieldType == DocumentFieldType.Date)
    {
        DateTimeOffset dateOfExpiration = dateOfExpirationField.Value.AsDate();
        Console.WriteLine($"Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DocumentNumber", out DocumentField documentNumberField))
{
    if (documentNumberField.FieldType == DocumentFieldType.String)
    {
        string documentNumber = documentNumberField.Value.AsString();
        Console.WriteLine($"Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("FirstName", out DocumentField firstNameField))
{
    if (firstNameField.FieldType == DocumentFieldType.String)
    {
        string firstName = firstNameField.Value.AsString();
        Console.WriteLine($"First Name: '{firstName}', with confidence {firstNameField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("LastName", out DocumentField lastNameField))
{
    if (lastNameField.FieldType == DocumentFieldType.String)
    {
        string lastName = lastNameField.Value.AsString();
        Console.WriteLine($"Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("Region", out DocumentField regionfield))
{
    if (regionfield.FieldType == DocumentFieldType.String)
    {
        string region = regionfield.Value.AsString();
        Console.WriteLine($"Region: '{region}', with confidence {regionfield.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("Sex", out DocumentField sexfield))
{
    if (sexfield.FieldType == DocumentFieldType.String)
    {
        string sex = sexfield.Value.AsString();
        Console.WriteLine($"Sex: '{sex}', with confidence {sexfield.Confidence}");
    }
}

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg az id-document modell kimenetét.

A névjegykártya-modell használata

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document document
Uri businessCardUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/business-card-english.jpg");

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

AnalyzeResult businessCards = operation.Value;

foreach (AnalyzedDocument businessCard in businessCards.Documents)
{
    if (businessCard.Fields.TryGetValue("ContactNames", out DocumentField ContactNamesField))
    {
        if (ContactNamesField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField contactNameField in ContactNamesField.Value.AsList())
            {
                Console.WriteLine("Contact Name: ");

                if (contactNameField.FieldType == DocumentFieldType.Dictionary)
                {
                    IReadOnlyDictionary<string, DocumentField> contactNameFields = contactNameField.Value.AsDictionary();

                    if (contactNameFields.TryGetValue("FirstName", out DocumentField firstNameField))
                    {
                        if (firstNameField.FieldType == DocumentFieldType.String)
                        {
                            string firstName = firstNameField.Value.AsString();

                            Console.WriteLine($"  First Name: '{firstName}', with confidence {firstNameField.Confidence}");
                        }
                    }

                    if (contactNameFields.TryGetValue("LastName", out DocumentField lastNameField))
                    {
                        if (lastNameField.FieldType == DocumentFieldType.String)
                        {
                            string lastName = lastNameField.Value.AsString();

                            Console.WriteLine($"  Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("JobTitles", out DocumentField jobTitlesFields))
    {
        if (jobTitlesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField jobTitleField in jobTitlesFields.Value.AsList())
            {
                if (jobTitleField.FieldType == DocumentFieldType.String)
                {
                    string jobTitle = jobTitleField.Value.AsString();

                    Console.WriteLine($"Job Title: '{jobTitle}', with confidence {jobTitleField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Departments", out DocumentField departmentFields))
    {
        if (departmentFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField departmentField in departmentFields.Value.AsList())
            {
                if (departmentField.FieldType == DocumentFieldType.String)
                {
                    string department = departmentField.Value.AsString();

                    Console.WriteLine($"Department: '{department}', with confidence {departmentField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Emails", out DocumentField emailFields))
    {
        if (emailFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField emailField in emailFields.Value.AsList())
            {
                if (emailField.FieldType == DocumentFieldType.String)
                {
                    string email = emailField.Value.AsString();

                    Console.WriteLine($"Email: '{email}', with confidence {emailField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Websites", out DocumentField websiteFields))
    {
        if (websiteFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField websiteField in websiteFields.Value.AsList())
            {
                if (websiteField.FieldType == DocumentFieldType.String)
                {
                    string website = websiteField.Value.AsString();

                    Console.WriteLine($"Website: '{website}', with confidence {websiteField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("MobilePhones", out DocumentField mobilePhonesFields))
    {
        if (mobilePhonesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField mobilePhoneField in mobilePhonesFields.Value.AsList())
            {
                if (mobilePhoneField.FieldType == DocumentFieldType.PhoneNumber)
                {
                    string mobilePhone = mobilePhoneField.Value.AsPhoneNumber();

                    Console.WriteLine($"Mobile phone number: '{mobilePhone}', with confidence {mobilePhoneField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("WorkPhones", out DocumentField workPhonesFields))
    {
        if (workPhonesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField workPhoneField in workPhonesFields.Value.AsList())
            {
                if (workPhoneField.FieldType == DocumentFieldType.PhoneNumber)
                {
                    string workPhone = workPhoneField.Value.AsPhoneNumber();

                    Console.WriteLine($"Work phone number: '{workPhone}', with confidence {workPhoneField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Faxes", out DocumentField faxesFields))
    {
        if (faxesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField faxField in faxesFields.Value.AsList())
            {
                if (faxField.FieldType == DocumentFieldType.PhoneNumber)
                {
                    string fax = faxField.Value.AsPhoneNumber();

                    Console.WriteLine($"Fax phone number: '{fax}', with confidence {faxField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Addresses", out DocumentField addressesFields))
    {
        if (addressesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField addressField in addressesFields.Value.AsList())
            {
                if (addressField.FieldType == DocumentFieldType.String)
                {
                    string address = addressField.Value.AsString();

                    Console.WriteLine($"Address: '{address}', with confidence {addressField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("CompanyNames", out DocumentField companyNamesFields))
    {
        if (companyNamesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField companyNameField in companyNamesFields.Value.AsList())
            {
                if (companyNameField.FieldType == DocumentFieldType.String)
                {
                    string companyName = companyNameField.Value.AsString();

                    Console.WriteLine($"Company name: '{companyName}', with confidence {companyNameField.Confidence}");
                }
            }
        }
    }
}

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a névjegykártya-modell kimenetét.

Ügyfélkódtár SDK-referencia | REST API-referenciacsomag | (Maven) | Minták |támogatott REST API-verzió |

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.

    • 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 Development Kit (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 Code és a Java kódolási csomagját használja VS , 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. Hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos szolgáltatást. 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.

    Hozzon létre egy Azure AI-szolgáltatási erőforrást, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont és kulcs használatával. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Ha Microsoft Entra-hitelesítést kíván használni, egyszolgáltatásos erőforrásra van szüksége.

  • Az alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

  • Dokumentumfájl URL-címen. Ebben a projektben az alábbi táblázatban szereplő mintaűrlapokat használhatja az egyes funkciókhoz:

    Szolgáltatás modelID dokumentum url-címe
    Modell olvasása előre összeállított olvasás Minta brosúra
    Elrendezési modell előre összeállított elrendezés Foglalási visszaigazolás mintája
    W-2 űrlapmodell prebuilt-tax.us.w2 W-2 mintaűrlap
    Számlamodell előre összeállított számla Mintaszámla
    Nyugtamodell előre összeállított nyugta Minta nyugta
    Azonosító dokumentummodell előre összeállított-idDocument Mintaazonosító dokumentum

Környezeti változók beállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez példányosíthatja az ügyfelet az Ön key és endpoint az Azure Portal használatával. Ebben a projektben környezeti változókkal tárolhatja és érheti el a hitelesítő adatokat.

Fontos

HA API-kulcsot használ, biztonságosan tárolja valahol máshol, például az Azure Key Vaultban. Ne foglalja bele közvetlenül az API-kulcsot a kódba, és soha ne tegye közzé nyilvánosan.

Az AI-szolgáltatások biztonságáról további információt az Azure AI-szolgáltatásokhoz érkező kérelmek hitelesítése című témakörben talál.

A Dokumentumintelligencia erőforráskulcs környezeti változójának beállításához nyisson meg egy konzolablakot, és kövesse az operációs rendszer és a fejlesztési környezet utasításait. Cserélje le aKey> és <a YourEndpoint> értékét az azure portalon található erőforrás értékeire.<

A Windows környezeti változói nem érzékenyek a kis- és nagybetűkre. Ezek általában nagybetűvel vannak deklarálva, aláhúzással összekapcsolt szavakkal. A parancssorban futtassa a következő parancsokat:

  1. Állítsa be a kulcsváltozót:

    setx DI_KEY <yourKey>
    
  2. A végpontváltozó beállítása

    setx DI_ENDPOINT <yourEndpoint>
    
  3. Zárja be a parancssori ablakot a környezeti változók beállítása után. Az értékek mindaddig megmaradnak, amíg újra nem módosítja őket.

  4. Indítsa újra a környezeti változót olvasó futó programokat. Ha például a Visual Studio-t vagy a Visual Studio Code-ot használja szerkesztőként, indítsa újra a mintakód futtatása előtt.

Íme néhány hasznosabb parancs a környezeti változókkal való használathoz:

Parancs Művelet Példa
setx VARIABLE_NAME= Törölje a környezeti változót úgy, hogy az értéket üres sztringre állítja. setx DI_KEY=
setx VARIABLE_NAME=value Környezeti változó értékének beállítása vagy módosítása. setx DI_KEY=<yourKey>
set VARIABLE_NAME Egy adott környezeti változó értékének megjelenítése. set DI_KEY
set Az összes környezeti változó megjelenítése. set

A programozási környezet beállítása

A programozási környezet beállításához hozzon létre egy Gradle-projektet, és telepítse az ügyfélkódtárat.

Gradle-projekt létrehozása

  1. Egy konzolablakban hozzon létre egy könyvtárat az alkalmazáshoz doc-intelligence-app néven, és navigáljon hozzá.

    mkdir doc-intelligence-app
    cd doc-intelligence-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. Válassza az Enter lehetőséget az alapértelmezett projektnév, a doc-intelligence-app elfogadásához.

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

Ez a cikk 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.

  1. Nyissa meg a projekt build.gradle.kts fájlját az IDE-ben. Másolja és illessze be a következő kódot az ügyfélkódtár utasításként implementation való belefoglalásához, a szükséges beépülő modulokkal és beállításokkal együtt.

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

Java-alkalmazás létrehozása

A Dokumentumintelligencia szolgáltatással való kommunikációhoz hozza létre 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. A doc-intelligence-app könyvtárban futtassa a következő parancsot:

    mkdir -p src/main/java
    

Ez a parancs 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 DocIntelligence.java nevű fájlt.

    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, majd írja be a következő parancsot: New-Item DocIntelligence.java.

  2. Nyissa meg a DocIntelligence.java fájlt, és válasszon az alábbi kódminták közül, és másolja/illessze be az alkalmazásba:

    • Az előre összeállított olvasási modell az összes Dokumentumintelligencia-modell középpontjában áll, és képes észlelni a vonalakat, szavakat, helyeket és nyelveket. Az elrendezés, az általános dokumentum, az előre összeállított és az egyéni modellek mind a modellt használják a read szövegek dokumentumokból való kinyerése alapjául.
    • Az előre összeállított elrendezési modell szöveg- és szöveghelyeket, táblázatokat, kijelölési jeleket és szerkezeti információkat nyer ki a dokumentumokból és képekből.
    • Az előre összeállított-tax.us.w2 modell kinyeri az USA belső bevételi szolgáltatásának (IRS) adózási űrlapjairól jelentett információkat.
    • Az előre összeállított számlamodell különböző formátumokban nyeri ki a kulcsmezőket és a sorelemeket az értékesítési számlákból.
    • Az előre összeállított nyugtamodell a nyomtatott és kézzel írt értékesítési nyugtákból nyeri ki a kulcsadatokat.
    • Az előre összeállított idDocument modell kulcsfontosságú információkat nyer ki az USA-beli jogosítványokból; nemzetközi útlevél-életrajzi oldalakról; USA-beli államazonosítók; társadalombiztosítási kártyák; és állandó rezidens kártyákat.
  3. Írja be a következő parancsokat:

    gradle build
    gradle run
    

Az Olvasási modell használata

import com.azure.ai.documentintelligence;

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

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


public class DocIntelligence {

  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

//sample document
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png";

String modelId = "prebuilt-read";

SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
  client.beginAnalyzeDocument(modelId, invoiceUrl);;

AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.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.getBoundingPolygon().toString()));

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a modell kimenetétread.

Az Elrendezési modell használata

import com.azure.ai.documentintelligence;

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

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

public class DocIntelligence {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

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

SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
  client.beginAnalyzeDocument(modelId, layoutDocumentUrl);

AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.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.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.getSelectionMarkState().toString(),
      getBoundingCoordinates(documentSelectionMark.getBoundingPolygon()),
      documentSelectionMark.getConfidence()));
});

// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
  DocumentTable documentTables = tables.get(i);
  System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTables.getRowCount(),
    documentTables.getColumnCount());
  documentTables.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(", "));
}

}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az elrendezési modell kimenetét.

Az Általános dokumentummodell használata

import com.azure.ai.documentintelligence;

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

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

public class DocIntelligence {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

//sample document
String generalDocumentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-document";
SyncPoller < OperationResult, AnalyzeResult > analyzeDocumentPoller =
  client.beginAnalyzeDocument(modelId, generalDocumentUrl);

AnalyzeResult analyzeResult = analyzeDocumentPoller.getFinalResult().getAnalyzeResult();;

// pages
analyzeResult.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()));
});

// tables
List < DocumentTable > tab_les = analyzeResult.getTables();
for (int i = 0; i < tab_les.size(); i++) {
  DocumentTable documentTable = tab_les.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();
}

// Key-value pairs
analyzeResult.getKeyValuePairs().forEach(documentKeyValuePair -> {
  System.out.printf("Key content: %s%n", documentKeyValuePair.getKey().getContent());
  System.out.printf("Key content bounding region: %s%n",
    documentKeyValuePair.getKey().getBoundingRegions().toString());

  if (documentKeyValuePair.getValue() != null) {
    System.out.printf("Value content: %s%n", documentKeyValuePair.getValue().getContent());
    System.out.printf("Value content bounding region: %s%n", documentKeyValuePair.getValue().getBoundingRegions().toString());
  }
});

}

}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az általános dokumentummodell kimenetét.

A W-2 adómodell használata

import com.azure.ai.documentintelligence;

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

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

public class DocIntelligence {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

// sample document
String w2Url = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png";
String modelId = "prebuilt-tax.us.w2";

SyncPoller < OperationResult, AnalyzeResult > analyzeW2Poller =
  client.beginAnalyzeDocument(modelId, w2Url);

AnalyzeResult analyzeTaxResult = analyzeW2Poller.getFinalResult().getAnalyzeResult();

for (int i = 0; i < analyzeTaxResult.getDocuments().size(); i++) {
  AnalyzedDocument analyzedTaxDocument = analyzeTaxResult.getDocuments().get(i);
  Map < String, DocumentField > taxFields = analyzedTaxDocument.getFields();
  System.out.printf("----------- Analyzing Document  %d -----------%n", i);
  DocumentField w2FormVariantField = taxFields.get("W2FormVariant");
  if (w2FormVariantField != null) {
    if (DocumentFieldType.STRING == w2FormVariantField.getType()) {
      String merchantName = w2FormVariantField.getValueAsString();
      System.out.printf("Form variant: %s, confidence: %.2f%n",
        merchantName, w2FormVariantField.getConfidence());
    }
  }

  DocumentField employeeField = taxFields.get("Employee");
  if (employeeField != null) {
    System.out.println("Employee Data: ");
    if (DocumentFieldType.MAP == employeeField.getType()) {
      Map < String, DocumentField > employeeDataFieldMap = employeeField.getValueAsMap();
      DocumentField employeeName = employeeDataFieldMap.get("Name");
      if (employeeName != null) {
        if (DocumentFieldType.STRING == employeeName.getType()) {
          String employeesName = employeeName.getValueAsString();
          System.out.printf("Employee Name: %s, confidence: %.2f%n",
            employeesName, employeeName.getConfidence());
        }
      }
      DocumentField employeeAddrField = employeeDataFieldMap.get("Address");
      if (employeeAddrField != null) {
        if (DocumentFieldType.STRING == employeeAddrField.getType()) {
          String employeeAddress = employeeAddrField.getValueAsString();
          System.out.printf("Employee Address: %s, confidence: %.2f%n",
            employeeAddress, employeeAddrField.getConfidence());
        }
      }
    }
  }

  DocumentField employerField = taxFields.get("Employer");
  if (employerField != null) {
    System.out.println("Employer Data: ");
    if (DocumentFieldType.MAP == employerField.getType()) {
      Map < String, DocumentField > employerDataFieldMap = employerField.getValueAsMap();
      DocumentField employerNameField = employerDataFieldMap.get("Name");
      if (employerNameField != null) {
        if (DocumentFieldType.STRING == employerNameField.getType()) {
          String employerName = employerNameField.getValueAsString();
          System.out.printf("Employer Name: %s, confidence: %.2f%n",
            employerName, employerNameField.getConfidence());
        }
      }

      DocumentField employerIDNumberField = employerDataFieldMap.get("IdNumber");
      if (employerIDNumberField != null) {
        if (DocumentFieldType.STRING == employerIDNumberField.getType()) {
          String employerIdNumber = employerIDNumberField.getValueAsString();
          System.out.printf("Employee ID Number: %s, confidence: %.2f%n",
            employerIdNumber, employerIDNumberField.getConfidence());
        }
      }
    }
  }

  DocumentField taxYearField = taxFields.get("TaxYear");
  if (taxYearField != null) {
    if (DocumentFieldType.STRING == taxYearField.getType()) {
      String taxYear = taxYearField.getValueAsString();
      System.out.printf("Tax year: %s, confidence: %.2f%n",
        taxYear, taxYearField.getConfidence());
    }
  }

  DocumentField taxDateField = taxFields.get("TaxDate");
  if (taxDateField != null) {
    if (DocumentFieldType.DATE == taxDateField.getType()) {
      LocalDate taxDate = taxDateField.getValueAsDate();
      System.out.printf("Tax Date: %s, confidence: %.2f%n",
        taxDate, taxDateField.getConfidence());
    }
  }

  DocumentField socialSecurityTaxField = taxFields.get("SocialSecurityTaxWithheld");
  if (socialSecurityTaxField != null) {
    if (DocumentFieldType.DOUBLE == socialSecurityTaxField.getType()) {
      Double socialSecurityTax = socialSecurityTaxField.getValueAsDouble();
      System.out.printf("Social Security Tax withheld: %.2f, confidence: %.2f%n",
        socialSecurityTax, socialSecurityTaxField.getConfidence());
    }
  }
}
}
}

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a W-2 adómodell kimenetét.

A számlamodell használata

import com.azure.ai.documentintelligence;

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

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

public class DocIntelligence {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

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

SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicesPoller =
  client.beginAnalyzeDocument(modelId, invoiceUrl);

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

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a számlamodell kimenetét.

A Nyugtamodell használata

import com.azure.ai.documentintelligence;

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

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

public class DocIntelligence {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

String receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png";
String modelId = "prebuilt-receipt";

SyncPoller < OperationResult, AnalyzeResult > analyzeReceiptPoller =
  client.beginAnalyzeDocument(modelId, receiptUrl);

AnalyzeResult receiptResults = analyzeReceiptPoller.getFinalResult().getAnalyzeResult();

for (int i = 0; i < receiptResults.getDocuments().size(); i++) {
  AnalyzedDocument analyzedReceipt = receiptResults.getDocuments().get(i);
  Map < String, DocumentField > receiptFields = analyzedReceipt.getFields();
  System.out.printf("----------- Analyzing receipt info %d -----------%n", i);
  DocumentField merchantNameField = receiptFields.get("MerchantName");
  if (merchantNameField != null) {
    if (DocumentFieldType.STRING == merchantNameField.getType()) {
      String merchantName = merchantNameField.getValueAsString();
      System.out.printf("Merchant Name: %s, confidence: %.2f%n",
        merchantName, merchantNameField.getConfidence());
    }
  }

  DocumentField merchantPhoneNumberField = receiptFields.get("MerchantPhoneNumber");
  if (merchantPhoneNumberField != null) {
    if (DocumentFieldType.PHONE_NUMBER == merchantPhoneNumberField.getType()) {
      String merchantAddress = merchantPhoneNumberField.getValueAsPhoneNumber();
      System.out.printf("Merchant Phone number: %s, confidence: %.2f%n",
        merchantAddress, merchantPhoneNumberField.getConfidence());
    }
  }

  DocumentField merchantAddressField = receiptFields.get("MerchantAddress");
  if (merchantAddressField != null) {
    if (DocumentFieldType.STRING == merchantAddressField.getType()) {
      String merchantAddress = merchantAddressField.getValueAsString();
      System.out.printf("Merchant Address: %s, confidence: %.2f%n",
        merchantAddress, merchantAddressField.getConfidence());
    }
  }

  DocumentField transactionDateField = receiptFields.get("TransactionDate");
  if (transactionDateField != null) {
    if (DocumentFieldType.DATE == transactionDateField.getType()) {
      LocalDate transactionDate = transactionDateField.getValueAsDate();
      System.out.printf("Transaction Date: %s, confidence: %.2f%n",
        transactionDate, transactionDateField.getConfidence());
    }
  }

  DocumentField receiptItemsField = receiptFields.get("Items");
  if (receiptItemsField != null) {
    System.out.printf("Receipt Items: %n");
    if (DocumentFieldType.LIST == receiptItemsField.getType()) {
      List < DocumentField > receiptItems = receiptItemsField.getValueAsList();
      receiptItems.stream()
        .filter(receiptItem -> DocumentFieldType.MAP == receiptItem.getType())
        .map(documentField -> documentField.getValueAsMap())
        .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
          if ("Name".equals(key)) {
            if (DocumentFieldType.STRING == documentField.getType()) {
              String name = documentField.getValueAsString();
              System.out.printf("Name: %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 ("Price".equals(key)) {
            if (DocumentFieldType.DOUBLE == documentField.getType()) {
              Double price = documentField.getValueAsDouble();
              System.out.printf("Price: %f, confidence: %.2f%n",
                price, documentField.getConfidence());
            }
          }
          if ("TotalPrice".equals(key)) {
            if (DocumentFieldType.DOUBLE == documentField.getType()) {
              Double totalPrice = documentField.getValueAsDouble();
              System.out.printf("Total Price: %f, confidence: %.2f%n",
                totalPrice, documentField.getConfidence());
            }
          }
        }));
    }
  }
}
}
}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a nyugtamodell kimenetét.

Az azonosító dokumentummodell használata

import com.azure.ai.documentintelligence;

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

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

public class DocIntelligence {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

//sample document
String licenseUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png";
String modelId = "prebuilt-idDocument";

SyncPoller < OperationResult, AnalyzeResult > analyzeIdentityDocumentPoller = client.beginAnalyzeDocument(modelId, licenseUrl);

AnalyzeResult identityDocumentResults = analyzeIdentityDocumentPoller.getFinalResult().getAnalyzeResult();

for (int i = 0; i < identityDocumentResults.getDocuments().size(); i++) {
  AnalyzedDocument analyzedIDDocument = identityDocumentResults.getDocuments().get(i);
  Map < String, DocumentField > licenseFields = analyzedIDDocument.getFields();
  System.out.printf("----------- Analyzed license info for page %d -----------%n", i);
  DocumentField addressField = licenseFields.get("Address");
  if (addressField != null) {
    if (DocumentFieldType.STRING == addressField.getType()) {
      String address = addressField.getValueAsString();
      System.out.printf("Address: %s, confidence: %.2f%n",
        address, addressField.getConfidence());
    }
  }

  DocumentField countryRegionDocumentField = licenseFields.get("CountryRegion");
  if (countryRegionDocumentField != null) {
    if (DocumentFieldType.STRING == countryRegionDocumentField.getType()) {
      String countryRegion = countryRegionDocumentField.getValueAsCountry();
      System.out.printf("Country or region: %s, confidence: %.2f%n",
        countryRegion, countryRegionDocumentField.getConfidence());
    }
  }

  DocumentField dateOfBirthField = licenseFields.get("DateOfBirth");
  if (dateOfBirthField != null) {
    if (DocumentFieldType.DATE == dateOfBirthField.getType()) {
      LocalDate dateOfBirth = dateOfBirthField.getValueAsDate();
      System.out.printf("Date of Birth: %s, confidence: %.2f%n",
        dateOfBirth, dateOfBirthField.getConfidence());
    }
  }

  DocumentField dateOfExpirationField = licenseFields.get("DateOfExpiration");
  if (dateOfExpirationField != null) {
    if (DocumentFieldType.DATE == dateOfExpirationField.getType()) {
      LocalDate expirationDate = dateOfExpirationField.getValueAsDate();
      System.out.printf("Document date of expiration: %s, confidence: %.2f%n",
        expirationDate, dateOfExpirationField.getConfidence());
    }
  }

  DocumentField documentNumberField = licenseFields.get("DocumentNumber");
  if (documentNumberField != null) {
    if (DocumentFieldType.STRING == documentNumberField.getType()) {
      String documentNumber = documentNumberField.getValueAsString();
      System.out.printf("Document number: %s, confidence: %.2f%n",
        documentNumber, documentNumberField.getConfidence());
    }
  }

  DocumentField firstNameField = licenseFields.get("FirstName");
  if (firstNameField != null) {
    if (DocumentFieldType.STRING == firstNameField.getType()) {
      String firstName = firstNameField.getValueAsString();
      System.out.printf("First Name: %s, confidence: %.2f%n",
        firstName, documentNumberField.getConfidence());
    }
  }

  DocumentField lastNameField = licenseFields.get("LastName");
  if (lastNameField != null) {
    if (DocumentFieldType.STRING == lastNameField.getType()) {
      String lastName = lastNameField.getValueAsString();
      System.out.printf("Last name: %s, confidence: %.2f%n",
        lastName, lastNameField.getConfidence());
    }
  }

  DocumentField regionField = licenseFields.get("Region");
  if (regionField != null) {
    if (DocumentFieldType.STRING == regionField.getType()) {
      String region = regionField.getValueAsString();
      System.out.printf("Region: %s, confidence: %.2f%n",
        region, regionField.getConfidence());
    }
  }
}
}
}

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg az azonosító dokumentummodell kimenetét.

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.

    • A Visual Studio Code a Java kódolási csomagját kínálja Windowshoz és macOS-hez. A kódolási csomag a Java Development Kit (JDK) csomagja VS Code, valamint 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 Java kódolási csomagját használja VS Code , 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. Hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos szolgáltatást. 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.

    Hozzon létre egy Azure AI-szolgáltatási erőforrást, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont és kulcs használatával. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Ha Microsoft Entra-hitelesítést kíván használni, egyszolgáltatásos erőforrásra van szüksége.

  • Az alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

  • Dokumentumfájl URL-címen. Ebben a projektben az alábbi táblázatban szereplő mintaűrlapokat használhatja az egyes funkciókhoz:

    Szolgáltatás modelID dokumentum url-címe
    Modell olvasása előre összeállított olvasás Minta brosúra
    Elrendezési modell előre összeállított elrendezés Foglalási visszaigazolás mintája
    W-2 űrlapmodell prebuilt-tax.us.w2 W-2 mintaűrlap
    Számlamodell előre összeállított számla Mintaszámla
    Nyugtamodell előre összeállított nyugta Minta nyugta
    Azonosító dokumentummodell előre összeállított-idDocument Mintaazonosító dokumentum
    Névjegykártya-modell előre összeállított-businessCard Névjegykártya minta

Környezeti változók beállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez példányosíthatja az ügyfelet az Ön key és endpoint az Azure Portal használatával. Ebben a projektben környezeti változókkal tárolhatja és érheti el a hitelesítő adatokat.

Fontos

HA API-kulcsot használ, biztonságosan tárolja valahol máshol, például az Azure Key Vaultban. Ne foglalja bele közvetlenül az API-kulcsot a kódba, és soha ne tegye közzé nyilvánosan.

Az AI-szolgáltatások biztonságáról további információt az Azure AI-szolgáltatásokhoz érkező kérelmek hitelesítése című témakörben talál.

A Dokumentumintelligencia erőforráskulcs környezeti változójának beállításához nyisson meg egy konzolablakot, és kövesse az operációs rendszer és a fejlesztési környezet utasításait. Cserélje le aKey> és <a YourEndpoint> értékét az azure portalon található erőforrás értékeire.<

A Windows környezeti változói nem érzékenyek a kis- és nagybetűkre. Ezek általában nagybetűvel vannak deklarálva, aláhúzással összekapcsolt szavakkal. A parancssorban futtassa a következő parancsokat:

  1. Állítsa be a kulcsváltozót:

    setx DI_KEY <yourKey>
    
  2. A végpontváltozó beállítása

    setx DI_ENDPOINT <yourEndpoint>
    
  3. Zárja be a parancssori ablakot a környezeti változók beállítása után. Az értékek mindaddig megmaradnak, amíg újra nem módosítja őket.

  4. Indítsa újra a környezeti változót olvasó futó programokat. Ha például a Visual Studio-t vagy a Visual Studio Code-ot használja szerkesztőként, indítsa újra a mintakód futtatása előtt.

Íme néhány hasznosabb parancs a környezeti változókkal való használathoz:

Parancs Művelet Példa
setx VARIABLE_NAME= Törölje a környezeti változót úgy, hogy az értéket üres sztringre állítja. setx DI_KEY=
setx VARIABLE_NAME=value Környezeti változó értékének beállítása vagy módosítása. setx DI_KEY=<yourKey>
set VARIABLE_NAME Egy adott környezeti változó értékének megjelenítése. set DI_KEY
set Az összes környezeti változó megjelenítése. set

A programozási környezet beállítása

A programozási környezet beállításához hozzon létre egy Gradle-projektet, és telepítse az ügyfélkódtárat.

Gradle-projekt létrehozása

  1. Egy konzolablakban hozzon létre egy könyvtárat az alkalmazáshoz, amelyet form-recognizer-appnak hívunk, és navigáljon hozzá.

    mkdir form-recognizer-app
    cd form-recognizer-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. Válassza az Enter lehetőséget az alapértelmezett projektnév, a form-recognizer-app elfogadásához.

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

Ez a cikk 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.

  1. Nyissa meg a projekt build.gradle.kts fájlját az IDE-ben. Másolja és illessze be a következő kódot az ügyfélkódtár utasításként implementation való belefoglalásához, a szükséges beépülő modulokkal és beállításokkal együtt.

    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ással való kommunikációhoz hozza létre 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 form-recognizer-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

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

    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, majd írja be a következő parancsot: New-Item FormRecognizer.java.

  3. Nyissa meg a FormRecognizer.java fájlt, és válasszon az alábbi kódminták közül, és másolja/illessze be az alkalmazásba:

    • Az előre összeállított olvasási modell az összes Dokumentumintelligencia-modell középpontjában áll, és képes észlelni a vonalakat, szavakat, helyeket és nyelveket. Az elrendezés, az általános dokumentum, az előre összeállított és az egyéni modellek mind a modellt használják a read szövegek dokumentumokból való kinyerése alapjául.
    • Az előre összeállított elrendezési modell szöveg- és szöveghelyeket, táblázatokat, kijelölési jeleket és szerkezeti információkat nyer ki a dokumentumokból és képekből.
    • Az előre összeállított-tax.us.w2 modell kinyeri az USA belső bevételi szolgáltatásának (IRS) adózási űrlapjairól jelentett információkat.
    • Az előre összeállított számlamodell különböző formátumokban nyeri ki a kulcsmezőket és a sorelemeket az értékesítési számlákból.
    • Az előre összeállított nyugtamodell a nyomtatott és kézzel írt értékesítési nyugtákból nyeri ki a kulcsadatokat.
    • Az előre összeállított idDocument modell kulcsfontosságú információkat nyer ki az USA-beli jogosítványokból; nemzetközi útlevél-életrajzi oldalakról; USA-beli államazonosítók; társadalombiztosítási kártyák; és állandó rezidens kártyákat.
  4. Írja be a következő parancsokat:

    gradle build
    gradle -PmainClass=FormRecognizer run
    

Az Olvasási modell használata

import com.azure.ai.formrecognizer.*;

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

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

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

public class FormRecognizer {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

  public static void main(final 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/rest-api/read.png";

String modelId = "prebuilt-read";

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a modell kimenetétread.

Az Elrendezési modell használata

import com.azure.ai.formrecognizer.*;

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

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

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

public class FormRecognizer {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

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

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

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.getSelectionMarkState().toString(),
      getBoundingCoordinates(documentSelectionMark.getBoundingPolygon()),
      documentSelectionMark.getConfidence()));
});

// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
  DocumentTable documentTables = tables.get(i);
  System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTables.getRowCount(),
    documentTables.getColumnCount());
  documentTables.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(", "));
}

}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az elrendezési modell kimenetét.

Az Általános dokumentummodell használata

import com.azure.ai.formrecognizer.*;

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

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

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

public class FormRecognizer {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

//sample document
String generalDocumentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-document";
SyncPoller < OperationResult, AnalyzeResult > analyzeDocumentPoller =
  client.beginAnalyzeDocumentFromUrl(modelId, generalDocumentUrl);

AnalyzeResult analyzeResult = analyzeDocumentPoller.getFinalResult();

// pages
analyzeResult.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()));
});

// tables
List < DocumentTable > tab_les = analyzeResult.getTables();
for (int i = 0; i < tab_les.size(); i++) {
  DocumentTable documentTable = tab_les.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();
}

// Key-value pairs
analyzeResult.getKeyValuePairs().forEach(documentKeyValuePair -> {
  System.out.printf("Key content: %s%n", documentKeyValuePair.getKey().getContent());
  System.out.printf("Key content bounding region: %s%n",
    documentKeyValuePair.getKey().getBoundingRegions().toString());

  if (documentKeyValuePair.getValue() != null) {
    System.out.printf("Value content: %s%n", documentKeyValuePair.getValue().getContent());
    System.out.printf("Value content bounding region: %s%n", documentKeyValuePair.getValue().getBoundingRegions().toString());
  }
});

}

}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az általános dokumentummodell kimenetét.

A W-2 adómodell használata

import com.azure.ai.formrecognizer.*;

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

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

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

public class FormRecognizer {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

// sample document
String w2Url = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png";
String modelId = "prebuilt-tax.us.w2";

SyncPoller < OperationResult, AnalyzeResult > analyzeW2Poller =
  client.beginAnalyzeDocumentFromUrl(modelId, w2Url);

AnalyzeResult analyzeTaxResult = analyzeW2Poller.getFinalResult();

for (int i = 0; i < analyzeTaxResult.getDocuments().size(); i++) {
  AnalyzedDocument analyzedTaxDocument = analyzeTaxResult.getDocuments().get(i);
  Map < String, DocumentField > taxFields = analyzedTaxDocument.getFields();
  System.out.printf("----------- Analyzing Document  %d -----------%n", i);
  DocumentField w2FormVariantField = taxFields.get("W2FormVariant");
  if (w2FormVariantField != null) {
    if (DocumentFieldType.STRING == w2FormVariantField.getType()) {
      String merchantName = w2FormVariantField.getValueAsString();
      System.out.printf("Form variant: %s, confidence: %.2f%n",
        merchantName, w2FormVariantField.getConfidence());
    }
  }

  DocumentField employeeField = taxFields.get("Employee");
  if (employeeField != null) {
    System.out.println("Employee Data: ");
    if (DocumentFieldType.MAP == employeeField.getType()) {
      Map < String, DocumentField > employeeDataFieldMap = employeeField.getValueAsMap();
      DocumentField employeeName = employeeDataFieldMap.get("Name");
      if (employeeName != null) {
        if (DocumentFieldType.STRING == employeeName.getType()) {
          String employeesName = employeeName.getValueAsString();
          System.out.printf("Employee Name: %s, confidence: %.2f%n",
            employeesName, employeeName.getConfidence());
        }
      }
      DocumentField employeeAddrField = employeeDataFieldMap.get("Address");
      if (employeeAddrField != null) {
        if (DocumentFieldType.STRING == employeeAddrField.getType()) {
          String employeeAddress = employeeAddrField.getValueAsString();
          System.out.printf("Employee Address: %s, confidence: %.2f%n",
            employeeAddress, employeeAddrField.getConfidence());
        }
      }
    }
  }

  DocumentField employerField = taxFields.get("Employer");
  if (employerField != null) {
    System.out.println("Employer Data: ");
    if (DocumentFieldType.MAP == employerField.getType()) {
      Map < String, DocumentField > employerDataFieldMap = employerField.getValueAsMap();
      DocumentField employerNameField = employerDataFieldMap.get("Name");
      if (employerNameField != null) {
        if (DocumentFieldType.STRING == employerNameField.getType()) {
          String employerName = employerNameField.getValueAsString();
          System.out.printf("Employer Name: %s, confidence: %.2f%n",
            employerName, employerNameField.getConfidence());
        }
      }

      DocumentField employerIDNumberField = employerDataFieldMap.get("IdNumber");
      if (employerIDNumberField != null) {
        if (DocumentFieldType.STRING == employerIDNumberField.getType()) {
          String employerIdNumber = employerIDNumberField.getValueAsString();
          System.out.printf("Employee ID Number: %s, confidence: %.2f%n",
            employerIdNumber, employerIDNumberField.getConfidence());
        }
      }
    }
  }

  DocumentField taxYearField = taxFields.get("TaxYear");
  if (taxYearField != null) {
    if (DocumentFieldType.STRING == taxYearField.getType()) {
      String taxYear = taxYearField.getValueAsString();
      System.out.printf("Tax year: %s, confidence: %.2f%n",
        taxYear, taxYearField.getConfidence());
    }
  }

  DocumentField taxDateField = taxFields.get("TaxDate");
  if (taxDateField != null) {
    if (DocumentFieldType.DATE == taxDateField.getType()) {
      LocalDate taxDate = taxDateField.getValueAsDate();
      System.out.printf("Tax Date: %s, confidence: %.2f%n",
        taxDate, taxDateField.getConfidence());
    }
  }

  DocumentField socialSecurityTaxField = taxFields.get("SocialSecurityTaxWithheld");
  if (socialSecurityTaxField != null) {
    if (DocumentFieldType.DOUBLE == socialSecurityTaxField.getType()) {
      Double socialSecurityTax = socialSecurityTaxField.getValueAsDouble();
      System.out.printf("Social Security Tax withheld: %.2f, confidence: %.2f%n",
        socialSecurityTax, socialSecurityTaxField.getConfidence());
    }
  }
}
}
}

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a W-2 adómodell kimenetét.

A számlamodell használata

import com.azure.ai.formrecognizer.*;

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

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

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

public class FormRecognizer {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

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

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

AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.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) -> {
          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());
            }
          }
        }));
    }
  }
}
}
}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a számlamodell kimenetét.

A Nyugtamodell használata

import com.azure.ai.formrecognizer.*;

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

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

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

public class FormRecognizer {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

String receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png";
String modelId = "prebuilt-receipt";

SyncPoller < OperationResult, AnalyzeResult > analyzeReceiptPoller =
  client.beginAnalyzeDocumentFromUrl(modelId, receiptUrl);

AnalyzeResult receiptResults = analyzeReceiptPoller.getFinalResult();

for (int i = 0; i < receiptResults.getDocuments().size(); i++) {
  AnalyzedDocument analyzedReceipt = receiptResults.getDocuments().get(i);
  Map < String, DocumentField > receiptFields = analyzedReceipt.getFields();
  System.out.printf("----------- Analyzing receipt info %d -----------%n", i);
  DocumentField merchantNameField = receiptFields.get("MerchantName");
  if (merchantNameField != null) {
    if (DocumentFieldType.STRING == merchantNameField.getType()) {
      String merchantName = merchantNameField.getValueAsString();
      System.out.printf("Merchant Name: %s, confidence: %.2f%n",
        merchantName, merchantNameField.getConfidence());
    }
  }

  DocumentField merchantPhoneNumberField = receiptFields.get("MerchantPhoneNumber");
  if (merchantPhoneNumberField != null) {
    if (DocumentFieldType.PHONE_NUMBER == merchantPhoneNumberField.getType()) {
      String merchantAddress = merchantPhoneNumberField.getValueAsPhoneNumber();
      System.out.printf("Merchant Phone number: %s, confidence: %.2f%n",
        merchantAddress, merchantPhoneNumberField.getConfidence());
    }
  }

  DocumentField merchantAddressField = receiptFields.get("MerchantAddress");
  if (merchantAddressField != null) {
    if (DocumentFieldType.STRING == merchantAddressField.getType()) {
      String merchantAddress = merchantAddressField.getValueAsString();
      System.out.printf("Merchant Address: %s, confidence: %.2f%n",
        merchantAddress, merchantAddressField.getConfidence());
    }
  }

  DocumentField transactionDateField = receiptFields.get("TransactionDate");
  if (transactionDateField != null) {
    if (DocumentFieldType.DATE == transactionDateField.getType()) {
      LocalDate transactionDate = transactionDateField.getValueAsDate();
      System.out.printf("Transaction Date: %s, confidence: %.2f%n",
        transactionDate, transactionDateField.getConfidence());
    }
  }

  DocumentField receiptItemsField = receiptFields.get("Items");
  if (receiptItemsField != null) {
    System.out.printf("Receipt Items: %n");
    if (DocumentFieldType.LIST == receiptItemsField.getType()) {
      List < DocumentField > receiptItems = receiptItemsField.getValueAsList();
      receiptItems.stream()
        .filter(receiptItem -> DocumentFieldType.MAP == receiptItem.getType())
        .map(documentField -> documentField.getValueAsMap())
        .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
          if ("Name".equals(key)) {
            if (DocumentFieldType.STRING == documentField.getType()) {
              String name = documentField.getValueAsString();
              System.out.printf("Name: %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 ("Price".equals(key)) {
            if (DocumentFieldType.DOUBLE == documentField.getType()) {
              Double price = documentField.getValueAsDouble();
              System.out.printf("Price: %f, confidence: %.2f%n",
                price, documentField.getConfidence());
            }
          }
          if ("TotalPrice".equals(key)) {
            if (DocumentFieldType.DOUBLE == documentField.getType()) {
              Double totalPrice = documentField.getValueAsDouble();
              System.out.printf("Total Price: %f, confidence: %.2f%n",
                totalPrice, documentField.getConfidence());
            }
          }
        }));
    }
  }
}
}
}

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a nyugtamodell kimenetét.

Az azonosító dokumentummodell használata

import com.azure.ai.formrecognizer.*;

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

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

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

public class FormRecognizer {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

//sample document
String licenseUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png";
String modelId = "prebuilt-idDocument";

SyncPoller < OperationResult, AnalyzeResult > analyzeIdentityDocumentPoller = client.beginAnalyzeDocumentFromUrl(modelId, licenseUrl);

AnalyzeResult identityDocumentResults = analyzeIdentityDocumentPoller.getFinalResult();

for (int i = 0; i < identityDocumentResults.getDocuments().size(); i++) {
  AnalyzedDocument analyzedIDDocument = identityDocumentResults.getDocuments().get(i);
  Map < String, DocumentField > licenseFields = analyzedIDDocument.getFields();
  System.out.printf("----------- Analyzed license info for page %d -----------%n", i);
  DocumentField addressField = licenseFields.get("Address");
  if (addressField != null) {
    if (DocumentFieldType.STRING == addressField.getType()) {
      String address = addressField.getValueAsString();
      System.out.printf("Address: %s, confidence: %.2f%n",
        address, addressField.getConfidence());
    }
  }

  DocumentField countryRegionDocumentField = licenseFields.get("CountryRegion");
  if (countryRegionDocumentField != null) {
    if (DocumentFieldType.STRING == countryRegionDocumentField.getType()) {
      String countryRegion = countryRegionDocumentField.getValueAsCountry();
      System.out.printf("Country or region: %s, confidence: %.2f%n",
        countryRegion, countryRegionDocumentField.getConfidence());
    }
  }

  DocumentField dateOfBirthField = licenseFields.get("DateOfBirth");
  if (dateOfBirthField != null) {
    if (DocumentFieldType.DATE == dateOfBirthField.getType()) {
      LocalDate dateOfBirth = dateOfBirthField.getValueAsDate();
      System.out.printf("Date of Birth: %s, confidence: %.2f%n",
        dateOfBirth, dateOfBirthField.getConfidence());
    }
  }

  DocumentField dateOfExpirationField = licenseFields.get("DateOfExpiration");
  if (dateOfExpirationField != null) {
    if (DocumentFieldType.DATE == dateOfExpirationField.getType()) {
      LocalDate expirationDate = dateOfExpirationField.getValueAsDate();
      System.out.printf("Document date of expiration: %s, confidence: %.2f%n",
        expirationDate, dateOfExpirationField.getConfidence());
    }
  }

  DocumentField documentNumberField = licenseFields.get("DocumentNumber");
  if (documentNumberField != null) {
    if (DocumentFieldType.STRING == documentNumberField.getType()) {
      String documentNumber = documentNumberField.getValueAsString();
      System.out.printf("Document number: %s, confidence: %.2f%n",
        documentNumber, documentNumberField.getConfidence());
    }
  }

  DocumentField firstNameField = licenseFields.get("FirstName");
  if (firstNameField != null) {
    if (DocumentFieldType.STRING == firstNameField.getType()) {
      String firstName = firstNameField.getValueAsString();
      System.out.printf("First Name: %s, confidence: %.2f%n",
        firstName, documentNumberField.getConfidence());
    }
  }

  DocumentField lastNameField = licenseFields.get("LastName");
  if (lastNameField != null) {
    if (DocumentFieldType.STRING == lastNameField.getType()) {
      String lastName = lastNameField.getValueAsString();
      System.out.printf("Last name: %s, confidence: %.2f%n",
        lastName, lastNameField.getConfidence());
    }
  }

  DocumentField regionField = licenseFields.get("Region");
  if (regionField != null) {
    if (DocumentFieldType.STRING == regionField.getType()) {
      String region = regionField.getValueAsString();
      System.out.printf("Region: %s, confidence: %.2f%n",
        region, regionField.getConfidence());
    }
  }
}
}
}

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg az azonosító dokumentummodell kimenetét.

A névjegykártya-modell használata

import com.azure.ai.formrecognizer.*;

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

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

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

public class FormRecognizer {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

//sample document
String businessCardUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg";
String modelId = "prebuilt-businessCard";

SyncPoller < OperationResult, AnalyzeResult > analyzeBusinessCardPoller = client.beginAnalyzeDocumentFromUrl(modelId, businessCardUrl);

AnalyzeResult businessCardPageResults = analyzeBusinessCardPoller.getFinalResult();

for (int i = 0; i < businessCardPageResults.getDocuments().size(); i++) {
  System.out.printf("--------Analyzing business card %d -----------%n", i);
  AnalyzedDocument analyzedBusinessCard = businessCardPageResults.getDocuments().get(i);
  Map < String, DocumentField > businessCardFields = analyzedBusinessCard.getFields();
  DocumentField contactNamesDocumentField = businessCardFields.get("ContactNames");
  if (contactNamesDocumentField != null) {
    if (DocumentFieldType.LIST == contactNamesDocumentField.getType()) {
      List < DocumentField > contactNamesList = contactNamesDocumentField.getValueAsList();
      contactNamesList.stream()
        .filter(contactName -> DocumentFieldType.MAP == contactName.getType())
        .map(contactName -> {
          System.out.printf("Contact name: %s%n", contactName.getContent());
          return contactName.getValueAsMap();
        })
        .forEach(contactNamesMap -> contactNamesMap.forEach((key, contactName) -> {
          if ("FirstName".equals(key)) {
            if (DocumentFieldType.STRING == contactName.getType()) {
              String firstName = contactName.getValueAsString();
              System.out.printf("\tFirst Name: %s, confidence: %.2f%n",
                firstName, contactName.getConfidence());
            }
          }
          if ("LastName".equals(key)) {
            if (DocumentFieldType.STRING == contactName.getType()) {
              String lastName = contactName.getValueAsString();
              System.out.printf("\tLast Name: %s, confidence: %.2f%n",
                lastName, contactName.getConfidence());
            }
          }
        }));
    }
  }

  DocumentField jobTitles = businessCardFields.get("JobTitles");
  if (jobTitles != null) {
    if (DocumentFieldType.LIST == jobTitles.getType()) {
      List < DocumentField > jobTitlesItems = jobTitles.getValueAsList();
      jobTitlesItems.forEach(jobTitlesItem -> {
        if (DocumentFieldType.STRING == jobTitlesItem.getType()) {
          String jobTitle = jobTitlesItem.getValueAsString();
          System.out.printf("Job Title: %s, confidence: %.2f%n",
            jobTitle, jobTitlesItem.getConfidence());
        }
      });
    }
  }

  DocumentField departments = businessCardFields.get("Departments");
  if (departments != null) {
    if (DocumentFieldType.LIST == departments.getType()) {
      List < DocumentField > departmentsItems = departments.getValueAsList();
      departmentsItems.forEach(departmentsItem -> {
        if (DocumentFieldType.STRING == departmentsItem.getType()) {
          String department = departmentsItem.getValueAsString();
          System.out.printf("Department: %s, confidence: %.2f%n",
            department, departmentsItem.getConfidence());
        }
      });
    }
  }

  DocumentField emails = businessCardFields.get("Emails");
  if (emails != null) {
    if (DocumentFieldType.LIST == emails.getType()) {
      List < DocumentField > emailsItems = emails.getValueAsList();
      emailsItems.forEach(emailsItem -> {
        if (DocumentFieldType.STRING == emailsItem.getType()) {
          String email = emailsItem.getValueAsString();
          System.out.printf("Email: %s, confidence: %.2f%n", email, emailsItem.getConfidence());
        }
      });
    }
  }

  DocumentField websites = businessCardFields.get("Websites");
  if (websites != null) {
    if (DocumentFieldType.LIST == websites.getType()) {
      List < DocumentField > websitesItems = websites.getValueAsList();
      websitesItems.forEach(websitesItem -> {
        if (DocumentFieldType.STRING == websitesItem.getType()) {
          String website = websitesItem.getValueAsString();
          System.out.printf("Web site: %s, confidence: %.2f%n",
            website, websitesItem.getConfidence());
        }
      });
    }
  }

  DocumentField mobilePhones = businessCardFields.get("MobilePhones");
  if (mobilePhones != null) {
    if (DocumentFieldType.LIST == mobilePhones.getType()) {
      List < DocumentField > mobilePhonesItems = mobilePhones.getValueAsList();
      mobilePhonesItems.forEach(mobilePhonesItem -> {
        if (DocumentFieldType.PHONE_NUMBER == mobilePhonesItem.getType()) {
          String mobilePhoneNumber = mobilePhonesItem.getValueAsPhoneNumber();
          System.out.printf("Mobile phone number: %s, confidence: %.2f%n",
            mobilePhoneNumber, mobilePhonesItem.getConfidence());
        }
      });
    }
  }

  DocumentField otherPhones = businessCardFields.get("OtherPhones");
  if (otherPhones != null) {
    if (DocumentFieldType.LIST == otherPhones.getType()) {
      List < DocumentField > otherPhonesItems = otherPhones.getValueAsList();
      otherPhonesItems.forEach(otherPhonesItem -> {
        if (DocumentFieldType.PHONE_NUMBER == otherPhonesItem.getType()) {
          String otherPhoneNumber = otherPhonesItem.getValueAsPhoneNumber();
          System.out.printf("Other phone number: %s, confidence: %.2f%n",
            otherPhoneNumber, otherPhonesItem.getConfidence());
        }
      });
    }
  }

  DocumentField faxes = businessCardFields.get("Faxes");
  if (faxes != null) {
    if (DocumentFieldType.LIST == faxes.getType()) {
      List < DocumentField > faxesItems = faxes.getValueAsList();
      faxesItems.forEach(faxesItem -> {
        if (DocumentFieldType.PHONE_NUMBER == faxesItem.getType()) {
          String faxPhoneNumber = faxesItem.getValueAsPhoneNumber();
          System.out.printf("Fax phone number: %s, confidence: %.2f%n",
            faxPhoneNumber, faxesItem.getConfidence());
        }
      });
    }
  }

  DocumentField addresses = businessCardFields.get("Addresses");
  if (addresses != null) {
    if (DocumentFieldType.LIST == addresses.getType()) {
      List < DocumentField > addressesItems = addresses.getValueAsList();
      addressesItems.forEach(addressesItem -> {
        if (DocumentFieldType.STRING == addressesItem.getType()) {
          String address = addressesItem.getValueAsString();
          System.out
            .printf("Address: %s, confidence: %.2f%n", address, addressesItem.getConfidence());
        }
      });
    }
  }

  DocumentField companyName = businessCardFields.get("CompanyNames");
  if (companyName != null) {
    if (DocumentFieldType.LIST == companyName.getType()) {
      List < DocumentField > companyNameItems = companyName.getValueAsList();
      companyNameItems.forEach(companyNameItem -> {
        if (DocumentFieldType.STRING == companyNameItem.getType()) {
          String companyNameValue = companyNameItem.getValueAsString();
          System.out.printf("Company name: %s, confidence: %.2f%n", companyNameValue,
            companyNameItem.getConfidence());
        }
      });
    }
  }
}
}
}

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a névjegykártya-modell kimenetét.

Ügyféloldali kódtár | – REST API referenciacsomag | (npm) | Minták |támogatott REST API-verzió

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. Hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos szolgáltatást. 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.

    Hozzon létre egy Azure AI-szolgáltatási erőforrást, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont és kulcs használatával. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Ha Microsoft Entra-hitelesítést kíván használni, egyszolgáltatásos erőforrásra van szüksége.

  • Az alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

  • Dokumentumfájl URL-címen. Ebben a projektben az alábbi táblázatban szereplő mintaűrlapokat használhatja az egyes funkciókhoz:

    Szolgáltatás modelID dokumentum url-címe
    Modell olvasása előre összeállított olvasás Minta brosúra
    Elrendezési modell előre összeállított elrendezés Foglalási visszaigazolás mintája
    W-2 űrlapmodell prebuilt-tax.us.w2 W-2 mintaűrlap
    Számlamodell előre összeállított számla Mintaszámla
    Nyugtamodell előre összeállított nyugta Minta nyugta
    Azonosító dokumentummodell előre összeállított-idDocument Mintaazonosító dokumentum

Környezeti változók beállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez példányosíthatja az ügyfelet az Ön key és endpoint az Azure Portal használatával. Ebben a projektben környezeti változókkal tárolhatja és érheti el a hitelesítő adatokat.

Fontos

HA API-kulcsot használ, biztonságosan tárolja valahol máshol, például az Azure Key Vaultban. Ne foglalja bele közvetlenül az API-kulcsot a kódba, és soha ne tegye közzé nyilvánosan.

Az AI-szolgáltatások biztonságáról további információt az Azure AI-szolgáltatásokhoz érkező kérelmek hitelesítése című témakörben talál.

A Dokumentumintelligencia erőforráskulcs környezeti változójának beállításához nyisson meg egy konzolablakot, és kövesse az operációs rendszer és a fejlesztési környezet utasításait. Cserélje le aKey> és <a YourEndpoint> értékét az azure portalon található erőforrás értékeire.<

A Windows környezeti változói nem érzékenyek a kis- és nagybetűkre. Ezek általában nagybetűvel vannak deklarálva, aláhúzással összekapcsolt szavakkal. A parancssorban futtassa a következő parancsokat:

  1. Állítsa be a kulcsváltozót:

    setx DI_KEY <yourKey>
    
  2. A végpontváltozó beállítása

    setx DI_ENDPOINT <yourEndpoint>
    
  3. Zárja be a parancssori ablakot a környezeti változók beállítása után. Az értékek mindaddig megmaradnak, amíg újra nem módosítja őket.

  4. Indítsa újra a környezeti változót olvasó futó programokat. Ha például a Visual Studio-t vagy a Visual Studio Code-ot használja szerkesztőként, indítsa újra a mintakód futtatása előtt.

Íme néhány hasznosabb parancs a környezeti változókkal való használathoz:

Parancs Művelet Példa
setx VARIABLE_NAME= Törölje a környezeti változót úgy, hogy az értéket üres sztringre állítja. setx DI_KEY=
setx VARIABLE_NAME=value Környezeti változó értékének beállítása vagy módosítása. setx DI_KEY=<yourKey>
set VARIABLE_NAME Egy adott környezeti változó értékének megjelenítése. set DI_KEY
set Az összes környezeti változó megjelenítése. set

A programozási környezet beállítása

Hozzon létre egy Node.js Express-alkalmazást.

  1. A konzolablakban hozzon létre egy új könyvtárat, és lépjen az alkalmazáshoz nevű doc-intel-appúj könyvtárra.

    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. A projekthez kihagyhatja őket.
    • Az Enter elemet választva fogadja el a javaslatokat zárójelben.

    Az utasításokat követően a parancs létrehoz egy package.json fájlt a doc-intel-app könyvtárban.

  4. 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/identity
    

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

  1. Hozzon létre egy index.js nevű fájlt 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, majd í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 AzureKeyCredential kulcsot az Azure Portalról, valamint egy példányt DocumentIntelligenceClient a AzureKeyCredential dokumentumintelligencia-végponttal.

Nyissa meg a fájlt a index.js Visual Studio Code-ban vagy a kedvenc IDE-ben, és válasszon az alábbi kódminták közül, és másolja/illessze be az alkalmazásba:

  • Az előre összeállított olvasási modell az összes Dokumentumintelligencia-modell középpontjában áll, és képes észlelni a vonalakat, szavakat, helyeket és nyelveket. Az elrendezés, az általános dokumentum, az előre összeállított és az egyéni modellek mind a modellt használják a read szövegek dokumentumokból való kinyerése alapjául.
  • Az előre összeállított elrendezési modell szöveg- és szöveghelyeket, táblázatokat, kijelölési jeleket és szerkezeti információkat nyer ki a dokumentumokból és képekből.
  • Az előre összeállított-tax.us.w2 modell kinyeri az USA belső bevételi szolgáltatásának (IRS) adózási űrlapjairól jelentett információkat.
  • Az előre összeállított számlamodell kinyeri az Egyesült Államok belső bevételi szolgáltatásának adózási űrlapjairól jelentett információkat.
  • Az előre összeállított nyugtamodell a nyomtatott és kézzel írt értékesítési nyugtákból nyeri ki a kulcsadatokat.
  • Az előre összeállított idDocument modell kulcsfontosságú információkat nyer ki az USA-beli jogosítványokból; nemzetközi útlevél-életrajzi oldalakról; USA-beli államazonosítók; társadalombiztosítási kártyák; és állandó rezidens kártyákat.

Az Olvasási modell használata

const { DocumentIntelligenceClient } = require("@azure-rest/ai-document-intelligence");
const  { AzureKeyCredential } = require("@azure/core-auth");

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

// sample document
const documentUrlRead = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png"

// helper function
function* getTextOfSpans(content, spans) {
    for (const span of spans) {
        yield content.slice(span.offset, span.offset + span.length);
    }
}

async function main() {
    // create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
    const client = DocumentIntelligence(endpoint, new AzureKeyCredential(key));
    const poller = await client.beginAnalyzeDocument("prebuilt-read", documentUrlRead);

    const {
        content,
        pages,
        languages,
        styles
    } = 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.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 (languages.length <= 0) {
        console.log("No language spans were extracted from the document.");
    } else {
        console.log("Languages:");
        for (const languageEntry of languages) {
            console.log(
                `- Found language: ${languageEntry.languageCode} (confidence: ${languageEntry.confidence})`
            );
            for (const text of getTextOfSpans(content, languageEntry.spans)) {
                const escapedText = text.replace(/\r?\n/g, "\\n").replace(/"/g, '\\"');
                console.log(`  - "${escapedText}"`);
            }
        }
    }

    if (styles.length <= 0) {
        console.log("No text styles were extracted from the document.");
    } else {
        console.log("Styles:");
        for (const style of styles) {
            console.log(
                `- Handwritten: ${style.isHandwritten ? "yes" : "no"} (confidence=${style.confidence})`
            );

            for (const word of getTextOfSpans(content, style.spans)) {
                console.log(`  - "${word}"`);
            }
        }
    }
}

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a modell kimenetétread.

Az Elrendezési modell használata

const { DocumentIntelligenceClient } = require("@azure-rest/ai-document-intelligence");
const  { AzureKeyCredential } = require("@azure/core-auth");

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

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

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

    const poller = await client.beginAnalyzeDocument(
      "prebuilt-layout", layoutUrl);

    // Layout extraction produces basic elements such as pages, words, lines, etc. as well as information about the
    // appearance (styles) of textual elements.
    const { pages, tables } = await poller.pollUntilDone();

    if (!pages || 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 && page.lines.length} lines, ${page.words && 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 || 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);
  });

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az elrendezési modell kimenetét.

Az Általános dokumentummodell használata

const { DocumentIntelligenceClient } = require("@azure-rest/ai-document-intelligence");
const  { AzureKeyCredential } = require("@azure/core-auth");

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

// sample document
const documentUrl = "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 poller = await client.beginAnalyzeDocument("prebuilt-document", documentUrl);

    const {
        keyValuePairs
    } = await poller.pollUntilDone();

    if (!keyValuePairs || keyValuePairs.length <= 0) {
        console.log("No key-value pairs were extracted from the document.");
    } else {
        console.log("Key-Value Pairs:");
        for (const {
                key,
                value,
                confidence
            } of keyValuePairs) {
            console.log("- Key  :", `"${key.content}"`);
            console.log("  Value:", `"${(value && value.content) || "<undefined>"}" (${confidence})`);
        }
    }

}

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az általános dokumentummodell kimenetét.

A W-2 adómodell használata

const { DocumentIntelligenceClient } = require("@azure-rest/ai-document-intelligence");
const  { AzureKeyCredential } = require("@azure/core-auth");

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

const w2DocumentURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png"

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

 const poller = await client.beginAnalyzeDocument("prebuilt-tax.us.w2", w2DocumentURL);

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

  if (result) {
    const { Employee, Employer, ControlNumber, TaxYear, AdditionalInfo } = result.fields;

    if (Employee) {
      const { Name, Address, SocialSecurityNumber } = Employee.properties;
      console.log("Employee:");
      console.log("  Name:", Name && Name.content);
      console.log("  SSN/TIN:", SocialSecurityNumber && SocialSecurityNumber.content);
      if (Address && Address.value) {
        const { streetAddress, postalCode } = Address.value;
        console.log("  Address:");
        console.log("    Street Address:", streetAddress);
        console.log("    Postal Code:", postalCode);
      }
    } else {
      console.log("No employee information extracted.");
    }

    if (Employer) {
      const { Name, Address, IdNumber } = Employer.properties;
      console.log("Employer:");
      console.log("  Name:", Name && Name.content);
      console.log("  ID (EIN):", IdNumber && IdNumber.content);

      if (Address && Address.value) {
        const { streetAddress, postalCode } = Address.value;
        console.log("  Address:");
        console.log("    Street Address:", streetAddress);
        console.log("    Postal Code:", postalCode);
      }
    } else {
      console.log("No employer information extracted.");
    }

    console.log("Control Number:", ControlNumber && ControlNumber.content);
    console.log("Tax Year:", TaxYear && TaxYear.content);

    if (AdditionalInfo) {
      console.log("Additional Info:");

      for (const info of AdditionalInfo.values) {
        const { LetterCode, Amount } = info.properties;
        console.log(`- ${LetterCode && LetterCode.content}: ${Amount && Amount.content}`);
      }
    }
  } else {
    throw new Error("Expected at least one document in the result.");
  }
}

main().catch((error) => {
  console.error(error);
  process.exit(1);
});

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a W-2 adómodell kimenetét.

A számlamodell használata

const { DocumentIntelligenceClient } = require("@azure-rest/ai-document-intelligence");
const  { AzureKeyCredential } = require("@azure/core-auth");

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

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

async function main() {

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

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

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

  if (result) {
      const invoice = result.fields;

      console.log("Vendor Name:", invoice.VendorName?.content);
      console.log("Customer Name:", invoice.CustomerName?.content);
      console.log("Invoice Date:", invoice.InvoiceDate?.content);
      console.log("Due Date:", invoice.DueDate?.content);

      console.log("Items:");
      for (const {
              properties: item
          } of invoice.Items?.values ?? []) {
          console.log("-", item.ProductCode?.content ?? "<no product code>");
          console.log("  Description:", item.Description?.content);
          console.log("  Quantity:", item.Quantity?.content);
          console.log("  Date:", item.Date?.content);
          console.log("  Unit:", item.Unit?.content);
          console.log("  Unit Price:", item.UnitPrice?.content);
          console.log("  Tax:", item.Tax?.content);
          console.log("  Amount:", item.Amount?.content);
      }

      console.log("Subtotal:", invoice.SubTotal?.content);
      console.log("Previous Unpaid Balance:", invoice.PreviousUnpaidBalance?.content);
      console.log("Tax:", invoice.TotalTax?.content);
      console.log("Amount Due:", invoice.AmountDue?.content);
  } else {
      throw new Error("Expected at least one receipt in the result.");
  }
}

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a számlamodell kimenetét.

A Nyugtamodell használata

const { DocumentIntelligenceClient } = require("@azure-rest/ai-document-intelligence");
const  { AzureKeyCredential } = require("@azure/core-auth");

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

// sample url
const receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png";

async function main() {

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

    const poller = await client.beginAnalyzeDocument("prebuilt-receipt", receiptUrl);

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

    if (result) {
        const {
            MerchantName,
            Items,
            Total
        } = result.fields;

        console.log("=== Receipt Information ===");
        console.log("Type:", result.docType);
        console.log("Merchant:", MerchantName && MerchantName.content);

        console.log("Items:");
        for (const item of (Items && Items.values) || []) {
            const {
                Description,
                TotalPrice
            } = item.properties;

            console.log("- Description:", Description && Description.content);
            console.log("  Total Price:", TotalPrice && TotalPrice.content);
        }

        console.log("Total:", Total && Total.content);
    } else {
        throw new Error("Expected at least one receipt in the result.");
    }

}

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a nyugtamodell kimenetét.

Az azonosító dokumentummodell használata

const { DocumentIntelligenceClient } = require("@azure-rest/ai-document-intelligence");
const  { AzureKeyCredential } = require("@azure/core-auth");

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

// sample document
const idDocumentURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png"

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

 const poller = await client.beginAnalyzeDocument("prebuilt-idDocument", idDocumentURL);

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

  if (result) {
// The identity document model has multiple document types, so we need to know which document type was actually
    extracted.
    if (result.docType === "idDocument.driverLicense") {
      const { FirstName, LastName, DocumentNumber, DateOfBirth, DateOfExpiration, Height, Weight, EyeColor, Endorsements, Restrictions, VehicleClassifications} = result.fields;

// For the sake of the example, we'll only show a few of the fields that are produced.
      console.log("Extracted a Driver License:");
      console.log("  Name:", FirstName && FirstName.content, LastName && LastName.content);
      console.log("  License No.:", DocumentNumber && DocumentNumber.content);
      console.log("  Date of Birth:", DateOfBirth && DateOfBirth.content);
      console.log("  Expiration:", DateOfExpiration && DateOfExpiration.content);
      console.log("  Height:", Height && Height.content);
      console.log("  Weight:", Weight && Weight.content);
      console.log("  Eye color:", EyeColor && EyeColor.content);
      console.log("  Restrictions:", Restrictions && Restrictions.content);
      console.log("  Endorsements:", Endorsements && Endorsements.content);
      console.log("  Class:", VehicleClassifications && VehicleClassifications.content);
    } else if (result.docType === "idDocument.passport") {
// The passport document type extracts and parses the Passport's machine-readable zone
      if (!result.fields.machineReadableZone) {
        throw new Error("No Machine Readable Zone extracted from passport.");
      }

      const {
        FirstName,
        LastName,
        DateOfBirth,
        Nationality,
        DocumentNumber,
        CountryRegion,
        DateOfExpiration,
      } = result.fields.machineReadableZone.properties;

      console.log("Extracted a Passport:");
      console.log("  Name:", FirstName && FirstName.content, LastName && LastName.content);
      console.log("  Date of Birth:", DateOfBirth && DateOfBirth.content);
      console.log("  Nationality:", Nationality && Nationality.content);
      console.log("  Passport No.:", DocumentNumber && DocumentNumber.content);
      console.log("  Issuer:", CountryRegion && CountryRegion.content);
      console.log("  Expiration Date:", DateOfExpiration && DateOfExpiration.content);
    } else {
// The only reason this would happen is if the client library's schema for the prebuilt identity document model is
      out of date, and a new document type has been introduced.
      console.error("Unknown document type in result:", result);
    }
  } else {
    throw new Error("Expected at least one receipt in the result.");
  }
}

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

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg az azonosító dokumentummodell kimenetét.

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. Hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos szolgáltatást. 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.

    Hozzon létre egy Azure AI-szolgáltatási erőforrást, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont és kulcs használatával. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Ha Microsoft Entra-hitelesítést kíván használni, egyszolgáltatásos erőforrásra van szüksége.

  • Az alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

  • Dokumentumfájl URL-címen. Ebben a projektben az alábbi táblázatban szereplő mintaűrlapokat használhatja az egyes funkciókhoz:

    Szolgáltatás modelID dokumentum url-címe
    Modell olvasása előre összeállított olvasás Minta brosúra
    Elrendezési modell előre összeállított elrendezés Foglalási visszaigazolás mintája
    W-2 űrlapmodell prebuilt-tax.us.w2 W-2 mintaűrlap
    Számlamodell előre összeállított számla Mintaszámla
    Nyugtamodell előre összeállított nyugta Minta nyugta
    Azonosító dokumentummodell előre összeállított-idDocument Mintaazonosító dokumentum
    Névjegykártya-modell előre összeállított-businessCard Névjegykártya minta

Környezeti változók beállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez példányosíthatja az ügyfelet az Ön key és endpoint az Azure Portal használatával. Ebben a projektben környezeti változókkal tárolhatja és érheti el a hitelesítő adatokat.

Fontos

HA API-kulcsot használ, biztonságosan tárolja valahol máshol, például az Azure Key Vaultban. Ne foglalja bele közvetlenül az API-kulcsot a kódba, és soha ne tegye közzé nyilvánosan.

Az AI-szolgáltatások biztonságáról további információt az Azure AI-szolgáltatásokhoz érkező kérelmek hitelesítése című témakörben talál.

A Dokumentumintelligencia erőforráskulcs környezeti változójának beállításához nyisson meg egy konzolablakot, és kövesse az operációs rendszer és a fejlesztési környezet utasításait. Cserélje le aKey> és <a YourEndpoint> értékét az azure portalon található erőforrás értékeire.<

A Windows környezeti változói nem érzékenyek a kis- és nagybetűkre. Ezek általában nagybetűvel vannak deklarálva, aláhúzással összekapcsolt szavakkal. A parancssorban futtassa a következő parancsokat:

  1. Állítsa be a kulcsváltozót:

    setx DI_KEY <yourKey>
    
  2. A végpontváltozó beállítása

    setx DI_ENDPOINT <yourEndpoint>
    
  3. Zárja be a parancssori ablakot a környezeti változók beállítása után. Az értékek mindaddig megmaradnak, amíg újra nem módosítja őket.

  4. Indítsa újra a környezeti változót olvasó futó programokat. Ha például a Visual Studio-t vagy a Visual Studio Code-ot használja szerkesztőként, indítsa újra a mintakód futtatása előtt.

Íme néhány hasznosabb parancs a környezeti változókkal való használathoz:

Parancs Művelet Példa
setx VARIABLE_NAME= Törölje a környezeti változót úgy, hogy az értéket üres sztringre állítja. setx DI_KEY=
setx VARIABLE_NAME=value Környezeti változó értékének beállítása vagy módosítása. setx DI_KEY=<yourKey>
set VARIABLE_NAME Egy adott környezeti változó értékének megjelenítése. set DI_KEY
set Az összes környezeti változó megjelenítése. set

A programozási környezet beállítása

Hozzon létre egy Node.js Express-alkalmazást.

  1. A konzolablakban hozzon létre egy új könyvtárat, és lépjen az alkalmazáshoz nevű form-recognizer-appúj könyvtárra.

    mkdir form-recognizer-app
    cd form-recognizer-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. A projekthez kihagyhatja őket.
    • Az Enter elemet választva fogadja el a javaslatokat zárójelben.

    Az utasításokat követően a parancs létrehoz egy package.json fájlt az űrlap-felismerő-alkalmazás könyvtárában.

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

    npm i @azure/ai-form-recognizer @azure/identity
    

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

  1. Hozzon létre egy index.js nevű fájlt 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, majd í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 DocumentAnalysisClient . Ehhez létre kell hoznia egy AzureKeyCredential kulcsot az Azure Portalról, valamint egy példányt DocumentAnalysisClient a AzureKeyCredential dokumentumintelligencia-végponttal.

Nyissa meg a fájlt a index.js Visual Studio Code-ban vagy a kedvenc IDE-ben, és válasszon az alábbi kódminták közül, és másolja/illessze be az alkalmazásba:

  • Az előre összeállított olvasási modell az összes Dokumentumintelligencia-modell középpontjában áll, és képes észlelni a vonalakat, szavakat, helyeket és nyelveket. Az elrendezés, az általános dokumentum, az előre összeállított és az egyéni modellek mind a modellt használják a read szövegek dokumentumokból való kinyerése alapjául.
  • Az előre összeállított elrendezési modell szöveg- és szöveghelyeket, táblázatokat, kijelölési jeleket és szerkezeti információkat nyer ki a dokumentumokból és képekből.
  • Az előre összeállított-tax.us.w2 modell kinyeri az USA belső bevételi szolgáltatásának (IRS) adózási űrlapjairól jelentett információkat.
  • Az előre összeállított számlamodell kinyeri az Egyesült Államok belső bevételi szolgáltatásának adózási űrlapjairól jelentett információkat.
  • Az előre összeállított nyugtamodell a nyomtatott és kézzel írt értékesítési nyugtákból nyeri ki a kulcsadatokat.
  • Az előre összeállított idDocument modell kulcsfontosságú információkat nyer ki az USA-beli jogosítványokból; nemzetközi útlevél-életrajzi oldalakról; USA-beli államazonosítók; társadalombiztosítási kártyák; és állandó rezidens kártyákat.

Az Olvasási modell használata

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

// sample document
const documentUrlRead = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png"

// helper function
function* getTextOfSpans(content, spans) {
    for (const span of spans) {
        yield content.slice(span.offset, span.offset + span.length);
    }
}

async function main() {
    // create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));
    const poller = await client.beginAnalyzeDocument("prebuilt-read", documentUrlRead);

    const {
        content,
        pages,
        languages,
        styles
    } = 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.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 (languages.length <= 0) {
        console.log("No language spans were extracted from the document.");
    } else {
        console.log("Languages:");
        for (const languageEntry of languages) {
            console.log(
                `- Found language: ${languageEntry.languageCode} (confidence: ${languageEntry.confidence})`
            );
            for (const text of getTextOfSpans(content, languageEntry.spans)) {
                const escapedText = text.replace(/\r?\n/g, "\\n").replace(/"/g, '\\"');
                console.log(`  - "${escapedText}"`);
            }
        }
    }

    if (styles.length <= 0) {
        console.log("No text styles were extracted from the document.");
    } else {
        console.log("Styles:");
        for (const style of styles) {
            console.log(
                `- Handwritten: ${style.isHandwritten ? "yes" : "no"} (confidence=${style.confidence})`
            );

            for (const word of getTextOfSpans(content, style.spans)) {
                console.log(`  - "${word}"`);
            }
        }
    }
}

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a modell kimenetétread.

Az Elrendezési modell használata

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

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

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

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

    // Layout extraction produces basic elements such as pages, words, lines, etc. as well as information about the
    // appearance (styles) of textual elements.
    const { pages, tables } = await poller.pollUntilDone();

    if (!pages || 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 && page.lines.length} lines, ${page.words && 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 || 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);
  });

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az elrendezési modell kimenetét.

Az Általános dokumentummodell használata

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

// sample document
const documentUrl = "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-document", documentUrl);

    const {
        keyValuePairs
    } = await poller.pollUntilDone();

    if (!keyValuePairs || keyValuePairs.length <= 0) {
        console.log("No key-value pairs were extracted from the document.");
    } else {
        console.log("Key-Value Pairs:");
        for (const {
                key,
                value,
                confidence
            } of keyValuePairs) {
            console.log("- Key  :", `"${key.content}"`);
            console.log("  Value:", `"${(value && value.content) || "<undefined>"}" (${confidence})`);
        }
    }

}

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az általános dokumentummodell kimenetét.

A W-2 adómodell használata

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

const w2DocumentURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png"

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

 const poller = await client.beginAnalyzeDocument("prebuilt-tax.us.w2", w2DocumentURL);

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

  if (result) {
    const { Employee, Employer, ControlNumber, TaxYear, AdditionalInfo } = result.fields;

    if (Employee) {
      const { Name, Address, SocialSecurityNumber } = Employee.properties;
      console.log("Employee:");
      console.log("  Name:", Name && Name.content);
      console.log("  SSN/TIN:", SocialSecurityNumber && SocialSecurityNumber.content);
      if (Address && Address.value) {
        const { streetAddress, postalCode } = Address.value;
        console.log("  Address:");
        console.log("    Street Address:", streetAddress);
        console.log("    Postal Code:", postalCode);
      }
    } else {
      console.log("No employee information extracted.");
    }

    if (Employer) {
      const { Name, Address, IdNumber } = Employer.properties;
      console.log("Employer:");
      console.log("  Name:", Name && Name.content);
      console.log("  ID (EIN):", IdNumber && IdNumber.content);

      if (Address && Address.value) {
        const { streetAddress, postalCode } = Address.value;
        console.log("  Address:");
        console.log("    Street Address:", streetAddress);
        console.log("    Postal Code:", postalCode);
      }
    } else {
      console.log("No employer information extracted.");
    }

    console.log("Control Number:", ControlNumber && ControlNumber.content);
    console.log("Tax Year:", TaxYear && TaxYear.content);

    if (AdditionalInfo) {
      console.log("Additional Info:");

      for (const info of AdditionalInfo.values) {
        const { LetterCode, Amount } = info.properties;
        console.log(`- ${LetterCode && LetterCode.content}: ${Amount && Amount.content}`);
      }
    }
  } else {
    throw new Error("Expected at least one document in the result.");
  }
}

main().catch((error) => {
  console.error(error);
  process.exit(1);
});

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a W-2 adómodell kimenetét.

A számlamodell használata

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

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

async function main() {

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

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

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

  if (result) {
      const invoice = result.fields;

      console.log("Vendor Name:", invoice.VendorName?.content);
      console.log("Customer Name:", invoice.CustomerName?.content);
      console.log("Invoice Date:", invoice.InvoiceDate?.content);
      console.log("Due Date:", invoice.DueDate?.content);

      console.log("Items:");
      for (const {
              properties: item
          } of invoice.Items?.values ?? []) {
          console.log("-", item.ProductCode?.content ?? "<no product code>");
          console.log("  Description:", item.Description?.content);
          console.log("  Quantity:", item.Quantity?.content);
          console.log("  Date:", item.Date?.content);
          console.log("  Unit:", item.Unit?.content);
          console.log("  Unit Price:", item.UnitPrice?.content);
          console.log("  Tax:", item.Tax?.content);
          console.log("  Amount:", item.Amount?.content);
      }

      console.log("Subtotal:", invoice.SubTotal?.content);
      console.log("Previous Unpaid Balance:", invoice.PreviousUnpaidBalance?.content);
      console.log("Tax:", invoice.TotalTax?.content);
      console.log("Amount Due:", invoice.AmountDue?.content);
  } else {
      throw new Error("Expected at least one receipt in the result.");
  }
}

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a számlamodell kimenetét.

A Nyugtamodell használata

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

// sample url
const receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png";

async function main() {

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

    const poller = await client.beginAnalyzeDocument("prebuilt-receipt", receiptUrl);

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

    if (result) {
        const {
            MerchantName,
            Items,
            Total
        } = result.fields;

        console.log("=== Receipt Information ===");
        console.log("Type:", result.docType);
        console.log("Merchant:", MerchantName && MerchantName.content);

        console.log("Items:");
        for (const item of (Items && Items.values) || []) {
            const {
                Description,
                TotalPrice
            } = item.properties;

            console.log("- Description:", Description && Description.content);
            console.log("  Total Price:", TotalPrice && TotalPrice.content);
        }

        console.log("Total:", Total && Total.content);
    } else {
        throw new Error("Expected at least one receipt in the result.");
    }

}

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a nyugtamodell kimenetét.

Az azonosító dokumentummodell használata

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

// sample document
const idDocumentURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png"

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

 const poller = await client.beginAnalyzeDocument("prebuilt-idDocument", idDocumentURL);

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

  if (result) {
// The identity document model has multiple document types, so we need to know which document type was actually
    extracted.
    if (result.docType === "idDocument.driverLicense") {
      const { FirstName, LastName, DocumentNumber, DateOfBirth, DateOfExpiration, Height, Weight, EyeColor, Endorsements, Restrictions, VehicleClassifications} = result.fields;

// For the sake of the example, we'll only show a few of the fields that are produced.
      console.log("Extracted a Driver License:");
      console.log("  Name:", FirstName && FirstName.content, LastName && LastName.content);
      console.log("  License No.:", DocumentNumber && DocumentNumber.content);
      console.log("  Date of Birth:", DateOfBirth && DateOfBirth.content);
      console.log("  Expiration:", DateOfExpiration && DateOfExpiration.content);
      console.log("  Height:", Height && Height.content);
      console.log("  Weight:", Weight && Weight.content);
      console.log("  Eye color:", EyeColor && EyeColor.content);
      console.log("  Restrictions:", Restrictions && Restrictions.content);
      console.log("  Endorsements:", Endorsements && Endorsements.content);
      console.log("  Class:", VehicleClassifications && VehicleClassifications.content);
    } else if (result.docType === "idDocument.passport") {
// The passport document type extracts and parses the Passport's machine-readable zone
      if (!result.fields.machineReadableZone) {
        throw new Error("No Machine Readable Zone extracted from passport.");
      }

      const {
        FirstName,
        LastName,
        DateOfBirth,
        Nationality,
        DocumentNumber,
        CountryRegion,
        DateOfExpiration,
      } = result.fields.machineReadableZone.properties;

      console.log("Extracted a Passport:");
      console.log("  Name:", FirstName && FirstName.content, LastName && LastName.content);
      console.log("  Date of Birth:", DateOfBirth && DateOfBirth.content);
      console.log("  Nationality:", Nationality && natiNationalityonality.content);
      console.log("  Passport No.:", DocumentNumber && DocumentNumber.content);
      console.log("  Issuer:", CountryRegion && CountryRegion.content);
      console.log("  Expiration Date:", DateOfExpiration && DateOfExpiration.content);
    } else {
// The only reason this would happen is if the client library's schema for the prebuilt identity document model is
      out of date, and a new document type has been introduced.
      console.error("Unknown document type in result:", result);
    }
  } else {
    throw new Error("Expected at least one receipt in the result.");
  }
}

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

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg az azonosító dokumentummodell kimenetét.

A névjegykártya-modell használata

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

// sample document
const businessCardURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg"

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

    const poller = await client.beginAnalyzeDocument("prebuilt-businessCard", businessCardURL);

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

    if (result) {
        const businessCard = result.fields;
        console.log("=== Business Card Information ===");

        // There are more fields than just these few, and the model allows for multiple contact & company names as well as
        // phone numbers, though we'll only show the first extracted values here.
        const name = businessCard.ContactNames && businessCard.ContactNames.values[0];
        if (name) {
            const {
                FirstName,
                LastName
            } = name.properties;
            console.log("Name:", FirstName && FirstName.content, LastName && LastName.content);
        }

        const company = businessCard.CompanyNames && businessCard.CompanyNames.values[0];
        if (company) {
            console.log("Company:", company.content);
        }

        const address = businessCard.Addresses && businessCard.Addresses.values[0];
        if (address) {
            console.log("Address:", address.content);
        }
        const jobTitle = businessCard.JobTitles && businessCard.JobTitles.values[0];
        if (jobTitle) {
            console.log("Job title:", jobTitle.content);
        }
        const department = businessCard.Departments && businessCard.Departments.values[0];
        if (department) {
            console.log("Department:", department.content);
        }
        const email = businessCard.Emails && businessCard.Emails.values[0];
        if (email) {
            console.log("Email:", email.content);
        }
        const workPhone = businessCard.WorkPhones && businessCard.WorkPhones.values[0];
        if (workPhone) {
            console.log("Work phone:", workPhone.content);
        }
        const website = businessCard.Websites && businessCard.Websites.values[0];
        if (website) {
            console.log("Website:", website.content);
        }
    } else {
        throw new Error("Expected at least one business card in the result.");
    }
}

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

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a névjegykártya-modell kimenetét.

Ügyfélkódtár SDK-referencia | REST API-referenciacsomag | (PyPi) | Minták | támogatott REST API-verzió |

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 futtatva 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. Tekintse meg a Python használatának első lépéseit a Visual Studio Code-ban.

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos szolgáltatást. 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 alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

  • Dokumentumfájl URL-címen. Ebben a projektben az alábbi táblázatban szereplő mintaűrlapokat használhatja az egyes funkciókhoz:

    Szolgáltatás modelID dokumentum url-címe
    Modell olvasása előre összeállított olvasás Minta brosúra
    Elrendezési modell előre összeállított elrendezés Foglalási visszaigazolás mintája
    W-2 űrlapmodell prebuilt-tax.us.w2 W-2 mintaűrlap
    Számlamodell előre összeállított számla Mintaszámla
    Nyugtamodell előre összeállított nyugta Minta nyugta
    Azonosító dokumentummodell előre összeállított-idDocument Mintaazonosító dokumentum

Környezeti változók beállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez példányosíthatja az ügyfelet az Ön key és endpoint az Azure Portal használatával. Ebben a projektben környezeti változókkal tárolhatja és érheti el a hitelesítő adatokat.

Fontos

HA API-kulcsot használ, biztonságosan tárolja valahol máshol, például az Azure Key Vaultban. Ne foglalja bele közvetlenül az API-kulcsot a kódba, és soha ne tegye közzé nyilvánosan.

Az AI-szolgáltatások biztonságáról további információt az Azure AI-szolgáltatásokhoz érkező kérelmek hitelesítése című témakörben talál.

A Dokumentumintelligencia erőforráskulcs környezeti változójának beállításához nyisson meg egy konzolablakot, és kövesse az operációs rendszer és a fejlesztési környezet utasításait. Cserélje le aKey> és <a YourEndpoint> értékét az azure portalon található erőforrás értékeire.<

A Windows környezeti változói nem érzékenyek a kis- és nagybetűkre. Ezek általában nagybetűvel vannak deklarálva, aláhúzással összekapcsolt szavakkal. A parancssorban futtassa a következő parancsokat:

  1. Állítsa be a kulcsváltozót:

    setx DI_KEY <yourKey>
    
  2. A végpontváltozó beállítása

    setx DI_ENDPOINT <yourEndpoint>
    
  3. Zárja be a parancssori ablakot a környezeti változók beállítása után. Az értékek mindaddig megmaradnak, amíg újra nem módosítja őket.

  4. Indítsa újra a környezeti változót olvasó futó programokat. Ha például a Visual Studio-t vagy a Visual Studio Code-ot használja szerkesztőként, indítsa újra a mintakód futtatása előtt.

Íme néhány hasznosabb parancs a környezeti változókkal való használathoz:

Parancs Művelet Példa
setx VARIABLE_NAME= Törölje a környezeti változót úgy, hogy az értéket üres sztringre állítja. setx DI_KEY=
setx VARIABLE_NAME=value Környezeti változó értékének beállítása vagy módosítása. setx DI_KEY=<yourKey>
set VARIABLE_NAME Egy adott környezeti változó értékének megjelenítése. set DI_KEY
set Az összes környezeti változó megjelenítése. set

A programozási környezet beállítása

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

pip install azure-ai-documentintelligence==1.0.0b4

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 AzureKeyCredential kulcsot az Azure Portalról, valamint egy példányt DocumentIntelligenceClient a AzureKeyCredential dokumentumintelligencia-végponttal.

  1. Hozzon létre egy form_recognizer_quickstart.py nevű új Python-fájlt egy szerkesztőben vagy IDE-ben.

  2. Nyissa meg a form_recognizer_quickstart.py fájlt, és válasszon az alábbi kódminták közül, és másolja/illessze be az alkalmazásba:

    • Az előre összeállított olvasási modell az összes Dokumentumintelligencia-modell középpontjában áll, és képes észlelni a vonalakat, szavakat, helyeket és nyelveket. Az elrendezés, az általános dokumentum, az előre összeállított és az egyéni modellek mind a modellt használják a read szövegek dokumentumokból való kinyerése alapjául.
    • Az előre összeállított elrendezési modell szöveg- és szöveghelyeket, táblázatokat, kijelölési jeleket és szerkezeti információkat nyer ki a dokumentumokból és képekből.
    • Az előre összeállított-tax.us.w2 modell kinyeri az USA belső bevételi szolgáltatásának (IRS) adózási űrlapjairól jelentett információkat.
    • Az előre összeállított számlamodell különböző formátumokban nyeri ki a kulcsmezőket és a sorelemeket az értékesítési számlákból.
    • Az előre összeállított nyugtamodell a nyomtatott és kézzel írt értékesítési nyugtákból nyeri ki a kulcsadatokat.
    • Az előre összeállított idDocument modell kulcsfontosságú információkat nyer ki az USA-beli jogosítványokból; nemzetközi útlevél-életrajzi oldalakról; USA-beli államazonosítók; társadalombiztosítási kártyák; és állandó rezidens kártyákat.
  3. Futtassa a Python-kódot a parancssorból.

    python form_recognizer_quickstart.py
    

Az Olvasási modell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

# 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_read():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png"

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

    poller = client.begin_analyze_document(
        "prebuilt-read", AnalyzeDocumentRequest(url_source=formUrl
    ))
    result: AnalyzeResult = poller.result()

    print("----Languages detected in the document----")
    if result.languages is not None:
        for language in result.languages:
            print(f"Language code: '{language.locale}' with confidence {language.confidence}")

    print("----Styles detected in the document----")
    if result.styles:
        for style in result.styles:
            if style.is_handwritten:
                print("Found the following handwritten content: ")
                print(",".join([result.content[span.offset : span.offset + span.length] for span in style.spans]))
            if style.font_style:
                print(f"The document contains '{style.font_style}' font style, applied to the following text: ")
                print(",".join([result.content[span.offset : span.offset + span.length] for span in style.spans]))

    for page in result.pages:
        print(f"----Analyzing document 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 {len(words)} words and text '{line.content}' 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.paragraphs:
        print(f"----Detected #{len(result.paragraphs)} paragraphs in the document----")
        for paragraph in result.paragraphs:
            print(f"Found paragraph with role: '{paragraph.role}' within {paragraph.bounding_regions} bounding region")
            print(f"...with content: '{paragraph.content}'")

        result.paragraphs.sort(key=lambda p: (p.spans.sort(key=lambda s: s.offset), p.spans[0].offset))
        print("-----Print sorted paragraphs-----")
        for idx, paragraph in enumerate(result.paragraphs):
            print(
                f"...paragraph:{idx} with offset: {paragraph.spans[0].offset} and length: {paragraph.spans[0].length}"
            )

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


if __name__ == "__main__":
    analyze_read()

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a modell kimenetétread.

Az Elrendezési modell használata

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


# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')


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

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

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az elrendezési modell kimenetét.

A W-2 adómodell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

# formatting function
def format_address_value(address_value):
    return f"\n......House/building number: {address_value.house_number}\n......Road: {address_value.road}\n......City: {address_value.city}\n......State: {address_value.state}\n......Postal code: {address_value.postal_code}"


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

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

    poller = client.begin_analyze_document(
        "prebuilt-tax.us.w2",  AnalyzeDocumentRequest(url_source=formUrl
    ))

    w2s: AnalyzeResult =  poller.result()

        if w2s.documents:
        for idx, w2 in enumerate(w2s.documents):
            print(f"--------Analyzing US Tax W-2 Form #{idx + 1}--------")
            if w2.fields:
                form_variant = w2.fields.get("W2FormVariant")
                if form_variant:
                    print(
                        f"Form variant: {form_variant.get('valueString')} has confidence: " f"{form_variant.confidence}"
                    )
                tax_year = w2.fields.get("TaxYear")
                if tax_year:
                    print(f"Tax year: {tax_year.get('valueString')} has confidence: {tax_year.confidence}")
                w2_copy = w2.fields.get("W2Copy")
                if w2_copy:
                    print(f"W-2 Copy: {w2_copy.get('valueString')} has confidence: {w2_copy.confidence}")
                employee = w2.fields.get("Employee")
                if employee:
                    print("Employee data:")
                    employee_name = employee.get("valueObject").get("Name")
                    if employee_name:
                        f"confidence: {fed_income_tax_withheld.confidence}"
                    )
                social_security_wages = w2.fields.get("SocialSecurityWages")
                if social_security_wages:
                    print(
                        f"Social Security wages: {social_security_wages.get('valueNumber')} has confidence: "
                        f"{social_security_wages.confidence}"
                    )
                social_security_tax_withheld = w2.fields.get("SocialSecurityTaxWithheld")
                if social_security_tax_withheld:
                    print(
                        f"Social Security tax withheld: {social_security_tax_withheld.get('valueNumber')} "
                        f"has confidence: {social_security_tax_withheld.confidence}"
                    )
                medicare_wages_tips = w2.fields.get("MedicareWagesAndTips")
                if medicare_wages_tips:
                    print(
                        f"Medicare wages and tips: {medicare_wages_tips.get('valueNumber')} has confidence: "
                        f"{medicare_wages_tips.confidence}"
                    )
                medicare_tax_withheld = w2.fields.get("MedicareTaxWithheld")
                if medicare_tax_withheld:
                    print(
                        f"Medicare tax withheld: {medicare_tax_withheld.get('valueNumber')} has confidence: "
                        f"{medicare_tax_withheld.confidence}"
                    )
                social_security_tips = w2.fields.get("SocialSecurityTips")
                if social_security_tips:
                    print(
                        f"Social Security tips: {social_security_tips.get('valueNumber')} has confidence: "
                        f"{social_security_tips.confidence}"
                    )
                allocated_tips = w2.fields.get("AllocatedTips")
                if allocated_tips:
                    print(
                        f"Allocated tips: {allocated_tips.get('valueNumber')} has confidence: {allocated_tips.confidence}"
                    )
                verification_code = w2.fields.get("VerificationCode")
                if verification_code:
                    print(
                        f"Verification code: {verification_code.get('valueNumber')} has confidence: {verification_code.confidence}"
                    )
                dependent_care_benefits = w2.fields.get("DependentCareBenefits")
                if dependent_care_benefits:
                    print(
                        f"Dependent care benefits: {dependent_care_benefits.get('valueNumber')} has confidence: {dependent_care_benefits.confidence}"
                    )
                non_qualified_plans = w2.fields.get("NonQualifiedPlans")
                if non_qualified_plans:
                    print(
                        f"Non-qualified plans: {non_qualified_plans.get('valueNumber')} has confidence: {non_qualified_plans.confidence}"
                    )
                additional_info = w2.fields.get("AdditionalInfo")
                if additional_info:
                    print("Additional information:")
                    for item in additional_info.get("valueArray"):
                        letter_code = item.get("valueObject").get("LetterCode")
                        if letter_code:
                            print(
                                f"...Letter code: {letter_code.get('valueString')} has confidence: {letter_code.confidence}"
                            )
                        amount = item.get("valueObject").get("Amount")
                        if amount:
                            print(f"...Amount: {amount.get('valueNumber')} has confidence: {amount.confidence}")
                is_statutory_employee = w2.fields.get("IsStatutoryEmployee")
                if is_statutory_employee:
                    print(
                        f"Is statutory employee: {is_statutory_employee.get('valueString')} has confidence: {is_statutory_employee.confidence}"
                    )
                is_retirement_plan = w2.fields.get("IsRetirementPlan")
                if is_retirement_plan:
                    print(
                        f"Is retirement plan: {is_retirement_plan.get('valueString')} has confidence: {is_retirement_plan.confidence}"
                    )
                third_party_sick_pay = w2.fields.get("IsThirdPartySickPay")
                if third_party_sick_pay:
                    print(
                        f"Is third party sick pay: {third_party_sick_pay.get('valueString')} has confidence: {third_party_sick_pay.confidence}"
                    )
                other_info = w2.fields.get("Other")
                if other_info:
                    print(f"Other information: {other_info.get('valueString')} has confidence: {other_info.confidence}")
                state_tax_info = w2.fields.get("StateTaxInfos")
                if state_tax_info:
                    print("State Tax info:")
                    for tax in state_tax_info.get("valueArray"):
                        state = tax.get("valueObject").get("State")
                        if state:
                            print(f"...State: {state.get('valueString')} has confidence: {state.confidence}")
                        employer_state_id_number = tax.get("valueObject").get("EmployerStateIdNumber")
                        if employer_state_id_number:
                            print(
                                f"...Employer state ID number: {employer_state_id_number.get('valueString')} has "
                                f"confidence: {employer_state_id_number.confidence}"
                            )
                        state_wages_tips = tax.get("valueObject").get("StateWagesTipsEtc")
                        if state_wages_tips:
                            print(
                                f"...State wages, tips, etc: {state_wages_tips.get('valueNumber')} has confidence: "
                                f"{state_wages_tips.confidence}"
                            )
                        state_income_tax = tax.get("valueObject").get("StateIncomeTax")
                        if state_income_tax:
                            print(
                                f"...State income tax: {state_income_tax.get('valueNumber')} has confidence: "
                                f"{state_income_tax.confidence}"
                            )
                local_tax_info = w2.fields.get("LocalTaxInfos")
                if local_tax_info:
                    print("Local Tax info:")
                    for tax in local_tax_info.get("valueArray"):
                        local_wages_tips = tax.get("valueObject").get("LocalWagesTipsEtc")
                        if local_wages_tips:
                            print(
                                f"...Local wages, tips, etc: {local_wages_tips.get('valueNumber')} has confidence: "
                                f"{local_wages_tips.confidence}"
                            )
                        local_income_tax = tax.get("valueObject").get("LocalIncomeTax")
                        if local_income_tax:
                            print(
                                f"...Local income tax: {local_income_tax.get('valueNumber')} has confidence: "
                                f"{local_income_tax.confidence}"
                            )
                        locality_name = tax.get("valueObject").get("LocalityName")
                        if locality_name:
                            print(
                                f"...Locality name: {locality_name.get('valueString')} has confidence: "
                                f"{locality_name.confidence}"
                            )


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


if __name__ == "__main__":
    analyze_tax_us_w2()

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a W-2 adómodell kimenetét.

A számlamodell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

def analyze_invoice():

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

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

    poller = client.begin_analyze_document(
        "prebuilt-invoice", AnalyzeDocumentRequest(url_source=formUrl), locale="en-US")

    result: AnalyzeResult = poller.result()

    if invoices.documents:
        for idx, invoice in enumerate(invoices.documents):
            print(f"--------Analyzing invoice #{idx + 1}--------")
            if invoice.fields:
                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 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:")
                items = invoice.fields.get("Items")
                if items:
                    for idx, item in enumerate(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()

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a számlamodell kimenetét.

A Nyugtamodell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

def analyze_receipts():
    # sample document
    receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png"

   client = DocumentIntelligenceClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )
    poller = client.begin_analyze_document(
        "prebuilt-receipt", AnalyzeDocumentRequest(url_source=receiptUrl), locale="en-US"
    )
    receipts: AnalyzeResult = poller.result()

    if receipts.documents:
        for idx, receipt in enumerate(receipts.documents):
            print(f"--------Analysis of receipt #{idx + 1}--------")
            print(f"Receipt type: {receipt.doc_type if receipt.doc_type else 'N/A'}")
            if receipt.fields:
                merchant_name = receipt.fields.get("MerchantName")
                if merchant_name:
                    print(
                        f"Merchant Name: {merchant_name.get('valueString')} has confidence: "
                        f"{merchant_name.confidence}"
                    )
                transaction_date = receipt.fields.get("TransactionDate")
                if transaction_date:
                    print(
                        f"Transaction Date: {transaction_date.get('valueDate')} has confidence: "
                        f"{transaction_date.confidence}"
                    )
                items = receipt.fields.get("Items")
                if items:
                    print("Receipt items:")
                    for idx, item in enumerate(items.get("valueArray")):
                        print(f"...Item #{idx + 1}")
                        item_description = item.get("valueObject").get("Description")
                        if item_description:
                            print(
                                f"......Item Description: {item_description.get('valueString')} has confidence: "
                                f"{item_description.confidence}"
                            )
                        item_quantity = item.get("valueObject").get("Quantity")
                        if item_quantity:
                            print(
                                f"......Item Quantity: {item_quantity.get('valueString')} has confidence: "
                                f"{item_quantity.confidence}"
                            )
                        item_total_price = item.get("valueObject").get("TotalPrice")
                        if item_total_price:
                            print(
                                f"......Total Item Price: {format_price(item_total_price.get('valueCurrency'))} has confidence: "
                                f"{item_total_price.confidence}"
                            )
                subtotal = receipt.fields.get("Subtotal")
                if subtotal:
                    print(
                        f"Subtotal: {format_price(subtotal.get('valueCurrency'))} has confidence: {subtotal.confidence}"
                    )
                tax = receipt.fields.get("TotalTax")
                if tax:
                    print(f"Total tax: {format_price(tax.get('valueCurrency'))} has confidence: {tax.confidence}")
                tip = receipt.fields.get("Tip")
                if tip:
                    print(f"Tip: {format_price(tip.get('valueCurrency'))} has confidence: {tip.confidence}")
                total = receipt.fields.get("Total")
                if total:
                    print(f"Total: {format_price(total.get('valueCurrency'))} has confidence: {total.confidence}")
            print("--------------------------------------")



if __name__ == "__main__":
    analyze_receipts()

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a nyugtamodell kimenetét.

Az azonosító dokumentummodell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

def analyze_identity_documents():
# sample document
    identityUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png"

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

    poller =client.begin_analyze_document(
            "prebuilt-idDocument", AnalyzeDocumentRequest(url_source=identityUrl)
        )
     id_documents: AnalyzeResult = poller.result()

    if id_documents.documents:
        for idx, id_document in enumerate(id_documents.documents):
            print(f"--------Analyzing ID document #{idx + 1}--------")
            if id_document.fields:
                first_name = id_document.fields.get("FirstName")
                if first_name:
                    print(f"First Name: {first_name.get('valueString')} has confidence: {first_name.confidence}")
                last_name = id_document.fields.get("LastName")
                if last_name:
                    print(f"Last Name: {last_name.get('valueString')} has confidence: {last_name.confidence}")
                document_number = id_document.fields.get("DocumentNumber")
                if document_number:
                    print(
                        f"Document Number: {document_number.get('valueString')} has confidence: {document_number.confidence}"
                    )
                dob = id_document.fields.get("DateOfBirth")
                if dob:
                    print(f"Date of Birth: {dob.get('valueDate')} has confidence: {dob.confidence}")
                doe = id_document.fields.get("DateOfExpiration")
                if doe:
                    print(f"Date of Expiration: {doe.get('valueDate')} has confidence: {doe.confidence}")
                sex = id_document.fields.get("Sex")
                if sex:
                    print(f"Sex: {sex.get('valueString')} has confidence: {sex.confidence}")
                address = id_document.fields.get("Address")
                if address:
                    print(f"Address: {address.get('valueString')} has confidence: {address.confidence}")
                country_region = id_document.fields.get("CountryRegion")
                if country_region:
                    print(
                        f"Country/Region: {country_region.get('valueCountryRegion')} has confidence: {country_region.confidence}"
                    )
                region = id_document.fields.get("Region")
                if region:
                    print(f"Region: {region.get('valueString')} has confidence: {region.confidence}")


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

if __name__ == "__main__":
    analyze_identity_documents()

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg az azonosító dokumentummodell kimenetét.

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 futtatva 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. Tekintse meg a Python használatának első lépéseit a Visual Studio Code-ban.

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos szolgáltatást. 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 alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

  • Dokumentumfájl URL-címen. Ebben a projektben az alábbi táblázatban szereplő mintaűrlapokat használhatja az egyes funkciókhoz:

    Szolgáltatás modelID dokumentum url-címe
    Modell olvasása előre összeállított olvasás Minta brosúra
    Elrendezési modell előre összeállított elrendezés Foglalási visszaigazolás mintája
    W-2 űrlapmodell prebuilt-tax.us.w2 W-2 mintaűrlap
    Számlamodell előre összeállított számla Mintaszámla
    Nyugtamodell előre összeállított nyugta Minta nyugta
    Azonosító dokumentummodell előre összeállított-idDocument Mintaazonosító dokumentum
    Névjegykártya-modell előre összeállított-businessCard Névjegykártya minta

Környezeti változók beállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez példányosíthatja az ügyfelet az Ön key és endpoint az Azure Portal használatával. Ebben a projektben környezeti változókkal tárolhatja és érheti el a hitelesítő adatokat.

Fontos

HA API-kulcsot használ, biztonságosan tárolja valahol máshol, például az Azure Key Vaultban. Ne foglalja bele közvetlenül az API-kulcsot a kódba, és soha ne tegye közzé nyilvánosan.

Az AI-szolgáltatások biztonságáról további információt az Azure AI-szolgáltatásokhoz érkező kérelmek hitelesítése című témakörben talál.

A Dokumentumintelligencia erőforráskulcs környezeti változójának beállításához nyisson meg egy konzolablakot, és kövesse az operációs rendszer és a fejlesztési környezet utasításait. Cserélje le aKey> és <a YourEndpoint> értékét az azure portalon található erőforrás értékeire.<

A Windows környezeti változói nem érzékenyek a kis- és nagybetűkre. Ezek általában nagybetűvel vannak deklarálva, aláhúzással összekapcsolt szavakkal. A parancssorban futtassa a következő parancsokat:

  1. Állítsa be a kulcsváltozót:

    setx DI_KEY <yourKey>
    
  2. A végpontváltozó beállítása

    setx DI_ENDPOINT <yourEndpoint>
    
  3. Zárja be a parancssori ablakot a környezeti változók beállítása után. Az értékek mindaddig megmaradnak, amíg újra nem módosítja őket.

  4. Indítsa újra a környezeti változót olvasó futó programokat. Ha például a Visual Studio-t vagy a Visual Studio Code-ot használja szerkesztőként, indítsa újra a mintakód futtatása előtt.

Íme néhány hasznosabb parancs a környezeti változókkal való használathoz:

Parancs Művelet Példa
setx VARIABLE_NAME= Törölje a környezeti változót úgy, hogy az értéket üres sztringre állítja. setx DI_KEY=
setx VARIABLE_NAME=value Környezeti változó értékének beállítása vagy módosítása. setx DI_KEY=<yourKey>
set VARIABLE_NAME Egy adott környezeti változó értékének megjelenítése. set DI_KEY
set Az összes környezeti változó megjelenítése. set

A programozási környezet beállítása

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

pip install azure-ai-formrecognizer==3.2.0

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 DocumentAnalysisClient . Ehhez létre kell hoznia egy AzureKeyCredential kulcsot az Azure Portalról, valamint egy példányt DocumentAnalysisClient a AzureKeyCredential dokumentumintelligencia-végponttal.

  1. Hozzon létre egy form_recognizer_quickstart.py nevű új Python-fájlt egy szerkesztőben vagy IDE-ben.

  2. Nyissa meg a form_recognizer_quickstart.py fájlt, és válasszon az alábbi kódminták közül, és másolja/illessze be az alkalmazásba:

    • Az előre összeállított olvasási modell az összes Dokumentumintelligencia-modell középpontjában áll, és képes észlelni a vonalakat, szavakat, helyeket és nyelveket. Az elrendezés, az általános dokumentum, az előre összeállított és az egyéni modellek mind a modellt használják a read szövegek dokumentumokból való kinyerése alapjául.
    • Az előre összeállított elrendezési modell szöveg- és szöveghelyeket, táblázatokat, kijelölési jeleket és szerkezeti információkat nyer ki a dokumentumokból és képekből.
    • Az előre összeállított-tax.us.w2 modell kinyeri az USA belső bevételi szolgáltatásának (IRS) adózási űrlapjairól jelentett információkat.
    • Az előre összeállított számlamodell különböző formátumokban nyeri ki a kulcsmezőket és a sorelemeket az értékesítési számlákból.
    • Az előre összeállított nyugtamodell a nyomtatott és kézzel írt értékesítési nyugtákból nyeri ki a kulcsadatokat.
    • Az előre összeállított idDocument modell kulcsfontosságú információkat nyer ki az USA-beli jogosítványokból; nemzetközi útlevél-életrajzi oldalakról; USA-beli államazonosítók; társadalombiztosítási kártyák; és állandó rezidens kártyákat.
  3. Futtassa a Python-kódot a parancssorból.

    python form_recognizer_quickstart.py
    

Az Olvasási modell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

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


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

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

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

    print("Document contains content: ", result.content)

    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 Read 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):
            print(
                "...Line # {} has text content '{}' within bounding box '{}'".format(
                    line_idx,
                    line.content,
                    format_polygon(line.polygon),
                )
            )

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

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


if __name__ == "__main__":
    analyze_read()

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a modell kimenetétread.

Az Elrendezési modell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

# formatting function
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/rest-api/layout.png"

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az elrendezési modell kimenetét.

Az Általános dokumentummodell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

# formatting function
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)

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


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

    # create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    document_analysis_client = DocumentAnalysisClient(endpoint=endpoint, credential=AzureKeyCredential(key))

    poller = document_analysis_client.begin_analyze_document_from_url(
            "prebuilt-document", docUrl)
    result = poller.result()

    for style in result.styles:
        if style.is_handwritten:
            print("Document contains handwritten content: ")
            print(",".join([result.content[span.offset:span.offset + span.length] for span in style.spans]))

    print("----Key-value pairs found in document----")
    for kv_pair in result.key_value_pairs:
        if kv_pair.key:
            print(
                    "Key '{}' found within '{}' bounding regions".format(
                        kv_pair.key.content,
                        format_bounding_region(kv_pair.key.bounding_regions),
                    )
                )
        if kv_pair.value:
            print(
                    "Value '{}' found within '{}' bounding regions\n".format(
                        kv_pair.value.content,
                        format_bounding_region(kv_pair.value.bounding_regions),
                    )
                )

    for page in result.pages:
        print("----Analyzing document 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):
            print(
                "...Line # {} has text content '{}' within bounding box '{}'".format(
                    line_idx,
                    line.content,
                    format_polygon(line.polygon),
                )
            )

        for word in page.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 '{}'\n".format(
                        region.page_number,
                        format_polygon(region.polygon),
                    )
                )
    print("----------------------------------------")


if __name__ == "__main__":
    analyze_general_documents()

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg az általános dokumentummodell kimenetét.

A W-2 adómodell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

# formatting function
def format_address_value(address_value):
    return f"\n......House/building number: {address_value.house_number}\n......Road: {address_value.road}\n......City: {address_value.city}\n......State: {address_value.state}\n......Postal code: {address_value.postal_code}"


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

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

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-tax.us.w2", formUrl
    )
    w2s = poller.result()

    for idx, w2 in enumerate(w2s.documents):
         print("--------Analyzing US Tax W-2 Form #{}--------".format(idx   1))
        form_variant = w2.fields.get("W2FormVariant")
        if form_variant:
            print(
                "Form variant: {} has confidence: {}".format(
                    form_variant.value, form_variant.confidence
                )
            )
        tax_year = w2.fields.get("TaxYear")
        if tax_year:
            print(
                "Tax year: {} has confidence: {}".format(
                    tax_year.value, tax_year.confidence
                )
            )
        w2_copy = w2.fields.get("W2Copy")
        if w2_copy:
            print(
                "W-2 Copy: {} has confidence: {}".format(
                    w2_copy.value,
                    w2_copy.confidence,
                )
            )
        employee = w2.fields.get("Employee")
        if employee:
            print("Employee data:")
            employee_name = employee.value.get("Name")
            if employee_name:
                print(
                    "...Name: {} has confidence: {}".format(
                        employee_name.value, employee_name.confidence
                    )
                )
            employee_ssn = employee.value.get("SocialSecurityNumber")
            if employee_ssn:
                print(
                    "...SSN: {} has confidence: {}".format(
                        employee_ssn.value, employee_ssn.confidence
                    )
                )
            employee_address = employee.value.get("Address")
            if employee_address:
                print(
                    "...Address: {}\n......has confidence: {}".format(
                        format_address_value(employee_address.value),
                        employee_address.confidence,
                    )
                )
            employee_zipcode = employee.value.get("ZipCode")
            if employee_zipcode:
                print(
                    "...Zipcode: {} has confidence: {}".format(
                        employee_zipcode.value, employee_zipcode.confidence
                    )
                )
        control_number = w2.fields.get("ControlNumber")
        if control_number:
            print(
                "Control Number: {} has confidence: {}".format(
                    control_number.value, control_number.confidence
                )
            )
        employer = w2.fields.get("Employer")
        if employer:
            print("Employer data:")
            employer_name = employer.value.get("Name")
            if employer_name:
                print(
                    "...Name: {} has confidence: {}".format(
                        employer_name.value, employer_name.confidence
                    )
                )
            employer_id = employer.value.get("IdNumber")
            if employer_id:
                print(
                    "...ID Number: {} has confidence: {}".format(
                        employer_id.value, employer_id.confidence
                    )
                )
            employer_address = employer.value.get("Address")
            if employer_address:
                print(
                    "...Address: {}\n......has confidence: {}".format(
                        format_address_value(employer_address.value),
                        employer_address.confidence,
                    )
                )
            employer_zipcode = employer.value.get("ZipCode")
            if employer_zipcode:
                print(
                    "...Zipcode: {} has confidence: {}".format(
                        employer_zipcode.value, employer_zipcode.confidence
                    )
                )
        wages_tips = w2.fields.get("WagesTipsAndOtherCompensation")
        if wages_tips:
            print(
                "Wages, tips, and other compensation: {} has confidence: {}".format(
                    wages_tips.value,
                    wages_tips.confidence,
                )
            )
        fed_income_tax_withheld = w2.fields.get("FederalIncomeTaxWithheld")
        if fed_income_tax_withheld:
            print(
                "Federal income tax withheld: {} has confidence: {}".format(
                    fed_income_tax_withheld.value, fed_income_tax_withheld.confidence
                )
            )
        social_security_wages = w2.fields.get("SocialSecurityWages")
        if social_security_wages:
            print(
                "Social Security wages: {} has confidence: {}".format(
                    social_security_wages.value, social_security_wages.confidence
                )
            )
        social_security_tax_withheld = w2.fields.get("SocialSecurityTaxWithheld")
        if social_security_tax_withheld:
            print(
                "Social Security tax withheld: {} has confidence: {}".format(
                    social_security_tax_withheld.value,
                    social_security_tax_withheld.confidence,
                )
            )
        medicare_wages_tips = w2.fields.get("MedicareWagesAndTips")
        if medicare_wages_tips:
            print(
                "Medicare wages and tips: {} has confidence: {}".format(
                    medicare_wages_tips.value, medicare_wages_tips.confidence
                )
            )
        medicare_tax_withheld = w2.fields.get("MedicareTaxWithheld")
        if medicare_tax_withheld:
            print(
                "Medicare tax withheld: {} has confidence: {}".format(
                    medicare_tax_withheld.value, medicare_tax_withheld.confidence
                )
            )
        social_security_tips = w2.fields.get("SocialSecurityTips")
        if social_security_tips:
            print(
                "Social Security tips: {} has confidence: {}".format(
                    social_security_tips.value, social_security_tips.confidence
                )
            )
        allocated_tips = w2.fields.get("AllocatedTips")
        if allocated_tips:
            print(
                "Allocated tips: {} has confidence: {}".format(
                    allocated_tips.value,
                    allocated_tips.confidence,
                )
            )
        verification_code = w2.fields.get("VerificationCode")
        if verification_code:
            print(
                "Verification code: {} has confidence: {}".format(
                    verification_code.value, verification_code.confidence
                )
            )
        dependent_care_benefits = w2.fields.get("DependentCareBenefits")
        if dependent_care_benefits:
            print(
                "Dependent care benefits: {} has confidence: {}".format(
                    dependent_care_benefits.value,
                    dependent_care_benefits.confidence,
                )
            )
        non_qualified_plans = w2.fields.get("NonQualifiedPlans")
        if non_qualified_plans:
            print(
                "Non-qualified plans: {} has confidence: {}".format(
                    non_qualified_plans.value,
                    non_qualified_plans.confidence,
                )
            )
        additional_info = w2.fields.get("AdditionalInfo")
        if additional_info:
            print("Additional information:")
            for item in additional_info.value:
                letter_code = item.value.get("LetterCode")
                if letter_code:
                    print(
                        "...Letter code: {} has confidence: {}".format(
                            letter_code.value, letter_code.confidence
                        )
                    )
                amount = item.value.get("Amount")
                if amount:
                    print(
                        "...Amount: {} has confidence: {}".format(
                            amount.value, amount.confidence
                        )
                    )
        is_statutory_employee = w2.fields.get("IsStatutoryEmployee")
        if is_statutory_employee:
            print(
                "Is statutory employee: {} has confidence: {}".format(
                    is_statutory_employee.value, is_statutory_employee.confidence
                )
            )
        is_retirement_plan = w2.fields.get("IsRetirementPlan")
        if is_retirement_plan:
            print(
                "Is retirement plan: {} has confidence: {}".format(
                    is_retirement_plan.value, is_retirement_plan.confidence
                )
            )
        third_party_sick_pay = w2.fields.get("IsThirdPartySickPay")
        if third_party_sick_pay:
            print(
                "Is third party sick pay: {} has confidence: {}".format(
                    third_party_sick_pay.value, third_party_sick_pay.confidence
                )
            )
        other_info = w2.fields.get("Other")
        if other_info:
            print(
                "Other information: {} has confidence: {}".format(
                    other_info.value,
                    other_info.confidence,
                )
            )
        state_tax_info = w2.fields.get("StateTaxInfos")
        if state_tax_info:
            print("State Tax info:")
            for tax in state_tax_info.value:
                state = tax.value.get("State")
                if state:
                    print(
                        "...State: {} has confidence: {}".format(
                            state.value, state.confidence
                        )
                    )
                employer_state_id_number = tax.value.get("EmployerStateIdNumber")
                if employer_state_id_number:
                    print(
                        "...Employer state ID number: {} has confidence: {}".format(
                            employer_state_id_number.value,
                            employer_state_id_number.confidence,
                        )
                    )
                state_wages_tips = tax.value.get("StateWagesTipsEtc")
                if state_wages_tips:
                    print(
                        "...State wages, tips, etc: {} has confidence: {}".format(
                            state_wages_tips.value, state_wages_tips.confidence
                        )
                    )
                state_income_tax = tax.value.get("StateIncomeTax")
                if state_income_tax:
                    print(
                        "...State income tax: {} has confidence: {}".format(
                            state_income_tax.value, state_income_tax.confidence
                        )
                    )
        local_tax_info = w2.fields.get("LocalTaxInfos")
        if local_tax_info:
            print("Local Tax info:")
            for tax in local_tax_info.value:
                local_wages_tips = tax.value.get("LocalWagesTipsEtc")
                if local_wages_tips:
                    print(
                        "...Local wages, tips, etc: {} has confidence: {}".format(
                            local_wages_tips.value, local_wages_tips.confidence
                        )
                    )
                local_income_tax = tax.value.get("LocalIncomeTax")
                if local_income_tax:
                    print(
                        "...Local income tax: {} has confidence: {}".format(
                            local_income_tax.value, local_income_tax.confidence
                        )
                    )
                locality_name = tax.value.get("LocalityName")
                if locality_name:
                    print(
                        "...Locality name: {} has confidence: {}".format(
                            locality_name.value, locality_name.confidence
                        )
                    )

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


if __name__ == "__main__":
    analyze_tax_us_w2()

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a W-2 adómodell kimenetét.

A számlamodell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

# formatting function
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)

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

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a számlamodell kimenetét.

A Nyugtamodell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

def analyze_receipts():
    # sample document
    receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )
    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-receipt", receiptUrl, locale="en-US"
    )
    receipts = poller.result()
    for idx, receipt in enumerate(receipts.documents):
         print("--------Analysis of receipt #{}--------".format(idx   1))
        print("Receipt type: {}".format(receipt.doc_type or "N/A"))
        merchant_name = receipt.fields.get("MerchantName")
        if merchant_name:
            print(
                "Merchant Name: {} has confidence: {}".format(
                    merchant_name.value, merchant_name.confidence
                )
            )
        transaction_date = receipt.fields.get("TransactionDate")
        if transaction_date:
            print(
                "Transaction Date: {} has confidence: {}".format(
                    transaction_date.value, transaction_date.confidence
                )
            )
        if receipt.fields.get("Items"):
            print("Receipt items:")
            for idx, item in enumerate(receipt.fields.get("Items").value):
                 print("...Item #{}".format(idx   1))
                item_description = item.value.get("Description")
                if item_description:
                    print(
                        "......Item Description: {} has confidence: {}".format(
                            item_description.value, item_description.confidence
                        )
                    )
                item_quantity = item.value.get("Quantity")
                if item_quantity:
                    print(
                        "......Item Quantity: {} has confidence: {}".format(
                            item_quantity.value, item_quantity.confidence
                        )
                    )
                item_price = item.value.get("Price")
                if item_price:
                    print(
                        "......Individual Item Price: {} has confidence: {}".format(
                            item_price.value, item_price.confidence
                        )
                    )
                item_total_price = item.value.get("TotalPrice")
                if item_total_price:
                    print(
                        "......Total Item Price: {} has confidence: {}".format(
                            item_total_price.value, item_total_price.confidence
                        )
                    )
        subtotal = receipt.fields.get("Subtotal")
        if subtotal:
            print(
                "Subtotal: {} has confidence: {}".format(
                    subtotal.value, subtotal.confidence
                )
            )
        tax = receipt.fields.get("TotalTax")
        if tax:
            print("Total tax: {} has confidence: {}".format(tax.value, tax.confidence))
        tip = receipt.fields.get("Tip")
        if tip:
            print("Tip: {} has confidence: {}".format(tip.value, tip.confidence))
        total = receipt.fields.get("Total")
        if total:
            print("Total: {} has confidence: {}".format(total.value, total.confidence))
        print("--------------------------------------")


if __name__ == "__main__":
    analyze_receipts()

Látogasson el a GitHub Azure-mintaadattárába, és tekintse meg a nyugtamodell kimenetét.

Az azonosító dokumentummodell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

def analyze_identity_documents():
# sample document
    identityUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png"

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

    poller = document_analysis_client.begin_analyze_document_from_url(
            "prebuilt-idDocument", identityUrl
        )
    id_documents = poller.result()

    for idx, id_document in enumerate(id_documents.documents):
        print("--------Analyzing ID document #{}--------".format(idx + 1))
        first_name = id_document.fields.get("FirstName")
        if first_name:
            print(
                "First Name: {} has confidence: {}".format(
                    first_name.value, first_name.confidence
                )
            )
        last_name = id_document.fields.get("LastName")
        if last_name:
            print(
                "Last Name: {} has confidence: {}".format(
                    last_name.value, last_name.confidence
                )
            )
        document_number = id_document.fields.get("DocumentNumber")
        if document_number:
            print(
                "Document Number: {} has confidence: {}".format(
                    document_number.value, document_number.confidence
                )
            )
        dob = id_document.fields.get("DateOfBirth")
        if dob:
            print(
                "Date of Birth: {} has confidence: {}".format(dob.value, dob.confidence)
            )
        doe = id_document.fields.get("DateOfExpiration")
        if doe:
            print(
                "Date of Expiration: {} has confidence: {}".format(
                    doe.value, doe.confidence
                )
            )
        sex = id_document.fields.get("Sex")
        if sex:
            print("Sex: {} has confidence: {}".format(sex.value, sex.confidence))
        address = id_document.fields.get("Address")
        if address:
            print(
                "Address: {} has confidence: {}".format(
                    address.value, address.confidence
                )
            )
        country_region = id_document.fields.get("CountryRegion")
        if country_region:
            print(
                "Country/Region: {} has confidence: {}".format(
                    country_region.value, country_region.confidence
                )
            )
        region = id_document.fields.get("Region")
        if region:
            print(
                "Region: {} has confidence: {}".format(region.value, region.confidence)
            )

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

if __name__ == "__main__":
    analyze_identity_documents()

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg az azonosító dokumentummodell kimenetét.

A névjegykártya-modell használata

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

def analyze_business_card():
      # sample document
    businessCardUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg"

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

    poller = document_analysis_client.begin_analyze_document_from_url(
            "prebuilt-businessCard", businessCardUrl, locale="en-US"
        )
    business_cards = poller.result()

    for idx, business_card in enumerate(business_cards.documents):
        print("--------Analyzing business card #{}--------".format(idx + 1))
        contact_names = business_card.fields.get("ContactNames")
        if contact_names:
            for contact_name in contact_names.value:
                print(
                    "Contact First Name: {} has confidence: {}".format(
                        contact_name.value["FirstName"].value,
                        contact_name.value[
                            "FirstName"
                        ].confidence,
                    )
                )
                print(
                    "Contact Last Name: {} has confidence: {}".format(
                        contact_name.value["LastName"].value,
                        contact_name.value[
                            "LastName"
                        ].confidence,
                    )
                )
        company_names = business_card.fields.get("CompanyNames")
        if company_names:
            for company_name in company_names.value:
                print(
                    "Company Name: {} has confidence: {}".format(
                        company_name.value, company_name.confidence
                    )
                )
        departments = business_card.fields.get("Departments")
        if departments:
            for department in departments.value:
                print(
                    "Department: {} has confidence: {}".format(
                        department.value, department.confidence
                    )
                )
        job_titles = business_card.fields.get("JobTitles")
        if job_titles:
            for job_title in job_titles.value:
                print(
                    "Job Title: {} has confidence: {}".format(
                        job_title.value, job_title.confidence
                    )
                )
        emails = business_card.fields.get("Emails")
        if emails:
            for email in emails.value:
                print(
                    "Email: {} has confidence: {}".format(email.value, email.confidence)
                )
        websites = business_card.fields.get("Websites")
        if websites:
            for website in websites.value:
                print(
                    "Website: {} has confidence: {}".format(
                        website.value, website.confidence
                    )
                )
        addresses = business_card.fields.get("Addresses")
        if addresses:
            for address in addresses.value:
                print(
                    "Address: {} has confidence: {}".format(
                        address.value, address.confidence
                    )
                )
        mobile_phones = business_card.fields.get("MobilePhones")
        if mobile_phones:
            for phone in mobile_phones.value:
                print(
                    "Mobile phone number: {} has confidence: {}".format(
                        phone.content, phone.confidence
                    )
                )
        faxes = business_card.fields.get("Faxes")
        if faxes:
            for fax in faxes.value:
                print(
                    "Fax number: {} has confidence: {}".format(
                        fax.content, fax.confidence
                    )
                )
        work_phones = business_card.fields.get("WorkPhones")
        if work_phones:
            for work_phone in work_phones.value:
                print(
                    "Work phone number: {} has confidence: {}".format(
                        work_phone.content, work_phone.confidence
                    )
                )
        other_phones = business_card.fields.get("OtherPhones")
        if other_phones:
            for other_phone in other_phones.value:
                print(
                    "Other phone number: {} has confidence: {}".format(
                        other_phone.value, other_phone.confidence
                    )
                )

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

if __name__ == "__main__":
    analyze_business_card()

Látogasson el az Azure-minták adattárába a GitHubon, és tekintse meg a névjegykártya-modell kimenetét.

Feljegyzés

Ez a projekt a cURL parancssori eszközét használja a REST API-hívások végrehajtásához.

| A Document Intelligence REST API | által támogatott Azure SDK-k

Előfeltételek

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

  • A cURL parancssori eszköz telepítve van. A Windows 10 és a Windows 11 a cURL egy példányát szállítja. A parancssorba írja be a következő cURL-parancsot. Ha megjelennek a súgóbeállítások, a cURL telepítve van a Windows-környezetben.

    curl -help
    

    Ha a cURL nincs telepítve, itt szerezheti be:

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos szolgáltatást. 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 alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

Környezeti változók beállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez példányosíthatja az ügyfelet az Ön key és endpoint az Azure Portal használatával. Ebben a projektben környezeti változókkal tárolhatja és érheti el a hitelesítő adatokat.

Fontos

HA API-kulcsot használ, biztonságosan tárolja valahol máshol, például az Azure Key Vaultban. Ne foglalja bele közvetlenül az API-kulcsot a kódba, és soha ne tegye közzé nyilvánosan.

Az AI-szolgáltatások biztonságáról további információt az Azure AI-szolgáltatásokhoz érkező kérelmek hitelesítése című témakörben talál.

A Dokumentumintelligencia erőforráskulcs környezeti változójának beállításához nyisson meg egy konzolablakot, és kövesse az operációs rendszer és a fejlesztési környezet utasításait. Cserélje le aKey> és <a YourEndpoint> értékét az azure portalon található erőforrás értékeire.<

A Windows környezeti változói nem érzékenyek a kis- és nagybetűkre. Ezek általában nagybetűvel vannak deklarálva, aláhúzással összekapcsolt szavakkal. A parancssorban futtassa a következő parancsokat:

  1. Állítsa be a kulcsváltozót:

    setx DI_KEY <yourKey>
    
  2. A végpontváltozó beállítása

    setx DI_ENDPOINT <yourEndpoint>
    
  3. Zárja be a parancssori ablakot a környezeti változók beállítása után. Az értékek mindaddig megmaradnak, amíg újra nem módosítja őket.

  4. Indítsa újra a környezeti változót olvasó futó programokat. Ha például a Visual Studio-t vagy a Visual Studio Code-ot használja szerkesztőként, indítsa újra a mintakód futtatása előtt.

Íme néhány hasznosabb parancs a környezeti változókkal való használathoz:

Parancs Művelet Példa
setx VARIABLE_NAME= Törölje a környezeti változót úgy, hogy az értéket üres sztringre állítja. setx DI_KEY=
setx VARIABLE_NAME=value Környezeti változó értékének beállítása vagy módosítása. setx DI_KEY=<yourKey>
set VARIABLE_NAME Egy adott környezeti változó értékének megjelenítése. set DI_KEY
set Az összes környezeti változó megjelenítése. set

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.

Használja az alábbi táblázatot hivatkozásként. Cserélje le a modelId> és <a dokumentum URL-címét> a kívánt értékekre:<

Modell modelId leírás dokumentum url-címe
Modell olvasása előre összeállított olvasás Minta brosúra https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Elrendezési modell előre összeállított elrendezés Foglalási visszaigazolás mintája https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
W-2 űrlapmodell prebuilt-tax.us.w2 W-2 mintaűrlap https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Számlamodell előre összeállított számla Mintaszámla https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Nyugtamodell előre összeállított nyugta Minta nyugta https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Azonosító dokumentummodell előre összeállított-idDocument Mintaazonosító dokumentum https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

POST kérés

Nyisson meg egy konzolablakot, és futtassa a következő cURL-parancsot. A parancsok tartalmazzák a korábban a beállított környezeti változók szakaszban létrehozott végpont- és kulcskörnyezeti változókat. Cserélje le ezeket a változókat, ha a változónevek eltérnek. Ne felejtse el lecserélni a modelId> és <a< dokumentum URL-paramétereit.>

curl -i -X POST "%DI_ENDPOINT%/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-02-29-preview" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: %DI_KEY%" --data-ascii "{'urlSource': '<document-url>'}"

A bővítmény képességeinek engedélyezéséhez használja a features lekérdezési paramétert a POST-kérelemben. A (GA) és a későbbi kiadásokban 2023-07-31 négy bővítmény érhető el: ocr.highResolution, ocr.formula, ocr.font és queryFields.premium. Az egyes képességekről további információt az Egyéni modellek című témakörben talál.

Csak az olvasási és elrendezési modell highResolution, formula és font képességeit, valamint az Általános dokumentumok modell lekérdezésmezős képességét hívhatja meg. Az alábbi példa bemutatja, hogyan hívhatja meg a highResolution, a képlet és a betűtípus képességeit az elrendezési modellhez.

curl -i -X POST "%DI_ENDPOINT%documentintelligence/documentModels/prebuilt-layout:analyze?features=ocr.highResolution,ocr.formula,ocr.font?api-version=2024-02-29-preview" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: %DI_KEY%" --data-ascii "{'urlSource': '<document-url>'}"

POST válasz

Egy fejlécet 202 (Success) Operation-location tartalmazó választ kap. A válasz eredményének lekéréséhez használja ennek a fejlécnek az értékét.

Képernyőkép a POST-válaszról, amelyen a művelet helye ki van emelve.

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

Az API meghívása után hívja meg a Analyze document [Get analyze result}(/rest/api/aiservices/document-models/get-analyze-result?view=rest-aiservices-2024-02-29-preview&preserve-view=true&tabs=HTTP) API-t a művelet és a kinyert adatok állapotának lekéréséhez.

A cURL parancssori eszköz nem formázza a JSON-tartalmat tartalmazó API-válaszokat, ami megnehezítheti a tartalom olvasását. A JSON-válasz formázásához adja meg a cső karakterét, majd egy JSON-formázási eszközt a GET-kéréssel.

Használja a NodeJS json eszközt a cURL JSON-formázójaként. Ha nincs telepítve Node.js , töltse le és telepítse a legújabb verziót.

  1. Nyisson meg egy konzolablakot, és telepítse a json eszközt az alábbi paranccsal:

    npm install -g jsontool
    
  2. Elég kinyomtatni a JSON-kimenetet úgy, hogy beírja a cső karaktert | json a GET-kérelmekbe.

    curl -i -X GET "<endpoint>documentintelligence/documentModels/prebuilt-read/analyzeResults/0e49604a-2d8e-4b15-b6b8-bb456e5d3e0a?api-version=2024-02-29-preview"-H "Ocp-Apim-Subscription-Key: <subscription key>" | json
    

GET kérés

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

  • Cserélje le <a POST választ> a Operation-location POST válasz fejlécére.
  • Cserélje le <DI_KEY a környezeti változó változóra, ha az eltér a kódban szereplő névtől.
  • Cserélje le a *<json-eszközt> a JSON-formázási eszközre.
curl -i -X GET "<POST response>" -H "Ocp-Apim-Subscription-Key: %DI_KEY%" | `<json-tool>`

A válasz vizsgálata

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

Látogasson el a GitHub Azure-mintaadattárába az GET egyes Dokumentumintelligencia-modellek válaszának megtekintéséhez:

Modell Kimeneti URL-cím
Modell olvasása Modell kimenetének olvasása
Elrendezési modell Elrendezési modell kimenete
W-2 adómodell W-2 adómodell kimenete
Számlamodell Számlamodell kimenete
Nyugtamodell Nyugtamodell kimenete
Azonosító dokumentummodell Azonosító dokumentummodell kimenete

Feljegyzés

Ez a projekt a cURL parancssori eszközzel hajtja végre a REST API-hívásokat.

Előfeltételek

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

  • A cURL parancssori eszköz telepítve van. A Windows 10 és a Windows 11 a cURL egy példányát szállítja. A parancssorba írja be a következő cURL-parancsot. Ha megjelennek a súgóbeállítások, a cURL telepítve van a Windows-környezetben.

    curl -help
    

    Ha a cURL nincs telepítve, itt szerezheti be:

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos szolgáltatást. 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 alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

Környezeti változók beállítása

A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient . Ehhez példányosíthatja az ügyfelet az Ön key és endpoint az Azure Portal használatával. Ebben a projektben környezeti változókkal tárolhatja és érheti el a hitelesítő adatokat.

Fontos

HA API-kulcsot használ, biztonságosan tárolja valahol máshol, például az Azure Key Vaultban. Ne foglalja bele közvetlenül az API-kulcsot a kódba, és soha ne tegye közzé nyilvánosan.

Az AI-szolgáltatások biztonságáról további információt az Azure AI-szolgáltatásokhoz érkező kérelmek hitelesítése című témakörben talál.

A Dokumentumintelligencia erőforráskulcs környezeti változójának beállításához nyisson meg egy konzolablakot, és kövesse az operációs rendszer és a fejlesztési környezet utasításait. Cserélje le aKey> és <a YourEndpoint> értékét az azure portalon található erőforrás értékeire.<

A Windows környezeti változói nem érzékenyek a kis- és nagybetűkre. Ezek általában nagybetűvel vannak deklarálva, aláhúzással összekapcsolt szavakkal. A parancssorban futtassa a következő parancsokat:

  1. Állítsa be a kulcsváltozót:

    setx DI_KEY <yourKey>
    
  2. A végpontváltozó beállítása

    setx DI_ENDPOINT <yourEndpoint>
    
  3. Zárja be a parancssori ablakot a környezeti változók beállítása után. Az értékek mindaddig megmaradnak, amíg újra nem módosítja őket.

  4. Indítsa újra a környezeti változót olvasó futó programokat. Ha például a Visual Studio-t vagy a Visual Studio Code-ot használja szerkesztőként, indítsa újra a mintakód futtatása előtt.

Íme néhány hasznosabb parancs a környezeti változókkal való használathoz:

Parancs Művelet Példa
setx VARIABLE_NAME= Törölje a környezeti változót úgy, hogy az értéket üres sztringre állítja. setx DI_KEY=
setx VARIABLE_NAME=value Környezeti változó értékének beállítása vagy módosítása. setx DI_KEY=<yourKey>
set VARIABLE_NAME Egy adott környezeti változó értékének megjelenítése. set DI_KEY
set Az összes környezeti változó megjelenítése. set

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.

Használja az alábbi táblázatot hivatkozásként. Cserélje le a modelId> és <a dokumentum URL-címét> a kívánt értékekre:<

Modell modelId leírás dokumentum url-címe
Modell olvasása előre összeállított olvasás Minta brosúra https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Elrendezési modell előre összeállított elrendezés Foglalási visszaigazolás mintája https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
W-2 űrlapmodell prebuilt-tax.us.w2 W-2 mintaűrlap https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Számlamodell előre összeállított számla Mintaszámla https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Nyugtamodell előre összeállított nyugta Minta nyugta https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Azonosító dokumentummodell előre összeállított-idDocument Mintaazonosító dokumentum https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

POST kérés

Nyisson meg egy konzolablakot, és futtassa a következő cURL-parancsot. A parancsok tartalmazzák a korábban a beállított környezeti változók szakaszban létrehozott végpont- és kulcskörnyezeti változókat. Cserélje le ezeket a változókat, ha a változónevek eltérnek. Ne felejtse el lecserélni a modelId> és <a< dokumentum URL-paramétereit.>

curl -i -X POST "%FR_ENDPOINT%formrecognizer/documentModels/<modelId>:analyze?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: %FR_KEY%" --data-ascii "{'urlSource': '<document-url>'}"

A bővítmény képességeinek engedélyezéséhez használja a features lekérdezési paramétert a POST-kérelemben. A (GA) kiadásban 2023-07-31 négy bővítmény érhető el: ocr.highResolution, ocr.formula, ocr.font és queryFields.premium. Az egyes képességekről további információt az Egyéni modellek című témakörben talál.

Csak az olvasási és elrendezési modell highResolution, formula és font képességeit, valamint az Általános dokumentumok modell lekérdezésmezős képességét hívhatja meg. Az alábbi példa bemutatja, hogyan hívhatja meg a highResolution, a képlet és a betűtípus képességeit az elrendezési modellhez.

curl -i -X POST "%FR_ENDPOINT%formrecognizer/documentModels/prebuilt-layout:analyze?features=ocr.highResolution,ocr.formula,ocr.font?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: %FR_KEY%" --data-ascii "{'urlSource': '<document-url>'}"

POST válasz

Egy fejlécet 202 (Success) Operation-location tartalmazó választ kap. A válasz eredményének lekéréséhez használja ennek a fejlécnek az értékét.

Képernyőkép a POST-válaszról, amelyen a művelet helye ki van emelve.

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

Az API meghívása után hívja meg a Analyze document [Get analyze result}(/rest/api/aiservices/document-models/get-analyze-result?view=rest-aiservices-2023-07-31&preserve-view=true&tabs=HTTP) API-t a művelet és a kinyert adatok állapotának lekéréséhez.

A cURL parancssori eszköz nem formázza a JSON-tartalmat tartalmazó API-válaszokat, ami megnehezítheti a tartalom olvasását. A JSON-válasz formázásához adja meg a cső karakterét, majd egy JSON-formázási eszközt a GET-kéréssel.

Használja a NodeJS json eszközt a cURL JSON-formázójaként. Ha nincs telepítve Node.js , töltse le és telepítse a legújabb verziót.

  1. Nyisson meg egy konzolablakot, és telepítse a json eszközt az alábbi paranccsal:

    npm install -g jsontool
    
  2. Elég kinyomtatni a JSON-kimenetet úgy, hogy beírja a cső karaktert | json a GET-kérelmekbe.

    curl -i -X GET "<endpoint>formrecognizer/documentModels/prebuilt-read/analyzeResults/0e49604a-2d8e-4b15-b6b8-bb456e5d3e0a?api-version=2023-07-31"-H "Ocp-Apim-Subscription-Key: <subscription key>" | json
    

GET kérés

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

  • Cserélje le <a POST választ> a Operation-location POST válasz fejlécére.
  • Cserélje le <FR_KEY a környezeti változó változóra, ha az eltér a kódban szereplő névtől.
  • Cserélje le a *<json-eszközt> a JSON-formázási eszközre.
curl -i -X GET "<POST response>" -H "Ocp-Apim-Subscription-Key: %FR_KEY%" | `<json-tool>`

A válasz vizsgálata

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

Látogasson el a GitHub Azure-mintaadattárába az GET egyes Dokumentumintelligencia-modellek válaszának megtekintéséhez:

Modell Kimeneti URL-cím
Modell olvasása Modell kimenetének olvasása
Elrendezési modell Elrendezési modell kimenete
W-2 adómodell W-2 adómodell kimenete
Számlamodell Számlamodell kimenete
Nyugtamodell Nyugtamodell kimenete
Azonosító dokumentummodell Azonosító dokumentummodell kimenete

Következő lépések

Gratulálunk! Megtanulta, hogyan elemezhet különböző dokumentumokat dokumentumintelligencia-modellek használatával különböző módokon. Ezután ismerkedjen meg a Document Intelligence Studióval és a referenciadokumentációval.

Ebben az útmutatóban megtudhatja, hogyan adhat hozzá dokumentumintelligencia-adatokat az alkalmazásokhoz és munkafolyamatokhoz. Használjon egy tetszőleges programozási nyelvet vagy a REST API-t. Az Azure AI Document Intelligence egy felhőalapú Azure AI-szolgáltatás, amely gépi tanulással kinyeri a kulcs-érték párokat, szöveget és táblákat a dokumentumokból. 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.

Az alábbi API-k használatával strukturált adatokat nyerhet ki űrlapokból és dokumentumokból:

Fontos

Ez a projekt a Document Intelligence REST API 2.1-es verziójára irányul.

A cikkben szereplő kód szinkron metódusokat és nem biztonságos hitelesítő adatok tárolását használja.

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

Előfeltételek

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

  • A Visual Studio IDE vagy a .NET Core aktuális verziója.

  • Betanítási adatokat tartalmazó Azure Storage-blob. Az egyéni modell összeállítása és betanítása tippeket és lehetőségeket kínál a betanítási adatkészlet összeállításához. Ebben a projektben a mintaadatkészlet Betanítása mappájában lévő fájlokat használhatja. Töltse le és bontsa ki a sample_data.zip.

  • Intelligencia-erőforrás. 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 alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

A programozási környezet beállítása

A konzolablakban a dotnet new paranccsal hozzon létre egy új konzolalkalmazást a névvel formrecognizer-project. Ez a parancs létrehoz egy egyszerű "„Helló világ!” alkalmazás" C#-projektet egyetlen forrásfájllal: program.cs.

dotnet new console -n formrecognizer-project

Módosítsa a könyvtárat az újonnan létrehozott alkalmazásmappára. Az alkalmazást a következő paranccsal hozhatja létre:

dotnet build

A buildkimenet nem tartalmazhat figyelmeztetést vagy hibát.

...
Build succeeded.
 0 Warning(s)
 0 Error(s)
...

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

Az alkalmazáskönyvtárban telepítse a .NET-hez készült Document Intelligence ügyfélkódtárat a következő paranccsal:

dotnet add package Azure.AI.FormRecognizer --version 3.1.1

A projektkönyvtárban nyissa meg a Program.cs fájlt egy szerkesztőben vagy IDE-ben. Adja hozzá a következő using irányelveket:

using Azure;
using Azure.AI.FormRecognizer;  
using Azure.AI.FormRecognizer.Models;
using Azure.AI.FormRecognizer.Training;

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

Az alkalmazás Program osztályában hozzon létre változókat az erőforrás kulcsa és végpontja számára.

Fontos

Nyissa meg az Azure Portalt. Ha az Előfeltételek szakaszban létrehozott dokumentumintelligencia-erőforrás sikeresen üzembe lett helyezve, válassza az Erőforrás megnyitása gombot a Következő lépések csoportban. A bal oldali navigációs menü Erőforrás-kezelés területén válassza a Kulcsok és végpont lehetőséget.

Amikor elkészült, ne felejtse el eltávolítani a kulcsot a kódból. Soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módszerekkel tárolhatja és érheti el a hitelesítő adatait. További információ: Azure AI-szolgáltatások biztonsága.

private static readonly string endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
private static readonly string apiKey = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE";
private static readonly AzureKeyCredential credential = new AzureKeyCredential(apiKey);

Az alkalmazás metódusában Main adjon hozzá egy hívást a projektben használt aszinkron tevékenységekhez:

static void Main(string[] args) {
  // new code:
  var recognizeContent = RecognizeContent(recognizerClient);
  Task.WaitAll(recognizeContent);

  var analyzeReceipt = AnalyzeReceipt(recognizerClient, receiptUrl);
  Task.WaitAll(analyzeReceipt);

  var analyzeBusinessCard = AnalyzeBusinessCard(recognizerClient, bcUrl);
  Task.WaitAll(analyzeBusinessCard);

  var analyzeInvoice = AnalyzeInvoice(recognizerClient, invoiceUrl);
  Task.WaitAll(analyzeInvoice);

  var analyzeId = AnalyzeId(recognizerClient, idUrl);
  Task.WaitAll(analyzeId);

  var trainModel = TrainModel(trainingClient, trainingDataUrl);
  Task.WaitAll(trainModel);

  var trainModelWithLabels = TrainModelWithLabels(trainingClient, trainingDataUrl);
  Task.WaitAll(trainModel);

  var analyzeForm = AnalyzePdfForm(recognizerClient, modelId, formUrl);
  Task.WaitAll(analyzeForm);

  var manageModels = ManageModels(trainingClient, trainingDataUrl);
  Task.WaitAll(manageModels);

}

Az objektummodell használata

A Dokumentumintelligencia segítségével két különböző ügyféltípust hozhat létre. Az első, FormRecognizerClientlekérdezi a szolgáltatást az űrlapmezők és a tartalom felismeréséhez. A második, FormTrainingClientegyéni modelleket hoz létre és kezel a felismerés javítása érdekében.

FormRecognizerClient a következő műveleteket biztosítja:

  • Az űrlapmezők és -tartalmak felismerése az egyéni űrlapok elemzésére betanított egyéni modellek használatával. Ezek az értékek objektumgyűjteményben RecognizedForm jelennek meg. Lásd: Űrlapok elemzése egyéni modellel.
  • A modellek betanítása nélkül felismerhet űrlaptartalmakat, például táblázatokat, sorokat és szavakat. Az űrlaptartalmak egy objektumgyűjteményben FormPage lesznek visszaadva. Lásd: Elemzési elrendezés.
  • Az egyesült államokbeli nyugták, névjegykártyák, számlák és azonosító dokumentumok gyakori mezőinek felismerése a Document Intelligence szolgáltatás előre betanított modelljével.

FormTrainingClient a következő műveletekhez nyújt műveleteket:

  • Egyéni modellek betanítása az egyéni űrlapokban található összes mező és érték elemzéséhez. A CustomFormModel visszaadott érték jelzi a modell által elemzett űrlaptípusokat és az egyes űrlaptípusokhoz kinyert mezőket.
  • Egyéni modellek betanítása a megadott mezők és értékek elemzéséhez az egyéni űrlapok címkézésével. A CustomFormModel visszaadott érték jelzi a modell által kinyert mezőket és az egyes mezők becsült pontosságát.
  • Kezelheti a fiókjában létrehozott modelleket.
  • Egyéni modell másolása egy dokumentumintelligencia-erőforrásból egy másikba.

Példák : Modell betanítása és egyéni modellek kezelése.

Feljegyzés

A modelleket grafikus felhasználói felülettel, például a Mintacímkéző eszközzel is be lehet tanítani.

Az ügyfél hitelesítése

A csoportban Mainhozzon létre egy metódust.AuthenticateClient Ezt a módszert más feladatokban is használhatja a Dokumentumintelligencia szolgáltatáshoz érkező kérések hitelesítéséhez. Ez a metódus az AzureKeyCredential objektumot használja, így szükség esetén új ügyfélobjektumok létrehozása nélkül frissítheti a kulcsot.

private static FormRecognizerClient AuthenticateClient()
{
    var credential = new AzureKeyCredential(apiKey);
    var client = new FormRecognizerClient(new Uri(endpoint), credential);
    return client;
}

Ismételje meg a betanítási ügyfél hitelesítését szolgáló új metódus lépéseit.

static private FormTrainingClient AuthenticateTrainingClient()
{
    var credential = new AzureKeyCredential(apiKey);
    var client = new FormTrainingClient(new Uri(endpoint), credential);
    return client;
}

Eszközök lekérése teszteléshez

A betanítási és tesztelési adatok URL-címeire mutató hivatkozásokat is hozzá kell adnia. Adja hozzá ezeket a hivatkozásokat az osztály gyökeréhez Program .

  1. Az egyéni modell betanítási adataihoz tartozó SAS-URL-cím lekéréséhez nyissa meg a tárolóerőforrást az Azure Portalon, és válassza az Adattároló-tárolók> lehetőséget.

  2. Lépjen a tárolóra, kattintson a jobb gombbal, és válassza az SAS létrehozása lehetőséget.

    Kérje le a tároló SAS-ját, nem magát a tárfiókot.

  3. Győződjön meg arról, hogy az olvasási, írási, törlési és listaengedélyek ki vannak jelölve, és válassza az SAS-jogkivonat és AZ URL-cím létrehozása lehetőséget.

  4. Másolja az URL-szakaszban lévő értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

Ismételje meg az előző lépéseket egy adott dokumentum SAS-URL-címének lekéréséhez a blobtárolóban. Mentse az SAS URL-címét egy ideiglenes helyre is.

Mentse a mellékelt mintakép URL-címét. Ez a kép a GitHubon is elérhető).

string trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE";
string formUrl = "PASTE_YOUR_FORM_RECOGNIZER_FORM_URL_HERE";
string receiptUrl = "https://docs.microsoft.com/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg";
string bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg";
string invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";

string idUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg";

Elrendezés elemzése

A Dokumentumintelligencia segítségével elemezheti a dokumentumokban lévő táblákat, sorokat és szavakat anélkül, hogy be kellene tanítania egy modellt. A visszaadott érték FormPage-objektumok gyűjteménye. A beküldött dokumentumban minden laphoz egy objektum tartozik. Az elrendezések kinyeréséről további információt a Dokumentumintelligencia elrendezésmodellben talál.

Ha egy fájl tartalmát egy adott URL-címen szeretné elemezni, használja a metódust StartRecognizeContentFromUri .

private static async Task RecognizeContent(FormRecognizerClient recognizerClient)
{
    var invoiceUri = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";
    FormPageCollection formPages = await recognizerClient
        .StartRecognizeContentFromUri(new Uri(invoiceUri))
        .WaitForCompletionAsync();

Tipp.

A tartalmat helyi fájlból is lekérheti. Lásd a FormRecognizerClient metódusokat, például StartRecognizeContent. Vagy tekintse meg a GitHub mintakódját a helyi rendszerképeket tartalmazó forgatókönyvekhez.

A feladat többi része a tartalominformációkat a konzolra nyomtatja.

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

Az eredmény az alábbi kimenethez hasonlóan néz ki.

Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    Line 5 has 3 words, and text: '6000 Redmond, WA'.
    Line 6 has 3 words, and text: 'Sunnayvale, CA 87659'.
    Line 7 has 1 word, and text: '99243'.
    Line 8 has 2 words, and text: 'Invoice Number'.
    Line 9 has 2 words, and text: 'Invoice Date'.
    Line 10 has 3 words, and text: 'Invoice Due Date'.
    Line 11 has 1 word, and text: 'Charges'.
    Line 12 has 2 words, and text: 'VAT ID'.
    Line 13 has 1 word, and text: '34278587'.
    Line 14 has 1 word, and text: '6/18/2017'.
    Line 15 has 1 word, and text: '6/24/2017'.
    Line 16 has 1 word, and text: '$56,651.49'.
    Line 17 has 1 word, and text: 'PT'.
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    Cell (0, 3) contains text: 'Charges'.
    Cell (0, 5) contains text: 'VAT ID'.
    Cell (1, 0) contains text: '34278587'.
    Cell (1, 1) contains text: '6/18/2017'.
    Cell (1, 2) contains text: '6/24/2017'.
    Cell (1, 3) contains text: '$56,651.49'.
    Cell (1, 5) contains text: 'PT'.

Visszaigazolások elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a gyakori mezőket az USA-beli nyugtákból egy előre betanított nyugtamodell használatával. A nyugtaelemzéssel kapcsolatos további információkért tekintse meg a Dokumentumintelligencia nyugtamodellt.

Az URL-címből származó visszaigazolások elemzéséhez használja a metódust StartRecognizeReceiptsFromUri .

private static async Task AnalyzeReceipt(
    FormRecognizerClient recognizerClient, string receiptUri)
{
    RecognizedFormCollection receipts = await recognizerClient.StartRecognizeReceiptsFromUri(new Uri(receiptUrl)).WaitForCompletionAsync();

Tipp.

A helyi nyugtaképeket is elemezheti. Lásd a FormRecognizerClient metódusokat, például StartRecognizeReceipts. Vagy tekintse meg a GitHub mintakódját a helyi rendszerképeket tartalmazó forgatókönyvekhez.

A visszaadott érték objektumok gyűjteménye RecognizedForm . A beküldött dokumentumban minden laphoz egy objektum tartozik. Az alábbi kód feldolgozza a visszaigazolást a megadott URI-n, és kinyomtatja a fő mezőket és értékeket a konzolon.

    foreach (RecognizedForm receipt in receipts)
    {
        FormField merchantNameField;
        if (receipt.Fields.TryGetValue("MerchantName", out merchantNameField))
        {
            if (merchantNameField.Value.ValueType == FieldValueType.String)
            {
                string merchantName = merchantNameField.Value.AsString();

                Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}");
            }
        }

        FormField transactionDateField;
        if (receipt.Fields.TryGetValue("TransactionDate", out transactionDateField))
        {
            if (transactionDateField.Value.ValueType == FieldValueType.Date)
            {
                DateTime transactionDate = transactionDateField.Value.AsDate();

                Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}");
            }
        }

        FormField itemsField;
        if (receipt.Fields.TryGetValue("Items", out itemsField))
        {
            if (itemsField.Value.ValueType == FieldValueType.List)
            {
                foreach (FormField itemField in itemsField.Value.AsList())
                {
                    Console.WriteLine("Item:");

                    if (itemField.Value.ValueType == FieldValueType.Dictionary)
                    {
                        IReadOnlyDictionary<string, FormField> itemFields = itemField.Value.AsDictionary();

                        FormField itemNameField;
                        if (itemFields.TryGetValue("Name", out itemNameField))
                        {
                            if (itemNameField.Value.ValueType == FieldValueType.String)
                            {
                                string itemName = itemNameField.Value.AsString();

                                Console.WriteLine($"    Name: '{itemName}', with confidence {itemNameField.Confidence}");
                            }
                        }

                        FormField itemTotalPriceField;
                        if (itemFields.TryGetValue("TotalPrice", out itemTotalPriceField))
                        {
                            if (itemTotalPriceField.Value.ValueType == FieldValueType.Float)
                            {
                                float itemTotalPrice = itemTotalPriceField.Value.AsFloat();

                                Console.WriteLine($"    Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}");
                            }
                        }
                    }
                }
            }
        }
        FormField totalField;
        if (receipt.Fields.TryGetValue("Total", out totalField))
        {
            if (totalField.Value.ValueType == FieldValueType.Float)
            {
                float total = totalField.Value.AsFloat();

                Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'");
            }
        }
    }
}

Az eredmény az alábbi kimenethez hasonlóan néz ki.

Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    Line 5 has 3 words, and text: '6000 Redmond, WA'.
    Line 6 has 3 words, and text: 'Sunnayvale, CA 87659'.
    Line 7 has 1 word, and text: '99243'.
    Line 8 has 2 words, and text: 'Invoice Number'.
    Line 9 has 2 words, and text: 'Invoice Date'.
    Line 10 has 3 words, and text: 'Invoice Due Date'.
    Line 11 has 1 word, and text: 'Charges'.
    Line 12 has 2 words, and text: 'VAT ID'.
    Line 13 has 1 word, and text: '34278587'.
    Line 14 has 1 word, and text: '6/18/2017'.
    Line 15 has 1 word, and text: '6/24/2017'.
    Line 16 has 1 word, and text: '$56,651.49'.
    Line 17 has 1 word, and text: 'PT'.
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    Cell (0, 3) contains text: 'Charges'.
    Cell (0, 5) contains text: 'VAT ID'.
    Cell (1, 0) contains text: '34278587'.
    Cell (1, 1) contains text: '6/18/2017'.
    Cell (1, 2) contains text: '6/24/2017'.
    Cell (1, 3) contains text: '$56,651.49'.
    Cell (1, 5) contains text: 'PT'.
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'

Névjegykártyák elemzése

Ez a szakasz bemutatja, hogyan elemezheti és kinyerheti a gyakori mezőket az angol névjegykártyákból egy előre betanított modell használatával. A névjegykártya-elemzéssel kapcsolatos további információkért tekintse meg a Document Intelligence névjegykártya-modelljét.

Az URL-címből származó névjegykártyák elemzéséhez használja a StartRecognizeBusinessCardsFromUriAsync módszert.

private static async Task AnalyzeBusinessCard(
FormRecognizerClient recognizerClient, string bcUrl) {
  RecognizedFormCollection businessCards = await recognizerClient.StartRecognizeBusinessCardsFromUriAsync(bcUrl).WaitForCompletionAsync();

Tipp.

A helyi névjegykártya-rendszerképeket is elemezheti. Lásd a FormRecognizerClient metódusokat, például StartRecognizeBusinessCards. Vagy tekintse meg a GitHub mintakódját a helyi rendszerképeket tartalmazó forgatókönyvekhez.

Az alábbi kód feldolgozza a névjegykártyát a megadott URI-n, és kinyomtatja a fő mezőket és értékeket a konzolon.

  foreach(RecognizedForm businessCard in businessCards) {
    FormField ContactNamesField;
    if (businessCard.Fields.TryGetValue("ContactNames", out ContactNamesField)) {
      if (ContactNamesField.Value.ValueType == FieldValueType.List) {
        foreach(FormField contactNameField in ContactNamesField.Value.AsList()) {
          Console.WriteLine($ "Contact Name: {contactNameField.ValueData.Text}");

          if (contactNameField.Value.ValueType == FieldValueType.Dictionary) {
            IReadOnlyDictionary < string,
            FormField > contactNameFields = contactNameField.Value.AsDictionary();

            FormField firstNameField;
            if (contactNameFields.TryGetValue("FirstName", out firstNameField)) {
              if (firstNameField.Value.ValueType == FieldValueType.String) {
                string firstName = firstNameField.Value.AsString();

                Console.WriteLine($ "    First Name: '{firstName}', with confidence {firstNameField.Confidence}");
              }
            }

            FormField lastNameField;
            if (contactNameFields.TryGetValue("LastName", out lastNameField)) {
              if (lastNameField.Value.ValueType == FieldValueType.String) {
                string lastName = lastNameField.Value.AsString();

                Console.WriteLine($ "    Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
              }
            }
          }
        }
      }
    }

    FormField jobTitlesFields;
    if (businessCard.Fields.TryGetValue("JobTitles", out jobTitlesFields)) {
      if (jobTitlesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField jobTitleField in jobTitlesFields.Value.AsList()) {
          if (jobTitleField.Value.ValueType == FieldValueType.String) {
            string jobTitle = jobTitleField.Value.AsString();

            Console.WriteLine($ "  Job Title: '{jobTitle}', with confidence {jobTitleField.Confidence}");
          }
        }
      }
    }

    FormField departmentFields;
    if (businessCard.Fields.TryGetValue("Departments", out departmentFields)) {
      if (departmentFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField departmentField in departmentFields.Value.AsList()) {
          if (departmentField.Value.ValueType == FieldValueType.String) {
            string department = departmentField.Value.AsString();

            Console.WriteLine($ "  Department: '{department}', with confidence {departmentField.Confidence}");
          }
        }
      }
    }

    FormField emailFields;
    if (businessCard.Fields.TryGetValue("Emails", out emailFields)) {
      if (emailFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField emailField in emailFields.Value.AsList()) {
          if (emailField.Value.ValueType == FieldValueType.String) {
            string email = emailField.Value.AsString();

            Console.WriteLine($ "  Email: '{email}', with confidence {emailField.Confidence}");
          }
        }
      }
    }

    FormField websiteFields;
    if (businessCard.Fields.TryGetValue("Websites", out websiteFields)) {
      if (websiteFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField websiteField in websiteFields.Value.AsList()) {
          if (websiteField.Value.ValueType == FieldValueType.String) {
            string website = websiteField.Value.AsString();

            Console.WriteLine($ "  Website: '{website}', with confidence {websiteField.Confidence}");
          }
        }
      }
    }

    FormField mobilePhonesFields;
    if (businessCard.Fields.TryGetValue("MobilePhones", out mobilePhonesFields)) {
      if (mobilePhonesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField mobilePhoneField in mobilePhonesFields.Value.AsList()) {
          if (mobilePhoneField.Value.ValueType == FieldValueType.PhoneNumber) {
            string mobilePhone = mobilePhoneField.Value.AsPhoneNumber();

            Console.WriteLine($ "  Mobile phone number: '{mobilePhone}', with confidence {mobilePhoneField.Confidence}");
          }
        }
      }
    }

    FormField otherPhonesFields;
    if (businessCard.Fields.TryGetValue("OtherPhones", out otherPhonesFields)) {
      if (otherPhonesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField otherPhoneField in otherPhonesFields.Value.AsList()) {
          if (otherPhoneField.Value.ValueType == FieldValueType.PhoneNumber) {
            string otherPhone = otherPhoneField.Value.AsPhoneNumber();

            Console.WriteLine($ "  Other phone number: '{otherPhone}', with confidence {otherPhoneField.Confidence}");
          }
        }
      }
    }

    FormField faxesFields;
    if (businessCard.Fields.TryGetValue("Faxes", out faxesFields)) {
      if (faxesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField faxField in faxesFields.Value.AsList()) {
          if (faxField.Value.ValueType == FieldValueType.PhoneNumber) {
            string fax = faxField.Value.AsPhoneNumber();

            Console.WriteLine($ "  Fax phone number: '{fax}', with confidence {faxField.Confidence}");
          }
        }
      }
    }

    FormField addressesFields;
    if (businessCard.Fields.TryGetValue("Addresses", out addressesFields)) {
      if (addressesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField addressField in addressesFields.Value.AsList()) {
          if (addressField.Value.ValueType == FieldValueType.String) {
            string address = addressField.Value.AsString();

            Console.WriteLine($ "  Address: '{address}', with confidence {addressField.Confidence}");
          }
        }
      }
    }

    FormField companyNamesFields;
    if (businessCard.Fields.TryGetValue("CompanyNames", out companyNamesFields)) {
      if (companyNamesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField companyNameField in companyNamesFields.Value.AsList()) {
          if (companyNameField.Value.ValueType == FieldValueType.String) {
            string companyName = companyNameField.Value.AsString();

            Console.WriteLine($ "  Company name: '{companyName}', with confidence {companyNameField.Confidence}");
          }
        }
      }
    }
  }
}

Számlák elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a gyakori mezőket az értékesítési számlákból egy előre betanított modell használatával. A számlaelemzéssel kapcsolatos további információkért tekintse meg a Dokumentumintelligencia számlamodellt.

Az URL-címről származó számlák elemzéséhez használja a metódust StartRecognizeInvoicesFromUriAsync .

private static async Task AnalyzeInvoice(
FormRecognizerClient recognizerClient, string invoiceUrl) {
  var options = new RecognizeInvoicesOptions() {
    Locale = "en-US"
  };
  RecognizedFormCollection invoices = await recognizerClient.StartRecognizeInvoicesFromUriAsync(invoiceUrl, options).WaitForCompletionAsync();

Tipp.

A helyi számlarendszerképeket is elemezheti. Lásd a FormRecognizerClient metódusokat, például StartRecognizeInvoices. Vagy tekintse meg a GitHub mintakódját a helyi rendszerképeket tartalmazó forgatókönyvekhez.

Az alábbi kód feldolgozza a számlát a megadott URI-n, és kinyomtatja a fő mezőket és értékeket a konzolon.

  RecognizedForm invoice = invoices.Single();

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

Azonosító dokumentumok elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a kulcsfontosságú információkat a kormány által kiadott azonosító dokumentumokból – a világútlevelekből és az egyesült államokbeli jogosítványokból az előre összeállított Dokumentumintelligencia-azonosító modell használatával. Az azonosító dokumentumelemzésével kapcsolatos további információkért tekintse meg a Dokumentumintelligencia-azonosító dokumentummodellt.

Az URI azonosító dokumentumainak elemzéséhez használja a metódust StartRecognizeIdentityDocumentsFromUriAsync .

private static async Task AnalyzeId(
FormRecognizerClient recognizerClient, string idUrl) {
  RecognizedFormCollection identityDocument = await recognizerClient.StartRecognizeIdDocumentsFromUriAsync(idUrl).WaitForCompletionAsync();

Tipp.

A helyi azonosítójú dokumentumképeket is elemezheti. Lásd a FormRecognizerClient metódusokat, például StartRecognizeIdentityDocumentsAsync. Emellett tekintse meg a GitHubon található mintakódot a helyi rendszerképeket tartalmazó forgatókönyvekhez.

Az alábbi kód feldolgozza az azonosító dokumentumot az adott URI-n, és kinyomtatja a fő mezőket és értékeket a konzolon.

RecognizedForm identityDocument = identityDocuments.Single();

if (identityDocument.Fields.TryGetValue("Address", out FormField addressField)) {
  if (addressField.Value.ValueType == FieldValueType.String) {
    string address = addressField.Value.AsString();
    Console.WriteLine($ "Address: '{address}', with confidence {addressField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("CountryRegion", out FormField countryRegionField)) {
  if (countryRegionField.Value.ValueType == FieldValueType.CountryRegion) {
    string countryRegion = countryRegionField.Value.AsCountryRegion();
    Console.WriteLine($ "CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("DateOfBirth", out FormField dateOfBirthField)) {
  if (dateOfBirthField.Value.ValueType == FieldValueType.Date) {
    DateTime dateOfBirth = dateOfBirthField.Value.AsDate();
    Console.WriteLine($ "Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("DateOfExpiration", out FormField dateOfExpirationField)) {
  if (dateOfExpirationField.Value.ValueType == FieldValueType.Date) {
    DateTime dateOfExpiration = dateOfExpirationField.Value.AsDate();
    Console.WriteLine($ "Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("DocumentNumber", out FormField documentNumberField)) {
  if (documentNumberField.Value.ValueType == FieldValueType.String) {
    string documentNumber = documentNumberField.Value.AsString();
    Console.WriteLine($ "Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
  }
  RecognizedForm identityDocument = identityDocuments.Single();

  if (identityDocument.Fields.TryGetValue("Address", out FormField addressField)) {
    if (addressField.Value.ValueType == FieldValueType.String) {
      string address = addressField.Value.AsString();
      Console.WriteLine($ "Address: '{address}', with confidence {addressField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("CountryRegion", out FormField countryRegionField)) {
    if (countryRegionField.Value.ValueType == FieldValueType.CountryRegion) {
      string countryRegion = countryRegionField.Value.AsCountryRegion();
      Console.WriteLine($ "CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("DateOfBirth", out FormField dateOfBirthField)) {
    if (dateOfBirthField.Value.ValueType == FieldValueType.Date) {
      DateTime dateOfBirth = dateOfBirthField.Value.AsDate();
      Console.WriteLine($ "Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("DateOfExpiration", out FormField dateOfExpirationField)) {
    if (dateOfExpirationField.Value.ValueType == FieldValueType.Date) {
      DateTime dateOfExpiration = dateOfExpirationField.Value.AsDate();
      Console.WriteLine($ "Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("DocumentNumber", out FormField documentNumberField)) {
    if (documentNumberField.Value.ValueType == FieldValueType.String) {
      string documentNumber = documentNumberField.Value.AsString();
      Console.WriteLine($ "Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("FirstName", out FormField firstNameField)) {
    if (firstNameField.Value.ValueType == FieldValueType.String) {
      string firstName = firstNameField.Value.AsString();
      Console.WriteLine($ "First Name: '{firstName}', with confidence {firstNameField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("LastName", out FormField lastNameField)) {
    if (lastNameField.Value.ValueType == FieldValueType.String) {
      string lastName = lastNameField.Value.AsString();
      Console.WriteLine($ "Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("Region", out FormField regionfield)) {
    if (regionfield.Value.ValueType == FieldValueType.String) {
      string region = regionfield.Value.AsString();
      Console.WriteLine($ "Region: '{region}', with confidence {regionfield.Confidence}");
    }
  }

Egyéni modell betanítása

Ez a szakasz bemutatja, hogyan taníthat be egy modellt saját adataival. A betanított modellek olyan strukturált adatokat adhatnak ki, amelyek tartalmazzák az eredeti dokumentumban szereplő kulcs-érték kapcsolatokat. A modell betanítása után tesztelheti, átképezheti és végül felhasználhatja, hogy az igényeinek megfelelően megbízhatóan kinyerje az adatokat több űrlapból.

Feljegyzés

A modelleket grafikus felhasználói felülettel, például a Dokumentumintelligencia-mintacímkéző eszközzel is betanítheti.

Modell betanítása címkék nélkül

Egyéni modellek betanítása az egyéni űrlapokban található összes mező és érték elemzéséhez a betanítási dokumentumok manuális címkézése nélkül. Az alábbi módszer betanítása egy modellt egy adott dokumentumkészletre, és a modell állapotát a konzolra nyomtatja.

private static async Task<String> TrainModel(
    FormTrainingClient trainingClient, string trainingDataUrl)
{
    CustomFormModel model = await trainingClient
    .StartTrainingAsync(new Uri(trainingDataUrl), useTrainingLabels: false)
    .WaitForCompletionAsync();

    Console.WriteLine($"Custom Model Info:");
    Console.WriteLine($"    Model Id: {model.ModelId}");
    Console.WriteLine($"    Model Status: {model.Status}");
    Console.WriteLine($"    Training model started on: {model.TrainingStartedOn}");
    Console.WriteLine($"    Training model completed on: {model.TrainingCompletedOn}");

A visszaadott CustomFormModel objektum információkat tartalmaz a modell által elemezhető űrlaptípusokról és az egyes űrlaptípusokból kinyerhető mezőkről. Az alábbi kódblokk ezt az információt a konzolra nyomtatja.

foreach (CustomFormSubmodel submodel in model.Submodels)
{
    Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
    foreach (CustomFormModelField field in submodel.Fields.Values)
    {
        Console.Write($"    FieldName: {field.Name}");
        if (field.Label != null)
        {
            Console.Write($", FieldLabel: {field.Label}");
        }
        Console.WriteLine("");
    }
}

Végül adja vissza a betanított modellazonosítót a későbbi lépésekben való használathoz.

    return model.ModelId;
}

Ez a kimenet csonkolva lett az olvashatóság érdekében.

Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    ...
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    Cell (0, 3) contains text: 'Charges'.
    ...
Custom Model Info:
    Model Id: 95035721-f19d-40eb-8820-0c806b42798b
    Model Status: Ready
    Training model started on: 8/24/2020 6:36:44 PM +00:00
    Training model completed on: 8/24/2020 6:36:50 PM +00:00
Submodel Form Type: form-95035721-f19d-40eb-8820-0c806b42798b
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    ...
Custom Model Info:
    Model Id: e7a1181b-1fb7-40be-bfbe-1ee154183633
    Model Status: Ready
    Training model started on: 8/24/2020 6:36:44 PM +00:00
    Training model completed on: 8/24/2020 6:36:52 PM +00:00
Submodel Form Type: form-0
    FieldName: field-0, FieldLabel: Additional Notes:
    FieldName: field-1, FieldLabel: Address:
    FieldName: field-2, FieldLabel: Company Name:
    FieldName: field-3, FieldLabel: Company Phone:
    FieldName: field-4, FieldLabel: Dated As:
    FieldName: field-5, FieldLabel: Details
    FieldName: field-6, FieldLabel: Email:
    FieldName: field-7, FieldLabel: Hero Limited
    FieldName: field-8, FieldLabel: Name:
    FieldName: field-9, FieldLabel: Phone:
    ...

Modell betanítása címkékkel

Az egyéni modellek betanításához manuálisan is megjelölheti a betanítási dokumentumokat. A címkékkel való betanítás bizonyos esetekben jobb teljesítményt eredményez. Címkékkel való betanításhoz speciális címkeinformációs fájlokkal (<fájlnév>.pdf.labels.json) kell rendelkeznie a blobtárolóban a betanítási dokumentumok mellett. A dokumentumintelligencia-mintacímkézési eszköz felhasználói felületet biztosít ezeknek a címkefájloknak a létrehozásához. Miután lekérte őket, meghívhatja a StartTrainingAsync metódust a uselabels paraméter beállításával true.

private static async Task<Guid> TrainModelWithLabelsAsync(
    FormRecognizerClient trainingClient, string trainingDataUrl)
{
    CustomFormModel model = await trainingClient
    .StartTrainingAsync(new Uri(trainingDataUrl), useTrainingLabels: true)
    .WaitForCompletionAsync();
    Console.WriteLine($"Custom Model Info:");
    Console.WriteLine($"    Model Id: {model.ModelId}");
    Console.WriteLine($"    Model Status: {model.Status}");
    Console.WriteLine($"    Training model started on: {model.TrainingStartedOn}");
    Console.WriteLine($"    Training model completed on: {model.TrainingCompletedOn}");

A visszaadott CustomFormModel érték azokat a mezőket jelzi, amelyeket a modell kinyerhet, valamint az egyes mezők becsült pontosságát. Az alábbi kódblokk ezt az információt a konzolra nyomtatja.

    foreach (CustomFormSubmodel submodel in model.Submodels)
    {
        Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
        foreach (CustomFormModelField field in submodel.Fields.Values)
        {
            Console.Write($"    FieldName: {field.Name}");
            if (field.Label != null)
            {
                Console.Write($", FieldLabel: {field.Label}");
            }
            Console.WriteLine("");
        }
    }
    return model.ModelId;
}

Ez a kimenet csonkolva lett az olvashatóság érdekében.

Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    Line 5 has 3 words, and text: '6000 Redmond, WA'.
    ...
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    ...
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Custom Model Info:
    Model Id: 63c013e3-1cab-43eb-84b0-f4b20cb9214c
    Model Status: Ready
    Training model started on: 8/24/2020 6:42:54 PM +00:00
    Training model completed on: 8/24/2020 6:43:01 PM +00:00
Submodel Form Type: form-63c013e3-1cab-43eb-84b0-f4b20cb9214c
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    FieldName: DatedAs
    FieldName: Email
    FieldName: Merchant
    ...

Űrlapok elemzése egyéni modellel

Ez a szakasz bemutatja, hogyan nyerhet ki kulcs-/értékadatokat és egyéb tartalmakat az egyéni sablontípusokból a saját űrlapjaival betanított modellek használatával.

Fontos

A forgatókönyv implementálásához már be kell tanítania egy modellt, hogy az azonosítóját átadhassa a következő metódusnak.

Használja a StartRecognizeCustomFormsFromUri metódust.

// Analyze PDF form data
private static async Task AnalyzePdfForm(
    FormRecognizerClient recognizerClient, String modelId, string formUrl)
{
    RecognizedFormCollection forms = await recognizerClient
    .StartRecognizeCustomFormsFromUri(modelId, new Uri(formUrl))
    .WaitForCompletionAsync();

Tipp.

A helyi fájlokat is elemezheti. Lásd a FormRecognizerClient metódusokat, például StartRecognizeCustomForms. Vagy tekintse meg a GitHub mintakódját a helyi rendszerképeket tartalmazó forgatókönyvekhez.

A visszaadott érték objektumok gyűjteménye RecognizedForm . A beküldött dokumentumban minden laphoz egy objektum tartozik. Az alábbi kód kinyomtatja az elemzési eredményeket a konzolon. Kinyomtatja az egyes felismert mezőket és a megfelelő értékeket, valamint egy megbízhatósági pontszámot.

    foreach (RecognizedForm form in forms)
    {
        Console.WriteLine($"Form of type: {form.FormType}");
        foreach (FormField field in form.Fields.Values)
        {
            Console.WriteLine($"Field '{field.Name}: ");

            if (field.LabelData != null)
            {
                Console.WriteLine($"    Label: '{field.LabelData.Text}");
            }

            Console.WriteLine($"    Value: '{field.ValueData.Text}");
            Console.WriteLine($"    Confidence: '{field.Confidence}");
        }
        Console.WriteLine("Table data:");
        foreach (FormPage page in form.Pages)
        {
            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 {(cell.IsHeader ? "header" : "text")}: '{cell.Text}'");
                }
            }
        }
    }
}

Ez a kimeneti válasz csonkolva lett az olvashatóság érdekében.

Custom Model Info:
    Model Id: 9b0108ee-65c8-450e-b527-bb309d054fc4
    Model Status: Ready
    Training model started on: 8/24/2020 7:00:31 PM +00:00
    Training model completed on: 8/24/2020 7:00:32 PM +00:00
Submodel Form Type: form-9b0108ee-65c8-450e-b527-bb309d054fc4
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    ...
Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    ...

Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    ...
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Custom Model Info:
    Model Id: dc115156-ce0e-4202-bbe4-7426e7bee756
    Model Status: Ready
    Training model started on: 8/24/2020 7:00:31 PM +00:00
    Training model completed on: 8/24/2020 7:00:41 PM +00:00
Submodel Form Type: form-0
    FieldName: field-0, FieldLabel: Additional Notes:
    FieldName: field-1, FieldLabel: Address:
    FieldName: field-2, FieldLabel: Company Name:
    FieldName: field-3, FieldLabel: Company Phone:
    FieldName: field-4, FieldLabel: Dated As:
    ...
Form of type: custom:form
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
    Value: '$56,651.49
    Confidence: '0.249
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
    Value: 'PT
    Confidence: '0.245
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
    Value: '99243
    Confidence: '0.114
   ...

Egyéni modellek kezelése

Ez a szakasz bemutatja, hogyan kezelheti a fiókjában tárolt egyéni modelleket. A következő metóduson belül több műveletet is végrehajthat:

private static async Task ManageModels(
    FormTrainingClient trainingClient, string trainingFileUrl)
{

A Modellek számának ellenőrzése a FormRecognizer erőforrásfiókban

Az alábbi kódblokk ellenőrzi, hogy hány modellt mentett a Dokumentumintelligencia-fiókban, és összehasonlítja azt a fiókkorlátokkal.

// Check number of models in the FormRecognizer account, 
// and the maximum number of models that can be stored.
AccountProperties accountProperties = trainingClient.GetAccountProperties();
Console.WriteLine($"Account has {accountProperties.CustomModelCount} models.");
Console.WriteLine($"It can have at most {accountProperties.CustomModelLimit} models.");

Hozam

Account has 20 models.
It can have at most 5000 models.

Az erőforrásfiókban jelenleg tárolt modellek listázása

Az alábbi kód letiltja a fiók aktuális modelljeit, és kinyomtatja a részleteket a konzolon.

Pageable<CustomFormModelInfo> models = trainingClient.GetCustomModels();

foreach (CustomFormModelInfo modelInfo in models)
{
    Console.WriteLine($"Custom Model Info:");
    Console.WriteLine($"    Model Id: {modelInfo.ModelId}");
    Console.WriteLine($"    Model Status: {modelInfo.Status}");
    Console.WriteLine($"    Training model started on: {modelInfo.TrainingStartedOn}");
    Console.WriteLine($"    Training model completed on: {modelInfo.TrainingCompletedOn}");
}

Ez a kimenet csonkolva lett az olvashatóság érdekében.

Custom Model Info:
    Model Id: 05932d5a-a2f8-4030-a2ef-4e5ed7112515
    Model Status: Creating
    Training model started on: 8/24/2020 7:35:02 PM +00:00
    Training model completed on: 8/24/2020 7:35:02 PM +00:00
Custom Model Info:
    Model Id: 150828c4-2eb2-487e-a728-60d5d504bd16
    Model Status: Ready
    Training model started on: 8/24/2020 7:33:25 PM +00:00
    Training model completed on: 8/24/2020 7:33:27 PM +00:00
Custom Model Info:
    Model Id: 3303e9de-6cec-4dfb-9e68-36510a6ecbb2
    Model Status: Ready
    Training model started on: 8/24/2020 7:29:27 PM +00:00
    Training model completed on: 8/24/2020 7:29:36 PM +00:00

Adott modell lekérése a modell azonosítójával

Az alábbi kódblokk betanított egy új modellt, akárcsak a Címkék nélküli modellek betanítása, majd egy második hivatkozás lekérése az azonosítójával.

// Create a new model to store in the account
CustomFormModel model = await trainingClient.StartTrainingAsync(
    new Uri(trainingFileUrl)).WaitForCompletionAsync();

// Get the model that was just created
CustomFormModel modelCopy = trainingClient.GetCustomModel(model.ModelId);

Console.WriteLine($"Custom Model {modelCopy.ModelId} recognizes the following form types:");

foreach (CustomFormSubmodel submodel in modelCopy.Submodels)
{
    Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
    foreach (CustomFormModelField field in submodel.Fields.Values)
    {
        Console.Write($"    FieldName: {field.Name}");
        if (field.Label != null)
        {
            Console.Write($", FieldLabel: {field.Label}");
        }
        Console.WriteLine("");
    }
}

Ez a kimenet csonkolva lett az olvashatóság érdekében.

Custom Model Info:
    Model Id: 150828c4-2eb2-487e-a728-60d5d504bd16
    Model Status: Ready
    Training model started on: 8/24/2020 7:33:25 PM +00:00
    Training model completed on: 8/24/2020 7:33:27 PM +00:00
Submodel Form Type: form-150828c4-2eb2-487e-a728-60d5d504bd16
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    FieldName: DatedAs
    FieldName: Email
    FieldName: Merchant
    FieldName: PhoneNumber
    FieldName: PurchaseOrderNumber
    FieldName: Quantity
    FieldName: Signature
    FieldName: Subtotal
    FieldName: Tax
    FieldName: Total
    FieldName: VendorName
    FieldName: Website
...

Modell törlése az erőforrásfiókból

A modell az azonosítójára való hivatkozással is törölhető a fiókjából. Ez a lépés a metódust is bezárja.

    // Delete the model from the account.
    trainingClient.DeleteModel(model.ModelId);
}

Az alkalmazás futtatása

Futtassa az alkalmazást az alkalmazáskönyvtárból a dotnet run paranccsal.

dotnet run

Az erőforrások eltávolítása

Ha törölni és eltávolítani szeretne egy Azure AI-szolgáltatási előfizetést, törölheti az erőforrást vagy az erőforráscsoportot. Az erőforráscsoport törlése a hozzá társított egyéb erőforrásokat is törli.

Hibaelhárítás

Amikor az Azure AI Document Intelligence ügyfélkódtárával a .NET SDK-t használja, a szolgáltatás által visszaadott hibák egy RequestFailedException. Tartalmazzák ugyanazt a HTTP-állapotkódot, amelyet egy REST API-kérés visszaadna.

Ha például érvénytelen URI-val küldi el a nyugtaképet, a 400 rendszer hibát ad vissza, amely hibás kérést jelez.

try
{
    RecognizedReceiptCollection receipts = await client.StartRecognizeReceiptsFromUri(new Uri(receiptUri)).WaitForCompletionAsync();
}
catch (RequestFailedException e)
{
    Console.WriteLine(e.ToString());
}

Megfigyelheti, hogy a rendszer további információkat naplóz, például a művelet ügyfélkérelmének azonosítóját.


Message:
    Azure.RequestFailedException: Service request failed.
    Status: 400 (Bad Request)

Content:
    {"error":{"code":"FailedToDownloadImage","innerError":
    {"requestId":"8ca04feb-86db-4552-857c-fde903251518"},
    "message":"Failed to download image from input URL."}}

Headers:
    Transfer-Encoding: chunked
    x-envoy-upstream-service-time: REDACTED
    apim-request-id: REDACTED
    Strict-Transport-Security: REDACTED
    X-Content-Type-Options: REDACTED
    Date: Mon, 20 Apr 2020 22:48:35 GMT
    Content-Type: application/json; charset=utf-8

Következő lépések

Ebben a projektben a Document Intelligence .NET ügyfélkódtár használatával képezte be a modelleket, és különböző módokon elemezte az űrlapokat. Ezután megtudhatja, hogyan hozhat létre jobb betanítási adatkészletet, és pontosabb modelleket hozhat létre.

Fontos

Ez a projekt a Document Intelligence REST API 2.1-es verzióját célozza meg.

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

Előfeltételek

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

  • A Java Development Kit (JDK) jelenlegi verziója.

  • A Gradle buildelési eszköz vagy egy másik függőségkezelő.

  • Dokumentumintelligencia-erőforrás. 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 alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

  • Betanítási adatokat tartalmazó Azure Storage-blob. Az egyéni modell összeállítása és betanítása tippeket és lehetőségeket kínál a betanítási adatkészlet összeállításához. Ebben a projektben a mintaadatkészlet Betanítása mappájában lévő fájlokat használhatja. Töltse le és bontsa ki a sample_data.zip.

A programozási környezet beállítása

A programozási környezet beállításához hozzon létre egy Gradle-projektet, és telepítse az ügyfélkódtárat.

Új Gradle-projekt létrehozása

Egy konzolablakban hozzon létre egy könyvtárat az alkalmazáshoz, és navigáljon hozzá.

mkdir myapp
cd myapp

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

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

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

Ez a projekt 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

Lépjen az új mappára, és hozzon létre egy FormRecognizer.java nevű fájlt. Nyissa meg egy szerkesztőben vagy IDE-ben, és adja hozzá a következő import utasításokat:

import com.azure.ai.formrecognizer.*;
import com.azure.ai.formrecognizer.training.*;
import com.azure.ai.formrecognizer.models.*;
import com.azure.ai.formrecognizer.training.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;

Az alkalmazás FormRecognizer osztályában hozzon létre változókat az erőforrás kulcsához és végpontjához.

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

Fontos

Nyissa meg az Azure Portalt. Ha az Előfeltételek szakaszban létrehozott dokumentumintelligencia-erőforrás sikeresen üzembe lett helyezve, a Következő lépések csoportban válassza az Erőforrás megnyitása lehetőséget. A kulcs és a végpont az Erőforrás-kezelésben a Kulcsok és végpont területen található.

Amikor elkészült, ne felejtse el eltávolítani a kulcsot a kódból. Soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módszerekkel tárolhatja és érheti el a hitelesítő adatait. További információ: Azure AI-szolgáltatások biztonsága.

Az alkalmazás metódusában main adja hozzá a projektben használt metódusok hívásait. Ezeket a hívásokat később definiálhatja. A betanítási és tesztelési adatok URL-címeire mutató hivatkozásokat is hozzá kell adnia.

  1. Az egyéni modell betanítási adataihoz tartozó SAS-URL-cím lekéréséhez nyissa meg a tárolóerőforrást az Azure Portalon, és válassza az Adattároló-tárolók> lehetőséget.

  2. Lépjen a tárolóra, kattintson a jobb gombbal, és válassza az SAS létrehozása lehetőséget.

    Kérje le a tároló SAS-ját, nem magát a tárfiókot.

  3. Győződjön meg arról, hogy az olvasási, írási, törlési és listaengedélyek ki vannak jelölve, és válassza az SAS-jogkivonat és AZ URL-cím létrehozása lehetőséget.

  4. Másolja az URL-szakaszban lévő értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

Egy űrlap URL-címének lekéréséhez a fenti lépésekkel lekérheti egy adott dokumentum SAS-URL-címét a Blob Storage-ban. Vagy vegye fel egy máshol található dokumentum URL-címét.

Az előző metódussal a nyugtakép URL-címét is lekérheti.

String trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE";
String formUrl = "PASTE_YOUR_FORM_RECOGNIZER_FORM_URL_HERE";
String receiptUrl = "https://docs.microsoft.com/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg";
String bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg";
String invoiceUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/forms/Invoice_1.pdf";
String idUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg"
// Call Form Recognizer scenarios:
System.out.println("Get form content...");
GetContent(recognizerClient, formUrl);

System.out.println("Analyze receipt...");
AnalyzeReceipt(recognizerClient, receiptUrl);

System.out.println("Analyze business card...");
AnalyzeBusinessCard(recognizerClient, bcUrl);

System.out.println("Analyze invoice...");
AnalyzeInvoice(recognizerClient, invoiceUrl);

System.out.println("Analyze id...");
AnalyzeId(recognizerClient, idUrl);

System.out.println("Train Model with training data...");
String modelId = TrainModel(trainingClient, trainingDataUrl);

System.out.println("Analyze PDF form...");
AnalyzePdfForm(recognizerClient, modelId, formUrl);

System.out.println("Manage models...");
ManageModels(trainingClient, trainingDataUrl);

Az objektummodell használata

A Dokumentumintelligencia segítségével két különböző ügyféltípust hozhat létre. Az első, FormRecognizerClientlekérdezi a szolgáltatást a felismert űrlapmezőkre és -tartalmakra. A második, FormTrainingClientegyéni modelleket hoz létre és kezel a felismerés javítása érdekében.

FormRecognizerClient a következő feladatokhoz biztosít műveleteket:

  • Az űrlapmezők és -tartalmak felismerése az egyéni űrlapok elemzésére betanított egyéni modellek használatával. Ezek az értékek objektumgyűjteményben RecognizedForm jelennek meg. Lásd: Egyéni űrlapok elemzése.
  • A modellek betanítása nélkül felismerhet űrlaptartalmakat, például táblázatokat, sorokat és szavakat. Az űrlaptartalmak egy objektumgyűjteményben FormPage lesznek visszaadva. Lásd: Elemzési elrendezés.
  • Az egyesült államokbeli nyugták, névjegykártyák, számlák és azonosító dokumentumok gyakori mezőinek felismerése a Document Intelligence szolgáltatás előre betanított modelljével.

FormTrainingClient a következő műveletekhez nyújt műveleteket:

  • Egyéni modellek betanítása az egyéni űrlapokban található összes mező és érték elemzéséhez. A CustomFormModel visszaadott érték jelzi a modell által elemzett űrlaptípusokat és az egyes űrlaptípusokhoz kinyert mezőket.
  • Egyéni modellek betanítása a megadott mezők és értékek elemzéséhez az egyéni űrlapok címkézésével. A CustomFormModel visszaadott érték jelzi a modell által kinyert mezőket és az egyes mezők becsült pontosságát.
  • Kezelheti a fiókjában létrehozott modelleket.
  • Egyéni modell másolása egy dokumentumintelligencia-erőforrásból egy másikba.

Feljegyzés

A modelleket grafikus felhasználói felülettel, például a Mintacímkéző eszközzel is be lehet tanítani.

Az ügyfél hitelesítése

A metódus tetején main adja hozzá a következő kódot. Két ügyfélobjektumot hitelesít a korábban definiált előfizetési változókkal. Objektumot AzureKeyCredential használ, így szükség esetén új ügyfélobjektumok létrehozása nélkül frissítheti a kulcsot.

FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder()
        .credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();

FormTrainingClient trainingClient = new FormTrainingClientBuilder().credential(new AzureKeyCredential(key))
        .endpoint(endpoint).buildClient();

Elrendezés elemzése

A Dokumentumintelligencia segítségével elemezheti a dokumentumokban lévő táblákat, sorokat és szavakat anélkül, hogy be kellene tanítania egy modellt. Az elrendezések kinyeréséről további információt a Dokumentumintelligencia-elrendezési modellben talál.

Ha egy fájl tartalmát egy adott URL-címen szeretné elemezni, használja a metódust beginRecognizeContentFromUrl .

private static void GetContent(FormRecognizerClient recognizerClient, String invoiceUri) {
    String analyzeFilePath = invoiceUri;
    SyncPoller<FormRecognizerOperationResult, List<FormPage>> recognizeContentPoller = recognizerClient
            .beginRecognizeContentFromUrl(analyzeFilePath);

    List<FormPage> contentResult = recognizeContentPoller.getFinalResult();

Tipp.

A tartalmat helyi fájlból is lekérheti. Lásd a FormRecognizerClient metódusokat, például beginRecognizeContent. Vagy tekintse meg a GitHub mintakódját a helyi rendszerképeket tartalmazó forgatókönyvekhez.

A visszaadott érték objektumok gyűjteménye FormPage . A beküldött dokumentumban minden laphoz egy objektum tartozik. Az alábbi kód végigvezeti ezeket az objektumokat, és kinyomtatja a kinyert kulcs-/érték párokat és a táblaadatokat.

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

Az eredmény az alábbi kimenethez hasonlóan néz ki.

Get form content...
----Recognizing content ----
Has width: 8.500000 and height: 11.000000, measured with unit: inch.
Table has 2 rows and 6 columns.
Cell has text Invoice Number.
Cell has text Invoice Date.
Cell has text Invoice Due Date.
Cell has text Charges.
Cell has text VAT ID.
Cell has text 458176.
Cell has text 3/28/2018.
Cell has text 4/16/2018.
Cell has text $89,024.34.
Cell has text ET.

Visszaigazolások elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a gyakori mezőket az USA-beli nyugtákból egy előre betanított nyugtamodell használatával. A nyugtaelemzéssel kapcsolatos további információkért tekintse meg a Dokumentumintelligencia nyugtamodellt.

Az URI-ból származó visszaigazolások elemzéséhez használja a metódust beginRecognizeReceiptsFromUrl .

private static void AnalyzeReceipt(FormRecognizerClient recognizerClient, String receiptUri) {
    SyncPoller<FormRecognizerOperationResult, List<RecognizedForm>> syncPoller = recognizerClient
            .beginRecognizeReceiptsFromUrl(receiptUri);
    List<RecognizedForm> receiptPageResults = syncPoller.getFinalResult();

Tipp.

A helyi nyugtaképeket is elemezheti. Lásd a FormRecognizerClient metódusokat, például beginRecognizeReceipts. Vagy tekintse meg a GitHub mintakódját a helyi rendszerképeket tartalmazó forgatókönyvekhez.

A visszaadott érték objektumok gyűjteménye RecognizedReceipt . A beküldött dokumentumban minden laphoz egy objektum tartozik. A következő kódblokk végigvezeti a nyugtákon, és kinyomtatja a részleteket a konzolon.

for (int i = 0; i < receiptPageResults.size(); i++) {
    RecognizedForm recognizedForm = receiptPageResults.get(i);
    Map<String, FormField> recognizedFields = recognizedForm.getFields();
    System.out.printf("----------- Recognized Receipt page %d -----------%n", i);
    FormField merchantNameField = recognizedFields.get("MerchantName");
    if (merchantNameField != null) {
        if (FieldValueType.STRING == merchantNameField.getValue().getValueType()) {
            String merchantName = merchantNameField.getValue().asString();
            System.out.printf("Merchant Name: %s, confidence: %.2f%n", merchantName,
                    merchantNameField.getConfidence());
        }
    }
    FormField merchantAddressField = recognizedFields.get("MerchantAddress");
    if (merchantAddressField != null) {
        if (FieldValueType.STRING == merchantAddressField.getValue().getValueType()) {
            String merchantAddress = merchantAddressField.getValue().asString();
            System.out.printf("Merchant Address: %s, confidence: %.2f%n", merchantAddress,
                    merchantAddressField.getConfidence());
        }
    }
    FormField transactionDateField = recognizedFields.get("TransactionDate");
    if (transactionDateField != null) {
        if (FieldValueType.DATE == transactionDateField.getValue().getValueType()) {
            LocalDate transactionDate = transactionDateField.getValue().asDate();
            System.out.printf("Transaction Date: %s, confidence: %.2f%n", transactionDate,
                    transactionDateField.getConfidence());
        }
    }

A következő kódblokk végigvezeti a nyugtán észlelt egyes elemeken, és kinyomtatja a részleteket a konzolon.

        FormField receiptItemsField = recognizedFields.get("Items");
        if (receiptItemsField != null) {
            System.out.printf("Receipt Items: %n");
            if (FieldValueType.LIST == receiptItemsField.getValue().getValueType()) {
                List<FormField> receiptItems = receiptItemsField.getValue().asList();
                receiptItems.stream()
                        .filter(receiptItem -> FieldValueType.MAP == receiptItem.getValue().getValueType())
                        .map(formField -> formField.getValue().asMap())
                        .forEach(formFieldMap -> formFieldMap.forEach((key, formField) -> {
                            if ("Name".equals(key)) {
                                if (FieldValueType.STRING == formField.getValue().getValueType()) {
                                    String name = formField.getValue().asString();
                                    System.out.printf("Name: %s, confidence: %.2fs%n", name,
                                            formField.getConfidence());
                                }
                            }
                            if ("Quantity".equals(key)) {
                                if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
                                    Float quantity = formField.getValue().asFloat();
                                    System.out.printf("Quantity: %f, confidence: %.2f%n", quantity,
                                            formField.getConfidence());
                                }
                            }
                            if ("Price".equals(key)) {
                                if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
                                    Float price = formField.getValue().asFloat();
                                    System.out.printf("Price: %f, confidence: %.2f%n", price,
                                            formField.getConfidence());
                                }
                            }
                            if ("TotalPrice".equals(key)) {
                                if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
                                    Float totalPrice = formField.getValue().asFloat();
                                    System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice,
                                            formField.getConfidence());
                                }
                            }
                        }));
            }
        }
    }
}

Az eredmény az alábbi kimenethez hasonlóan néz ki.

Analyze receipt...
----------- Recognized Receipt page 0 -----------
Merchant Name: Contoso Contoso, confidence: 0.62
Merchant Address: 123 Main Street Redmond, WA 98052, confidence: 0.99
Transaction Date: 2020-06-10, confidence: 0.90
Receipt Items:
Name: Cappuccino, confidence: 0.96s
Quantity: null, confidence: 0.957s]
Total Price: 2.200000, confidence: 0.95
Name: BACON & EGGS, confidence: 0.94s
Quantity: null, confidence: 0.927s]
Total Price: null, confidence: 0.93

Névjegykártyák elemzése

Ez a szakasz bemutatja, hogyan elemezheti és kinyerheti a gyakori mezőket az angol névjegykártyákból egy előre betanított modell használatával. A névjegykártya-elemzéssel kapcsolatos további információkért tekintse meg a Document Intelligence névjegykártya-modelljét.

Az URL-címből származó névjegykártyák elemzéséhez használja a beginRecognizeBusinessCardsFromUrl módszert.

private static void AnalyzeBusinessCard(FormRecognizerClient recognizerClient, String bcUrl) {
    SyncPoller < FormRecognizerOperationResult,
    List < RecognizedForm >> recognizeBusinessCardPoller = client.beginRecognizeBusinessCardsFromUrl(businessCardUrl);

    List < RecognizedForm > businessCardPageResults = recognizeBusinessCardPoller.getFinalResult();

Tipp.

A helyi névjegykártya-rendszerképeket is elemezheti. Lásd a FormRecognizerClient metódusokat, például beginRecognizeBusinessCards. Vagy tekintse meg a GitHub mintakódját a helyi rendszerképeket tartalmazó forgatókönyvekhez.

A visszaadott érték objektumok gyűjteménye RecognizedForm . A dokumentumban minden kártyához egy objektum tartozik. Az alábbi kód feldolgozza a névjegykártyát a megadott URI-n, és kinyomtatja a fő mezőket és értékeket a konzolon.

    for (int i = 0; i < businessCardPageResults.size(); i++) {
        RecognizedForm recognizedForm = businessCardPageResults.get(i);
        Map < String,
        FormField > recognizedFields = recognizedForm.getFields();
        System.out.printf("----------- Recognized business card info for page %d -----------%n", i);
        FormField contactNamesFormField = recognizedFields.get("ContactNames");
        if (contactNamesFormField != null) {
            if (FieldValueType.LIST == contactNamesFormField.getValue().getValueType()) {
                List < FormField > contactNamesList = contactNamesFormField.getValue().asList();
                contactNamesList.stream().filter(contactName - >FieldValueType.MAP == contactName.getValue().getValueType()).map(contactName - >{
                    System.out.printf("Contact name: %s%n", contactName.getValueData().getText());
                    return contactName.getValue().asMap();
                }).forEach(contactNamesMap - >contactNamesMap.forEach((key, contactName) - >{
                    if ("FirstName".equals(key)) {
                        if (FieldValueType.STRING == contactName.getValue().getValueType()) {
                            String firstName = contactName.getValue().asString();
                            System.out.printf("\tFirst Name: %s, confidence: %.2f%n", firstName, contactName.getConfidence());
                        }
                    }
                    if ("LastName".equals(key)) {
                        if (FieldValueType.STRING == contactName.getValue().getValueType()) {
                            String lastName = contactName.getValue().asString();
                            System.out.printf("\tLast Name: %s, confidence: %.2f%n", lastName, contactName.getConfidence());
                        }
                    }
                }));
            }
        }

        FormField jobTitles = recognizedFields.get("JobTitles");
        if (jobTitles != null) {
            if (FieldValueType.LIST == jobTitles.getValue().getValueType()) {
                List < FormField > jobTitlesItems = jobTitles.getValue().asList();
                jobTitlesItems.stream().forEach(jobTitlesItem - >{
                    if (FieldValueType.STRING == jobTitlesItem.getValue().getValueType()) {
                        String jobTitle = jobTitlesItem.getValue().asString();
                        System.out.printf("Job Title: %s, confidence: %.2f%n", jobTitle, jobTitlesItem.getConfidence());
                    }
                });
            }
        }

        FormField departments = recognizedFields.get("Departments");
        if (departments != null) {
            if (FieldValueType.LIST == departments.getValue().getValueType()) {
                List < FormField > departmentsItems = departments.getValue().asList();
                departmentsItems.stream().forEach(departmentsItem - >{
                    if (FieldValueType.STRING == departmentsItem.getValue().getValueType()) {
                        String department = departmentsItem.getValue().asString();
                        System.out.printf("Department: %s, confidence: %.2f%n", department, departmentsItem.getConfidence());
                    }
                });
            }
        }

        FormField emails = recognizedFields.get("Emails");
        if (emails != null) {
            if (FieldValueType.LIST == emails.getValue().getValueType()) {
                List < FormField > emailsItems = emails.getValue().asList();
                emailsItems.stream().forEach(emailsItem - >{
                    if (FieldValueType.STRING == emailsItem.getValue().getValueType()) {
                        String email = emailsItem.getValue().asString();
                        System.out.printf("Email: %s, confidence: %.2f%n", email, emailsItem.getConfidence());
                    }
                });
            }
        }

        FormField websites = recognizedFields.get("Websites");
        if (websites != null) {
            if (FieldValueType.LIST == websites.getValue().getValueType()) {
                List < FormField > websitesItems = websites.getValue().asList();
                websitesItems.stream().forEach(websitesItem - >{
                    if (FieldValueType.STRING == websitesItem.getValue().getValueType()) {
                        String website = websitesItem.getValue().asString();
                        System.out.printf("Web site: %s, confidence: %.2f%n", website, websitesItem.getConfidence());
                    }
                });
            }
        }

        FormField mobilePhones = recognizedFields.get("MobilePhones");
        if (mobilePhones != null) {
            if (FieldValueType.LIST == mobilePhones.getValue().getValueType()) {
                List < FormField > mobilePhonesItems = mobilePhones.getValue().asList();
                mobilePhonesItems.stream().forEach(mobilePhonesItem - >{
                    if (FieldValueType.PHONE_NUMBER == mobilePhonesItem.getValue().getValueType()) {
                        String mobilePhoneNumber = mobilePhonesItem.getValue().asPhoneNumber();
                        System.out.printf("Mobile phone number: %s, confidence: %.2f%n", mobilePhoneNumber, mobilePhonesItem.getConfidence());
                    }
                });
            }
        }

        FormField otherPhones = recognizedFields.get("OtherPhones");
        if (otherPhones != null) {
            if (FieldValueType.LIST == otherPhones.getValue().getValueType()) {
                List < FormField > otherPhonesItems = otherPhones.getValue().asList();
                otherPhonesItems.stream().forEach(otherPhonesItem - >{
                    if (FieldValueType.PHONE_NUMBER == otherPhonesItem.getValue().getValueType()) {
                        String otherPhoneNumber = otherPhonesItem.getValue().asPhoneNumber();
                        System.out.printf("Other phone number: %s, confidence: %.2f%n", otherPhoneNumber, otherPhonesItem.getConfidence());
                    }
                });
            }
        }

        FormField faxes = recognizedFields.get("Faxes");
        if (faxes != null) {
            if (FieldValueType.LIST == faxes.getValue().getValueType()) {
                List < FormField > faxesItems = faxes.getValue().asList();
                faxesItems.stream().forEach(faxesItem - >{
                    if (FieldValueType.PHONE_NUMBER == faxesItem.getValue().getValueType()) {
                        String faxPhoneNumber = faxesItem.getValue().asPhoneNumber();
                        System.out.printf("Fax phone number: %s, confidence: %.2f%n", faxPhoneNumber, faxesItem.getConfidence());
                    }
                });
            }
        }

        FormField addresses = recognizedFields.get("Addresses");
        if (addresses != null) {
            if (FieldValueType.LIST == addresses.getValue().getValueType()) {
                List < FormField > addressesItems = addresses.getValue().asList();
                addressesItems.stream().forEach(addressesItem - >{
                    if (FieldValueType.STRING == addressesItem.getValue().getValueType()) {
                        String address = addressesItem.getValue().asString();
                        System.out.printf("Address: %s, confidence: %.2f%n", address, addressesItem.getConfidence());
                    }
                });
            }
        }

        FormField companyName = recognizedFields.get("CompanyNames");
        if (companyName != null) {
            if (FieldValueType.LIST == companyName.getValue().getValueType()) {
                List < FormField > companyNameItems = companyName.getValue().asList();
                companyNameItems.stream().forEach(companyNameItem - >{
                    if (FieldValueType.STRING == companyNameItem.getValue().getValueType()) {
                        String companyNameValue = companyNameItem.getValue().asString();
                        System.out.printf("Company name: %s, confidence: %.2f%n", companyNameValue, companyNameItem.getConfidence());
                    }
                });
            }
        }
    }
}

Számlák elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a gyakori mezőket az értékesítési számlákból egy előre betanított modell használatával. A számlaelemzéssel kapcsolatos további információkért tekintse meg a Dokumentumintelligencia számlamodellt.

Az URL-címről származó számlák elemzéséhez használja a metódust beginRecognizeInvoicesFromUrl .

private static void AnalyzeInvoice(FormRecognizerClient recognizerClient, String invoiceUrl) {
    SyncPoller < FormRecognizerOperationResult,
    List < RecognizedForm >> recognizeInvoicesPoller = client.beginRecognizeInvoicesFromUrl(invoiceUrl);

    List < RecognizedForm > recognizedInvoices = recognizeInvoicesPoller.getFinalResult();

Tipp.

A helyi számlákat is elemezheti. Lásd a FormRecognizerClient metódusokat, például beginRecognizeInvoices. Vagy tekintse meg a GitHub mintakódját a helyi rendszerképeket tartalmazó forgatókönyvekhez.

A visszaadott érték objektumok gyűjteménye RecognizedForm . A dokumentumban minden számlához egy objektum tartozik. Az alábbi kód feldolgozza a számlát a megadott URI-n, és kinyomtatja a fő mezőket és értékeket a konzolon.

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

Azonosító dokumentumok elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a kulcsfontosságú információkat a kormány által kiadott azonosító dokumentumokból – a világútlevelekből és az egyesült államokbeli jogosítványokból az előre összeállított Dokumentumintelligencia-azonosító modell használatával. Az azonosító dokumentumelemzésével kapcsolatos további információkért tekintse meg a Dokumentumintelligencia-azonosító dokumentummodellt.

Az URI azonosító dokumentumainak elemzéséhez használja a metódust beginRecognizeIdentityDocumentsFromUrl .

private static void AnalyzeId(FormRecognizerClient client, String idUrl) {
    SyncPoller < FormRecognizerOperationResult,
    List < RecognizedForm >> analyzeIdentityDocumentPoller = client.beginRecognizeIdentityDocumentsFromUrl(licenseDocumentUrl);

    List < RecognizedForm > identityDocumentResults = analyzeIdentityDocumentPoller.getFinalResult();

Tipp.

A helyi azonosítójú dokumentumképeket is elemezheti. Lásd a FormRecognizerClient metódusokat, például beginRecognizeIdentityDocuments. Emellett tekintse meg a GitHubon található mintakódot a helyi rendszerképeket tartalmazó forgatókönyvekhez.

Az alábbi kód feldolgozza az azonosító dokumentumot az adott URI-n, és kinyomtatja a fő mezőket és értékeket a konzolon.

for (int i = 0; i < identityDocumentResults.size(); i++) {
    RecognizedForm recognizedForm = identityDocumentResults.get(i);
    Map < String,
    FormField > recognizedFields = recognizedForm.getFields();
    System.out.printf("----------- Recognized license info for page %d -----------%n", i);
    FormField addressField = recognizedFields.get("Address");
    if (addressField != null) {
        if (FieldValueType.STRING == addressField.getValue().getValueType()) {
            String address = addressField.getValue().asString();
            System.out.printf("Address: %s, confidence: %.2f%n", address, addressField.getConfidence());
        }
    }

    FormField countryRegionFormField = recognizedFields.get("CountryRegion");
    if (countryRegionFormField != null) {
        if (FieldValueType.STRING == countryRegionFormField.getValue().getValueType()) {
            String countryRegion = countryRegionFormField.getValue().asCountryRegion();
            System.out.printf("Country or region: %s, confidence: %.2f%n", countryRegion, countryRegionFormField.getConfidence());
        }
    }

    FormField dateOfBirthField = recognizedFields.get("DateOfBirth");
    if (dateOfBirthField != null) {
        if (FieldValueType.DATE == dateOfBirthField.getValue().getValueType()) {
            LocalDate dateOfBirth = dateOfBirthField.getValue().asDate();
            System.out.printf("Date of Birth: %s, confidence: %.2f%n", dateOfBirth, dateOfBirthField.getConfidence());
        }
    }

    FormField dateOfExpirationField = recognizedFields.get("DateOfExpiration");
    if (dateOfExpirationField != null) {
        if (FieldValueType.DATE == dateOfExpirationField.getValue().getValueType()) {
            LocalDate expirationDate = dateOfExpirationField.getValue().asDate();
            System.out.printf("Document date of expiration: %s, confidence: %.2f%n", expirationDate, dateOfExpirationField.getConfidence());
        }
    }

    FormField documentNumberField = recognizedFields.get("DocumentNumber");
    if (documentNumberField != null) {
        if (FieldValueType.STRING == documentNumberField.getValue().getValueType()) {
            String documentNumber = documentNumberField.getValue().asString();
            System.out.printf("Document number: %s, confidence: %.2f%n", documentNumber, documentNumberField.getConfidence());
        }
    }

    FormField firstNameField = recognizedFields.get("FirstName");
    if (firstNameField != null) {
        if (FieldValueType.STRING == firstNameField.getValue().getValueType()) {
            String firstName = firstNameField.getValue().asString();
            System.out.printf("First Name: %s, confidence: %.2f%n", firstName, documentNumberField.getConfidence());
        }
    }

    FormField lastNameField = recognizedFields.get("LastName");
    if (lastNameField != null) {
        if (FieldValueType.STRING == lastNameField.getValue().getValueType()) {
            String lastName = lastNameField.getValue().asString();
            System.out.printf("Last name: %s, confidence: %.2f%n", lastName, lastNameField.getConfidence());
        }
    }

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

Egyéni modell betanítása

Ez a szakasz bemutatja, hogyan taníthat be egy modellt saját adataival. A betanított modellek olyan strukturált adatokat adhatnak ki, amelyek tartalmazzák az eredeti dokumentumban szereplő kulcs-érték kapcsolatokat. A modell betanítása után tesztelheti, átképezheti és végül felhasználhatja, hogy az igényeinek megfelelően megbízhatóan kinyerje az adatokat több űrlapból.

Feljegyzés

A modelleket grafikus felhasználói felülettel, például a Dokumentumintelligencia-mintacímkéző eszközzel is betanítheti.

Modell betanítása címkék nélkül

Egyéni modellek betanítása az egyéni űrlapokban található összes mező és érték elemzéséhez a betanítási dokumentumok manuális címkézése nélkül.

Az alábbi módszer betanítása egy modellt egy adott dokumentumkészletre, és a modell állapotát a konzolra nyomtatja.

private static String TrainModel(FormTrainingClient trainingClient, String trainingDataUrl) {
    SyncPoller<FormRecognizerOperationResult, CustomFormModel> trainingPoller = trainingClient
            .beginTraining(trainingDataUrl, false);

    CustomFormModel customFormModel = trainingPoller.getFinalResult();

    // Model Info
    System.out.printf("Model Id: %s%n", customFormModel.getModelId());
    System.out.printf("Model Status: %s%n", customFormModel.getModelStatus());
    System.out.printf("Training started on: %s%n", customFormModel.getTrainingStartedOn());
    System.out.printf("Training completed on: %s%n%n", customFormModel.getTrainingCompletedOn());

A visszaadott CustomFormModel objektum információkat tartalmaz a modell által elemezhető űrlaptípusokról és az egyes űrlaptípusokból kinyerhető mezőkről. Az alábbi kódblokk ezt az információt a konzolra nyomtatja.

System.out.println("Recognized Fields:");
// looping through the subModels, which contains the fields they were trained on
// Since the given training documents are unlabeled, we still group them but
// they do not have a label.
customFormModel.getSubmodels().forEach(customFormSubmodel -> {
    // Since the training data is unlabeled, we are unable to return the accuracy of
    // this model
    System.out.printf("The subModel has form type %s%n", customFormSubmodel.getFormType());
    customFormSubmodel.getFields().forEach((field, customFormModelField) -> System.out
            .printf("The model found field '%s' with label: %s%n", field, customFormModelField.getLabel()));
});

Végül ez a módszer visszaadja a modell egyedi azonosítóját.

    return customFormModel.getModelId();
}

Az eredmény az alábbi kimenethez hasonlóan néz ki.

Train Model with training data...
Model Id: 20c3544d-97b4-49d9-b39b-dc32d85f1358
Model Status: ready
Training started on: 2020-08-31T16:52:09Z
Training completed on: 2020-08-31T16:52:23Z

Recognized Fields:
The subModel has form type form-0
The model found field 'field-0' with label: Address:
The model found field 'field-1' with label: Charges
The model found field 'field-2' with label: Invoice Date
The model found field 'field-3' with label: Invoice Due Date
The model found field 'field-4' with label: Invoice For:
The model found field 'field-5' with label: Invoice Number
The model found field 'field-6' with label: VAT ID

Modell betanítása címkékkel

Az egyéni modellek betanításához manuálisan is megjelölheti a betanítási dokumentumokat. A címkékkel való betanítás bizonyos esetekben jobb teljesítményt eredményez. Címkékkel való betanításhoz speciális címkeinformációs fájlokkal (<fájlnév>.pdf.labels.json) kell rendelkeznie a blobtárolóban a betanítási dokumentumok mellett. A dokumentumintelligencia-mintacímkézési eszköz felhasználói felületet biztosít ezeknek a címkefájloknak a létrehozásához. Miután lekérte őket, meghívhatja a beginTraining metódust a useTrainingLabels paraméter beállításával true.

private static String TrainModelWithLabels(FormTrainingClient trainingClient, String trainingDataUrl) {
    // Train custom model
    String trainingSetSource = trainingDataUrl;
    SyncPoller<FormRecognizerOperationResult, CustomFormModel> trainingPoller = trainingClient
            .beginTraining(trainingSetSource, true);

    CustomFormModel customFormModel = trainingPoller.getFinalResult();

    // Model Info
    System.out.printf("Model Id: %s%n", customFormModel.getModelId());
    System.out.printf("Model Status: %s%n", customFormModel.getModelStatus());
    System.out.printf("Training started on: %s%n", customFormModel.getTrainingStartedOn());
    System.out.printf("Training completed on: %s%n%n", customFormModel.getTrainingCompletedOn());

A visszaadott CustomFormModel érték azt jelzi, hogy a modell milyen mezőket tud kinyerni, valamint az egyes mezők becsült pontosságát. Az alábbi kódblokk ezt az információt a konzolra nyomtatja.

    // looping through the subModels, which contains the fields they were trained on
    // The labels are based on the ones you gave the training document.
    System.out.println("Recognized Fields:");
    // Since the data is labeled, we are able to return the accuracy of the model
    customFormModel.getSubmodels().forEach(customFormSubmodel -> {
        System.out.printf("The subModel with form type %s has accuracy: %.2f%n", customFormSubmodel.getFormType(),
                customFormSubmodel.getAccuracy());
        customFormSubmodel.getFields()
                .forEach((label, customFormModelField) -> System.out.printf(
                        "The model found field '%s' to have name: %s with an accuracy: %.2f%n", label,
                        customFormModelField.getName(), customFormModelField.getAccuracy()));
    });
    return customFormModel.getModelId();
}

Az eredmény az alábbi kimenethez hasonlóan néz ki.

Train Model with training data...
Model Id: 20c3544d-97b4-49d9-b39b-dc32d85f1358
Model Status: ready
Training started on: 2020-08-31T16:52:09Z
Training completed on: 2020-08-31T16:52:23Z

Recognized Fields:
The subModel has form type form-0
The model found field 'field-0' with label: Address:
The model found field 'field-1' with label: Charges
The model found field 'field-2' with label: Invoice Date
The model found field 'field-3' with label: Invoice Due Date
The model found field 'field-4' with label: Invoice For:
The model found field 'field-5' with label: Invoice Number
The model found field 'field-6' with label: VAT ID

Űrlapok elemzése egyéni modellel

Ez a szakasz bemutatja, hogyan nyerhet ki kulcs-/értékadatokat és egyéb tartalmakat az egyéni sablontípusokból a saját űrlapjaival betanított modellek használatával.

Fontos

A forgatókönyv implementálásához már be kell tanítania egy modellt, hogy átadhassa az azonosítóját a metódusműveletnek. Lásd: Modell betanítása címkékkel.

Használja a beginRecognizeCustomFormsFromUrl metódust.

// Analyze PDF form data
private static void AnalyzePdfForm(FormRecognizerClient formClient, String modelId, String pdfFormUrl) {
    SyncPoller<FormRecognizerOperationResult, List<RecognizedForm>> recognizeFormPoller = formClient
            .beginRecognizeCustomFormsFromUrl(modelId, pdfFormUrl);

    List<RecognizedForm> recognizedForms = recognizeFormPoller.getFinalResult();

Tipp.

A helyi fájlokat is elemezheti. Lásd a FormRecognizerClient metódusokat, például beginRecognizeCustomForms. Vagy tekintse meg a GitHub mintakódját a helyi rendszerképeket tartalmazó forgatókönyvekhez.

A visszaadott érték objektumok gyűjteménye RecognizedForm . A beküldött dokumentumban minden laphoz egy objektum tartozik. Az alábbi kód kinyomtatja az elemzési eredményeket a konzolon. Kinyomtatja az egyes felismert mezőket és a megfelelő értékeket, valamint egy megbízhatósági pontszámot.

    for (int i = 0; i < recognizedForms.size(); i++) {
        final RecognizedForm form = recognizedForms.get(i);
        System.out.printf("----------- Recognized custom form info for page %d -----------%n", i);
        System.out.printf("Form type: %s%n", form.getFormType());
        form.getFields().forEach((label, formField) ->
        // label data is populated if you are using a model trained with unlabeled data,
        // since the service needs to make predictions for labels if not explicitly
        // given to it.
        System.out.printf("Field '%s' has label '%s' with a confidence " + "score of %.2f.%n", label,
                formField.getLabelData().getText(), formField.getConfidence()));
    }
}

Az eredmény az alábbi kimenethez hasonlóan néz ki.

Analyze PDF form...
----------- Recognized custom template info for page 0 -----------
Form type: form-0
Field 'field-0' has label 'Address:' with a confidence score of 0.91.
Field 'field-1' has label 'Invoice For:' with a confidence score of 1.00.
Field 'field-2' has label 'Invoice Number' with a confidence score of 1.00.
Field 'field-3' has label 'Invoice Date' with a confidence score of 1.00.
Field 'field-4' has label 'Invoice Due Date' with a confidence score of 1.00.
Field 'field-5' has label 'Charges' with a confidence score of 1.00.
Field 'field-6' has label 'VAT ID' with a confidence score of 1.00.

Egyéni modellek kezelése

Ez a szakasz bemutatja, hogyan kezelheti a fiókjában tárolt egyéni modelleket. Az alábbi kód az összes modellkezelési feladatot egyetlen metódusban hajtja végre, példaként. Először másolja ki a következő metódus-aláírást:

private static void ManageModels(FormTrainingClient trainingClient, String trainingFileUrl) {

A Modellek számának ellenőrzése a FormRecognizer erőforrásfiókban

Az alábbi kódblokk ellenőrzi, hogy hány modellt mentett a Dokumentumintelligencia-fiókban, és összehasonlítja azt a fiókkorlátkal.

AtomicReference<String> modelId = new AtomicReference<>();

// First, we see how many custom models we have, and what our limit is
AccountProperties accountProperties = trainingClient.getAccountProperties();
System.out.printf("The account has %s custom models, and we can have at most %s custom models",
        accountProperties.getCustomModelCount(), accountProperties.getCustomModelLimit());

Az eredmény az alábbi kimenethez hasonlóan néz ki.

The account has 12 custom models, and we can have at most 250 custom models

Az erőforrásfiókban jelenleg tárolt modellek listázása

Az alábbi kód letiltja a fiók aktuális modelljeit, és kinyomtatja a részleteket a konzolon.

// Next, we get a paged list of all of our custom models
PagedIterable<CustomFormModelInfo> customModels = trainingClient.listCustomModels();
System.out.println("We have following models in the account:");
customModels.forEach(customFormModelInfo -> {
    System.out.printf("Model Id: %s%n", customFormModelInfo.getModelId());
    // get custom model info
    modelId.set(customFormModelInfo.getModelId());
    CustomFormModel customModel = trainingClient.getCustomModel(customFormModelInfo.getModelId());
    System.out.printf("Model Id: %s%n", customModel.getModelId());
    System.out.printf("Model Status: %s%n", customModel.getModelStatus());
    System.out.printf("Training started on: %s%n", customModel.getTrainingStartedOn());
    System.out.printf("Training completed on: %s%n", customModel.getTrainingCompletedOn());
    customModel.getSubmodels().forEach(customFormSubmodel -> {
        System.out.printf("Custom Model Form type: %s%n", customFormSubmodel.getFormType());
        System.out.printf("Custom Model Accuracy: %.2f%n", customFormSubmodel.getAccuracy());
        if (customFormSubmodel.getFields() != null) {
            customFormSubmodel.getFields().forEach((fieldText, customFormModelField) -> {
                System.out.printf("Field Text: %s%n", fieldText);
                System.out.printf("Field Accuracy: %.2f%n", customFormModelField.getAccuracy());
            });
        }
    });
});

Az eredmény az alábbi kimenethez hasonlóan néz ki.

Ez a válasz csonkolva lett az olvashatóság érdekében.

We have following models in the account:
Model Id: 0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Model Id: 0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Model Status: ready
Training started on: 2020-06-04T18:33:08Z
Training completed on: 2020-06-04T18:33:10Z
Custom Model Form type: form-0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Custom Model Accuracy: 1.00
Field Text: invoice date
Field Accuracy: 1.00
Field Text: invoice number
Field Accuracy: 1.00
...

Modell törlése az erőforrásfiókból

A modell az azonosítójára való hivatkozással is törölhető a fiókjából.

    // Delete Custom Model
    System.out.printf("Deleted model with model Id: %s, operation completed with status: %s%n", modelId.get(),
            trainingClient.deleteModelWithResponse(modelId.get(), Context.NONE).getStatusCode());
}

Az alkalmazás futtatása

Lépjen vissza a fő projektkönyvtárhoz. Ezután hozza létre az alkalmazást a következő paranccsal:

gradle build

Futtassa az alkalmazást a run következő céllal:

gradle run

Az erőforrások eltávolítása

Ha törölni és eltávolítani szeretne egy Azure AI-szolgáltatási előfizetést, törölheti az erőforrást vagy az erőforráscsoportot. Az erőforráscsoport törlése a hozzá társított egyéb erőforrásokat is törli.

Hibaelhárítás

A Dokumentumintelligencia-ügyfelek kivételeket emelnek ErrorResponseException ki. Ha például érvénytelen fájlforrás URL-címét próbálja meg megadni, ErrorResponseException a rendszer hibát jelez, amely jelzi a hiba okát. A következő kódrészletben a rendszer a kivétel elfogásával és a hibával kapcsolatos további információk megjelenítésével kezeli a hibát.

try {
    formRecognizerClient.beginRecognizeContentFromUrl("invalidSourceUrl");
} catch (ErrorResponseException e) {
    System.out.println(e.getMessage());
}

Ügyfélnaplózás engedélyezése

A Java-hoz készült Azure SDK-k egységes naplózási történetet kínálnak, amely segít az alkalmazáshibák elhárításában és a megoldás felgyorsításában. Az előállított naplók rögzítik az alkalmazás folyamatát, mielőtt elérnék a terminálállapotot, hogy segítsenek megtalálni a gyökérproblémát. A naplózás engedélyezésével kapcsolatos további információkért tekintse meg a naplózási wikit.

Következő lépések

Ebben a projektben a Document Intelligence Java ügyfélkódtárával különböző módokon taníthat be modelleket és elemezhet űrlapokat. Ezután megtudhatja, hogyan hozhat létre jobb betanítási adatkészletet, és pontosabb modelleket hozhat létre.

Fontos

Ez a projekt a Document Intelligence REST API 2.1-es verzióját célozza meg.

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

Előfeltételek

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

  • A Visual Studio Code legújabb verziója.

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

  • Betanítási adatokat tartalmazó Azure Storage-blob. Az egyéni modell összeállítása és betanítása tippeket és lehetőségeket kínál a betanítási adatkészlet összeállításához. Ebben a projektben a mintaadatkészlet Betanítása mappájában lévő fájlokat használhatja. Töltse le és bontsa ki a sample_data.zip.

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Dokumentumintelligencia-erőforrás létrehozása. 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 alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

A programozási környezet beállítása

Hozzon létre egy alkalmazást, és telepítse az ügyfélkódtárat.

Új Node.js-alkalmazás létrehozása

  1. Egy konzolablakban hozzon létre egy könyvtárat az alkalmazáshoz, és navigáljon hozzá.

    mkdir myapp
    cd myapp
    
  2. npm init A parancs futtatásával hozzon létre egy csomópontalkalmazást egy package.json fájllal.

    npm init
    

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

  1. Telepítse az ai-form-recognizer npm-csomagot:

    npm install @azure/ai-form-recognizer
    

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

  2. Hozzon létre egy index.js nevű fájlt, nyissa meg és importálja a következő kódtárakat:

    const { FormRecognizerClient, FormTrainingClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    const fs = require("fs");
    
  3. Hozzon létre változókat az erőforrás Azure-végpontja és -kulcsa számára.

    const apiKey = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    

Fontos

Nyissa meg az Azure Portalt. Ha az Előfeltételek szakaszban létrehozott dokumentumintelligencia-erőforrás sikeresen üzembe lett helyezve, a Következő lépések csoportban válassza az Erőforrás megnyitása lehetőséget. A kulcs és a végpont az Erőforrás-kezelésben a Kulcsok és végpont területen található.

Amikor elkészült, ne felejtse el eltávolítani a kulcsot a kódból. Soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módszerekkel tárolhatja és érheti el a hitelesítő adatait. További információ: Azure AI-szolgáltatások biztonsága.

Az objektummodell használata

A Dokumentumintelligencia segítségével két különböző ügyféltípust hozhat létre. Az első, FormRecognizerClientlekérdezi a szolgáltatást a felismert űrlapmezőkre és -tartalmakra. A második, FormTrainingClientegyéni modelleket hoz létre és kezel a felismerés javítása érdekében.

FormRecognizerClient a következő műveleteket biztosítja:

  • Az űrlapmezők és -tartalmak felismerése az egyéni űrlapok elemzésére betanított egyéni modellek használatával. Ezek az értékek objektumgyűjteményben RecognizedForm jelennek meg.
  • A modellek betanítása nélkül felismerhet űrlaptartalmakat, például táblázatokat, sorokat és szavakat. Az űrlaptartalmak egy objektumgyűjteményben FormPage lesznek visszaadva.
  • Az egyesült államokbeli nyugták, névjegykártyák, számlák és azonosító dokumentumok gyakori mezőinek felismerése a Dokumentumintelligencia szolgáltatás előre betanított modelljének használatával.

FormTrainingClient a következő műveletekhez nyújt műveleteket:

  • Egyéni modellek betanítása az egyéni űrlapokban található összes mező és érték elemzéséhez. A CustomFormModel visszaadott érték jelzi a modell által elemzett űrlaptípusokat és az egyes űrlaptípusokhoz kinyert mezőket. További információkért tekintse meg a szolgáltatás címkézetlen modellbetanítással kapcsolatos dokumentációját.
  • Egyéni modellek betanítása a megadott mezők és értékek elemzéséhez az egyéni űrlapok címkézésével. A CustomFormModel visszaadott érték jelzi a modell által kinyert mezőket és az egyes mezők becsült pontosságát. További információ: Modell betanítása címkékkel ebben a cikkben.
  • Kezelheti a fiókjában létrehozott modelleket.
  • Egyéni modell másolása egy dokumentumintelligencia-erőforrásból egy másikba.

Feljegyzés

A modelleket grafikus felhasználói felülettel, például a mintacímkéző eszközzel is be lehet tanítani.

Az ügyfél hitelesítése

Ügyfélobjektum hitelesítése a megadott előfizetési változók használatával. Használjon objektumot AzureKeyCredential , hogy szükség esetén új ügyfélobjektumok létrehozása nélkül frissíthesse a kulcsot. Egy betanítási ügyfélobjektumot is létrehoz.

const trainingClient = new FormTrainingClient(endpoint, new AzureKeyCredential(apiKey));
const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(apiKey));

Eszközök lekérése teszteléshez

A betanítási és tesztelési adatok URL-címeire mutató hivatkozásokat is hozzá kell adnia.

  1. Az egyéni modell betanítási adataihoz tartozó SAS-URL-cím lekéréséhez nyissa meg a tárolóerőforrást az Azure Portalon, és válassza az Adattároló-tárolók> lehetőséget.

  2. Lépjen a tárolóra, kattintson a jobb gombbal, és válassza az SAS létrehozása lehetőséget.

    Kérje le a tároló SAS-ját, nem magát a tárfiókot.

  3. Győződjön meg arról, hogy az olvasási, írási, törlési és listaengedélyek ki vannak jelölve, és válassza az SAS-jogkivonat és AZ URL-cím létrehozása lehetőséget.

  4. Másolja az URL-szakaszban lévő értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

Használja a mintából származó és a mintákban szereplő képeket. Ezek a képek a GitHubon is elérhetők. Az előző lépésekkel lekérheti egy adott dokumentum SAS-URL-címét a Blob Storage-ban.

Elrendezés elemzése

A Dokumentumintelligencia segítségével elemezheti a dokumentumokban lévő táblákat, sorokat és szavakat anélkül, hogy be kellene tanítania egy modellt. Az elrendezések kinyeréséről további információt a Dokumentumintelligencia-elrendezési modellben talál. Ha egy fájl tartalmát egy adott URI-n szeretné elemezni, használja a metódust beginRecognizeContentFromUrl .

async function recognizeContent() {
    const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";
    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);
});

Tipp.

A FormRecognizerClient metódusokkal egy helyi fájlból is lekérhet tartalmakat, példáulbeginRecognizeContent.

Page 1: width 8.5 and height 11 with unit inch
cell [0,0] has text Invoice Number
cell [0,1] has text Invoice Date
cell [0,2] has text Invoice Due Date
cell [0,3] has text Charges
cell [0,5] has text VAT ID
cell [1,0] has text 34278587
cell [1,1] has text 6/18/2017
cell [1,2] has text 6/24/2017
cell [1,3] has text $56,651.49
cell [1,5] has text PT

Visszaigazolások elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a gyakori mezőket az AMERIKAI nyugtákból egy előre betanított nyugtamodell használatával. A nyugtaelemzéssel kapcsolatos további információkért tekintse meg a Dokumentumintelligencia nyugtamodellt.

Az URI-ból származó visszaigazolások elemzéséhez használja a metódust beginRecognizeReceiptsFromUrl . Az alábbi kód feldolgoz egy visszaigazolást a megadott URI-n, és kinyomtatja a fő mezőket és értékeket a konzolon.

async function recognizeReceipt() {
    receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png";
    const poller = await client.beginRecognizeReceiptsFromUrl(receiptUrl, {
        onProgress: (state) => { console.log(`status: ${state.status}`); }
    });

    const receipts = await poller.pollUntilDone();

    if (!receipts || receipts.length <= 0) {
        throw new Error("Expecting at lease one receipt in analysis result");
    }

    const receipt = receipts[0];
    console.log("First receipt:");
    const receiptTypeField = receipt.fields["ReceiptType"];
    if (receiptTypeField.valueType === "string") {
        console.log(`  Receipt Type: '${receiptTypeField.value || "<missing>"}', with confidence of ${receiptTypeField.confidence}`);
    }
    const merchantNameField = receipt.fields["MerchantName"];
    if (merchantNameField.valueType === "string") {
        console.log(`  Merchant Name: '${merchantNameField.value || "<missing>"}', with confidence of ${merchantNameField.confidence}`);
    }
    const transactionDate = receipt.fields["TransactionDate"];
    if (transactionDate.valueType === "date") {
        console.log(`  Transaction Date: '${transactionDate.value || "<missing>"}', with confidence of ${transactionDate.confidence}`);
    }
    const itemsField = receipt.fields["Items"];
    if (itemsField.valueType === "array") {
        for (const itemField of itemsField.value || []) {
            if (itemField.valueType === "object") {
                const itemNameField = itemField.value["Name"];
                if (itemNameField.valueType === "string") {
                    console.log(`    Item Name: '${itemNameField.value || "<missing>"}', with confidence of ${itemNameField.confidence}`);
                }
            }
        }
    }
    const totalField = receipt.fields["Total"];
    if (totalField.valueType === "number") {
        console.log(`  Total: '${totalField.value || "<missing>"}', with confidence of ${totalField.confidence}`);
    }
}

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

Tipp.

A helyi nyugtaképeket a FormRecognizerClient metódusokkal is elemezheti, példáulbeginRecognizeReceipts.

status: notStarted
status: running
status: succeeded
First receipt:
  Receipt Type: 'Itemized', with confidence of 0.659
  Merchant Name: 'Contoso Contoso', with confidence of 0.516
  Transaction Date: 'Sun Jun 09 2019 17:00:00 GMT-0700 (Pacific Daylight Time)', with confidence of 0.985
    Item Name: '8GB RAM (Black)', with confidence of 0.916
    Item Name: 'SurfacePen', with confidence of 0.858
  Total: '1203.39', with confidence of 0.774

Névjegykártyák elemzése

Ez a szakasz bemutatja, hogyan elemezheti és kinyerheti a gyakori mezőket az angol nyelvű névjegykártyákból egy előre betanított modell használatával. A névjegykártya-elemzéssel kapcsolatos további információkért tekintse meg a Document Intelligence névjegykártya-modelljét.

Az URL-címből származó névjegykártyák elemzéséhez használja a beginRecognizeBusinessCardsFromURL módszert.

async function recognizeBusinessCards() {
    bcUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/businessCard.png";
    const poller = await client.beginRecognizeBusinessCardsFromUrl(bcUrl, {
        onProgress: (state) => {
            console.log(`status: ${state.status}`);
        }
    });

    const [businessCard] = await poller.pollUntilDone();

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

    const contactNames = businessCard.fields["ContactNames"].value;
    if (Array.isArray(contactNames)) {
        console.log("- Contact Names:");
        for (const contactName of contactNames) {
            if (contactName.valueType === "object") {
                const firstName = contactName.value?.["FirstName"].value ?? "<no first name>";
                const lastName = contactName.value?.["LastName"].value ?? "<no last name>";
                console.log(`  - ${firstName} ${lastName} (${contactName.confidence} confidence)`);
            }
        }
    }

    printSimpleArrayField(businessCard, "CompanyNames");
    printSimpleArrayField(businessCard, "Departments");
    printSimpleArrayField(businessCard, "JobTitles");
    printSimpleArrayField(businessCard, "Emails");
    printSimpleArrayField(businessCard, "Websites");
    printSimpleArrayField(businessCard, "Addresses");
    printSimpleArrayField(businessCard, "MobilePhones");
    printSimpleArrayField(businessCard, "Faxes");
    printSimpleArrayField(businessCard, "WorkPhones");
    printSimpleArrayField(businessCard, "OtherPhones");
}

// Helper function to print array field values. 
function printSimpleArrayField(businessCard, fieldName) {
    const fieldValues = businessCard.fields[fieldName]?.value;
    if (Array.isArray(fieldValues)) {
        console.log(`- ${fieldName}:`);
        for (const item of fieldValues) {
            console.log(`  - ${item.value ?? "<no value>"} (${item.confidence} confidence)`);
        }
    } else if (fieldValues === undefined) {
        console.log(`No ${fieldName} were found in the document.`);
    } else {
        console.error(
            `Error: expected field "${fieldName}" to be an Array, but it was a(n) ${businessCard.fields[fieldName].valueType}`
        );
    }
}

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

Tipp.

A helyi névjegykártya-rendszerképeket a FormRecognizerClient metódusokkal is elemezheti, példáulbeginRecognizeBusinessCards.

Számlák elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a gyakori mezőket az értékesítési számlákból egy előre betanított modell használatával. A számlaelemzéssel kapcsolatos további információkért tekintse meg a Dokumentumintelligencia számlamodellt.

Az URL-címről származó számlák elemzéséhez használja a metódust beginRecognizeInvoicesFromUrl .

async function recognizeInvoices() {
    invoiceUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/invoice_sample.jpg";

    const poller = await client.beginRecognizeInvoicesFromUrl(invoiceUrl, {
        onProgress: (state) => {
            console.log(`status: ${state.status}`);
        }
    });

    const [invoice] = await poller.pollUntilDone();
    if (invoice === undefined) {
        throw new Error("Failed to extract data from at least one invoice.");
    }

    // Helper function to print fields.
    function fieldToString(field) {
        const {
            name,
            valueType,
            value,
            confidence
        } = field;
        return `${name} (${valueType}): '${value}' with confidence ${confidence}'`;
    }

    console.log("Invoice fields:");

    for (const [name, field] of Object.entries(invoice.fields)) {
        if (field.valueType !== "array" && field.valueType !== "object") {
            console.log(`- ${name} ${fieldToString(field)}`);
        }
    }

    let idx = 0;

    console.log("- Items:");

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

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

Tipp.

A helyi nyugtaképeket a FormRecognizerClient metódusokkal is elemezheti, példáulbeginRecognizeInvoices.

Azonosító dokumentumok elemzése

Ez a szakasz bemutatja, hogyan elemezheti és kinyerheti a kulcsfontosságú információkat a kormányzati azonosító dokumentumokból, beleértve a világútleveleket és az egyesült államokbeli jogosítványokat a Document Intelligence előre összeállított azonosító modelljének használatával. Az azonosító dokumentumelemzésével kapcsolatos további információkért tekintse meg a Dokumentumintelligencia-azonosító dokumentummodellt.

Az URL-cím azonosító dokumentumainak elemzéséhez használja a metódust beginRecognizeIdDocumentsFromUrl .

async function recognizeIdDocuments() {
    idUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/id-license.jpg";
    const poller = await client.beginRecognizeIdDocumentsFromUrl(idUrl, {
        onProgress: (state) => {
            console.log(`status: ${state.status}`);
        }
    });

    const [idDocument] = await poller.pollUntilDone();

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

    console.log("Document Type:", idDocument.formType);

    console.log("Identity Document Fields:");

    function printField(fieldName) {
        // Fields are extracted from the `fields` property of the document result
        const field = idDocument.fields[fieldName];
        console.log(
            `- ${fieldName} (${field?.valueType}): '${field?.value ?? "<missing>"}', with confidence ${field?.confidence
            }`
        );
    }

    printField("FirstName");
    printField("LastName");
    printField("DocumentNumber");
    printField("DateOfBirth");
    printField("DateOfExpiration");
    printField("Sex");
    printField("Address");
    printField("Country");
    printField("Region");
}

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

Egyéni modell betanítása

Ez a szakasz bemutatja, hogyan taníthat be egy modellt saját adataival. A betanított modellek olyan strukturált adatokat adhatnak ki, amelyek tartalmazzák az eredeti dokumentumban szereplő kulcs-érték kapcsolatokat. A modell betanítása után tesztelheti, átképezheti és végül felhasználhatja, hogy az igényeinek megfelelően megbízhatóan kinyerje az adatokat több űrlapból.

Feljegyzés

A modelleket grafikus felhasználói felülettel (GUI) is betanítheti, például a Dokumentumintelligencia-mintacímkéző eszközzel.

Modell betanítása címkék nélkül

Egyéni modellek betanítása az egyéni űrlapokban található összes mező és érték elemzéséhez a betanítási dokumentumok manuális címkézése nélkül.

Az alábbi függvény betanítása egy modellt egy adott dokumentumkészletre, és kinyomtatja a modell állapotát a konzolon.

async function trainModel() {

    const containerSasUrl = "<SAS-URL-of-your-form-folder-in-blob-storage>";

    const poller = await trainingClient.beginTraining(containerSasUrl, false, {
        onProgress: (state) => { console.log(`training status: ${state.status}`); }
    });
    const model = await poller.pollUntilDone();

    if (!model) {
        throw new Error("Expecting valid training result!");
    }

    console.log(`Model ID: ${model.modelId}`);
    console.log(`Status: ${model.status}`);
    console.log(`Training started on: ${model.trainingStartedOn}`);
    console.log(`Training completed on: ${model.trainingCompletedOn}`);

    if (model.submodels) {
        for (const submodel of model.submodels) {
            // since the training data is unlabeled, we are unable to return the accuracy of this model
            console.log("We have recognized the following fields");
            for (const key in submodel.fields) {
                const field = submodel.fields[key];
                console.log(`The model found field '${field.name}'`);
            }
        }
    }
    // Training document information
    if (model.trainingDocuments) {
        for (const doc of model.trainingDocuments) {
            console.log(`Document name: ${doc.name}`);
            console.log(`Document status: ${doc.status}`);
            console.log(`Document page count: ${doc.pageCount}`);
            console.log(`Document errors: ${doc.errors}`);
        }
    }
}

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

Az alábbi kimenet egy, a JavaScript SDK-ból elérhető betanítási adatokkal betanított modell kimenete. Ezt a mintaeredményt csonkoltuk az olvashatóság érdekében.

training status: creating
training status: ready
Model ID: 9d893595-1690-4cf2-a4b1-fbac0fb11909
Status: ready
Training started on: Thu Aug 20 2020 20:27:26 GMT-0700 (Pacific Daylight Time)
Training completed on: Thu Aug 20 2020 20:27:37 GMT-0700 (Pacific Daylight Time)
We have recognized the following fields
The model found field 'field-0'
The model found field 'field-1'
The model found field 'field-2'
The model found field 'field-3'
The model found field 'field-4'
The model found field 'field-5'
The model found field 'field-6'
The model found field 'field-7'
...
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors:
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors:
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors:
...

Modell betanítása címkékkel

Az egyéni modellek betanításához manuálisan is megjelölheti a betanítási dokumentumokat. A címkékkel való betanítás bizonyos esetekben jobb teljesítményt eredményez. Címkékkel való betanításhoz speciális címkeinformációs fájlokkal (<fájlnév>.pdf.labels.json) kell rendelkeznie a blobtárolóban a betanítási dokumentumok mellett. A dokumentumintelligencia-mintacímkézési eszköz felhasználói felületet biztosít ezeknek a címkefájloknak a létrehozásához. Miután lekérte őket, meghívhatja a beginTraining metódust a uselabels paraméter beállításával true.

async function trainModelLabels() {

    const containerSasUrl = "<SAS-URL-of-your-form-folder-in-blob-storage>";

    const poller = await trainingClient.beginTraining(containerSasUrl, true, {
        onProgress: (state) => { console.log(`training status: ${state.status}`); }
    });
    const model = await poller.pollUntilDone();

    if (!model) {
        throw new Error("Expecting valid training result!");
    }

    console.log(`Model ID: ${model.modelId}`);
    console.log(`Status: ${model.status}`);
    console.log(`Training started on: ${model.trainingStartedOn}`);
    console.log(`Training completed on: ${model.trainingCompletedOn}`);

    if (model.submodels) {
        for (const submodel of model.submodels) {
            // since the training data is unlabeled, we are unable to return the accuracy of this model
            console.log("We have recognized the following fields");
            for (const key in submodel.fields) {
                const field = submodel.fields[key];
                console.log(`The model found field '${field.name}'`);
            }
        }
    }
    // Training document information
    if (model.trainingDocuments) {
        for (const doc of model.trainingDocuments) {
            console.log(`Document name: ${doc.name}`);
            console.log(`Document status: ${doc.status}`);
            console.log(`Document page count: ${doc.pageCount}`);
            console.log(`Document errors: ${doc.errors}`);
        }
    }
}

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

Az alábbi kimenet egy, a JavaScript SDK-ból elérhető betanítási adatokkal betanított modell kimenete. Ezt a mintaeredményt csonkoltuk az olvashatóság érdekében.

training status: creating
training status: ready
Model ID: 789b1b37-4cc3-4e36-8665-9dde68618072
Status: ready
Training started on: Thu Aug 20 2020 20:30:37 GMT-0700 (Pacific Daylight Time)
Training completed on: Thu Aug 20 2020 20:30:43 GMT-0700 (Pacific Daylight Time)
We have recognized the following fields
The model found field 'CompanyAddress'
The model found field 'CompanyName'
The model found field 'CompanyPhoneNumber'
The model found field 'DatedAs'
...
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
...

Űrlapok elemzése egyéni modellel

Ez a szakasz bemutatja, hogyan nyerhet ki kulcs-/értékadatokat és egyéb tartalmakat az egyéni sablontípusokból a saját űrlapjaival betanított modellek használatával.

Fontos

A forgatókönyv implementálásához már be kell tanítania egy modellt, hogy átadhassa az azonosítóját a metódusműveletnek. Lásd a Modell betanítása szakaszt.

A metódust beginRecognizeCustomFormsFromUrl használja. A visszaadott érték objektumok gyűjteménye RecognizedForm . A beküldött dokumentumban minden laphoz egy objektum tartozik.

async function recognizeCustom() {
    // Model ID from when you trained your model.
    const modelId = "<modelId>";
    const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";

    const poller = await client.beginRecognizeCustomForms(modelId, formUrl, {
        onProgress: (state) => { console.log(`status: ${state.status}`); }
    });
    const forms = await poller.pollUntilDone();

    console.log("Forms:");
    for (const form of forms || []) {
        console.log(`${form.formType}, page range: ${form.pageRange}`);
        console.log("Pages:");
        for (const page of form.pages || []) {
            console.log(`Page number: ${page.pageNumber}`);
            console.log("Tables");
            for (const table of page.tables || []) {
                for (const cell of table.cells) {
                    console.log(`cell (${cell.rowIndex},${cell.columnIndex}) ${cell.text}`);
                }
            }
        }

        console.log("Fields:");
        for (const fieldName in form.fields) {
            // each field is of type FormField
            const field = form.fields[fieldName];
            console.log(
                `Field ${fieldName} has value '${field.value}' with a confidence score of ${field.confidence}`
            );
        }
    }
}

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

Tipp.

A helyi fájlokat a FormRecognizerClient metódusokkal is elemezheti, példáulbeginRecognizeCustomForms.

status: notStarted
status: succeeded
Forms:
custom:form, page range: [object Object]
Pages:
Page number: 1
Tables
cell (0,0) Invoice Number
cell (0,1) Invoice Date
cell (0,2) Invoice Due Date
cell (0,3) Charges
cell (0,5) VAT ID
cell (1,0) 34278587
cell (1,1) 6/18/2017
cell (1,2) 6/24/2017
cell (1,3) $56,651.49
cell (1,5) PT
Fields:
Field Merchant has value 'Invoice For:' with a confidence score of 0.116
Field CompanyPhoneNumber has value '$56,651.49' with a confidence score of 0.249
Field VendorName has value 'Charges' with a confidence score of 0.145
Field CompanyAddress has value '1 Redmond way Suite 6000 Redmond, WA' with a confidence score of 0.258
Field CompanyName has value 'PT' with a confidence score of 0.245
Field Website has value '99243' with a confidence score of 0.114
Field DatedAs has value 'undefined' with a confidence score of undefined
Field Email has value 'undefined' with a confidence score of undefined
Field PhoneNumber has value 'undefined' with a confidence score of undefined
Field PurchaseOrderNumber has value 'undefined' with a confidence score of undefined
Field Quantity has value 'undefined' with a confidence score of undefined
Field Signature has value 'undefined' with a confidence score of undefined
Field Subtotal has value 'undefined' with a confidence score of undefined
Field Tax has value 'undefined' with a confidence score of undefined
Field Total has value 'undefined' with a confidence score of undefined

Egyéni modellek kezelése

Ez a szakasz bemutatja, hogyan kezelheti a fiókjában tárolt egyéni modelleket. Az alábbi kód példaként egyetlen függvényben végzi el a modellkezelési feladatokat.

Modellek számának lekérése

Az alábbi kódblokk lekéri a fiókban jelenleg található modellek számát.

async function countModels() {
    // First, we see how many custom models we have, and what our limit is
    const accountProperties = await trainingClient.getAccountProperties();
    console.log(
        `Our account has ${accountProperties.customModelCount} custom models, and we can have at most ${accountProperties.customModelLimit} custom models`
    );
}
countModels().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Modellek listájának lekérése a fiókban

Az alábbi kódblokk a fiókban elérhető modellek teljes listáját tartalmazza, beleértve a modell létrehozásának időpontjára és aktuális állapotára vonatkozó információkat.

async function listModels() {

    // returns an async iteratable iterator that supports paging
    const result = trainingClient.listCustomModels();
    let i = 0;
    for await (const modelInfo of result) {
        console.log(`model ${i++}:`);
        console.log(modelInfo);
    }
}

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

Az eredmény az alábbi kimenethez hasonlóan néz ki.

model 0:
{
  modelId: '453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e',
  status: 'invalid',
  trainingStartedOn: 2020-08-20T22:28:52.000Z,
  trainingCompletedOn: 2020-08-20T22:28:53.000Z
}
model 1:
{
  modelId: '628739de-779c-473d-8214-d35c72d3d4f7',
  status: 'ready',
  trainingStartedOn: 2020-08-20T23:16:51.000Z,
  trainingCompletedOn: 2020-08-20T23:16:59.000Z
}
model 2:
{
  modelId: '789b1b37-4cc3-4e36-8665-9dde68618072',
  status: 'ready',
  trainingStartedOn: 2020-08-21T03:30:37.000Z,
  trainingCompletedOn: 2020-08-21T03:30:43.000Z
}
model 3:
{
  modelId: '9d893595-1690-4cf2-a4b1-fbac0fb11909',
  status: 'ready',
  trainingStartedOn: 2020-08-21T03:27:26.000Z,
  trainingCompletedOn: 2020-08-21T03:27:37.000Z
}

Modellazonosítók listájának lekérése oldal szerint

Ez a kódblokk többoldalas listát biztosít a modellekről és a modellazonosítókról.

async function listModelsByPage() {
    // using `byPage()`
    i = 1;
    for await (const response of trainingClient.listCustomModels().byPage()) {
        for (const modelInfo of response.modelList) {
            console.log(`model ${i++}: ${modelInfo.modelId}`);
        }
    }
}
listModelsByPage().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Az eredmény az alábbi kimenethez hasonlóan néz ki.

model 1: 453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e
model 2: 628739de-779c-473d-8214-d35c72d3d4f7
model 3: 789b1b37-4cc3-4e36-8665-9dde68618072

Modell lekérése azonosító alapján

Az alábbi függvény egy modellazonosítót vesz fel, és lekéri a megfelelő modellobjektumot. Ez a függvény alapértelmezés szerint nincs meghívva.

async function getModel(modelId) {
    // Now we'll get the first custom model in the paged list
    const model = await client.getCustomModel(modelId);
    console.log("--- First Custom Model ---");
    console.log(`Model Id: ${model.modelId}`);
    console.log(`Status: ${model.status}`);
    console.log("Documents used in training:");
    for (const doc of model.trainingDocuments || []) {
        console.log(`- ${doc.name}`);
    }
}

Modell törlése az erőforrásfiókból

A modell az azonosítójára való hivatkozással is törölhető a fiókjából. Ez a függvény törli a modellt a megadott azonosítóval. Ez a függvény alapértelmezés szerint nincs meghívva.

async function deleteModel(modelId) {
    await client.deleteModel(modelId);
    try {
        const deleted = await client.getCustomModel(modelId);
        console.log(deleted);
    } catch (err) {
        // Expected
        console.log(`Model with id ${modelId} has been deleted`);
    }
}

Az eredmény az alábbi kimenethez hasonlóan néz ki.

Model with id 789b1b37-4cc3-4e36-8665-9dde68618072 has been deleted

Az alkalmazás futtatása

Futtassa az alkalmazást a node projektfájl parancsával.

node index.js

Az erőforrások eltávolítása

Ha törölni és eltávolítani szeretne egy Azure AI-szolgáltatási előfizetést, törölheti az erőforrást vagy az erőforráscsoportot. Az erőforráscsoport törlése a hozzá társított egyéb erőforrásokat is törli.

Hibaelhárítás

A következő környezeti változót beállíthatja a hibakeresési naplók megtekintéséhez a kódtár használatakor.

export DEBUG=azure*

A naplók engedélyezésének részletes útmutatását a @azure/logger csomag dokumentációjában találja.

Következő lépések

Ebben a projektben a Document Intelligence JavaScript ügyfélkódtárával különböző módokon taníthat be modelleket és elemezhet űrlapokat. Ezután megtudhatja, hogyan hozhat létre jobb betanítási adatkészletet, és pontosabb modelleket hozhat létre.

Fontos

Ez a projekt a Document Intelligence REST API 2.1-es verzióját célozza meg.

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

Előfeltételek

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

  • Python 3.x. A Python-telepítésnek tartalmaznia kell a pipet. A parancssorban futtatva 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.

  • Betanítási adatokat tartalmazó Azure Storage-blob. Az egyéni modell összeállítása és betanítása tippeket és lehetőségeket kínál a betanítási adatkészlet összeállításához. Ebben a projektben a mintaadatkészlet Betanítása mappájában lévő fájlokat használhatja. Töltse le és bontsa ki a sample_data.zip.

  • Dokumentumintelligencia-erőforrás. Hozzon létre egy dokumentumintelligencia-erőforrást az Azure Portalon. 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.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

A programozási környezet beállítása

Telepítse az ügyfélkódtárat, és hozzon létre egy Python-alkalmazást.

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

  • A Python telepítése után futtassa a következő parancsot a Dokumentumintelligencia-ügyfélkódtár legújabb verziójának telepítéséhez.

    pip install azure-ai-formrecognizer 
    

Python-alkalmazás létrehozása

  1. Hozzon létre egy form-recognizer.py nevű Python-alkalmazást egy szerkesztőben vagy IDE-ben.

  2. Importálja a következő kódtárakat.

    import os
    from azure.core.exceptions import ResourceNotFoundError
    from azure.ai.formrecognizer import FormRecognizerClient
    from azure.ai.formrecognizer import FormTrainingClient
    from azure.core.credentials import AzureKeyCredential
    
  3. Hozzon létre változókat az erőforrás Azure-végpontja és -kulcsa számára.

    endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"
    key = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE"
    

Az objektummodell használata

A Dokumentumintelligencia segítségével két különböző ügyféltípust hozhat létre. Az első, form_recognizer_clientlekérdezi a szolgáltatást az űrlapmezők és a tartalom felismeréséhez. A második, form_training_clientegyéni modelleket hoz létre és kezel a felismerés javítása érdekében.

form_recognizer_client a következő műveleteket biztosítja:

  • Az űrlapmezők és -tartalmak felismerése az egyéni űrlapok elemzésére betanított egyéni modellek használatával.
  • A modellek betanítása nélkül felismerhet űrlaptartalmakat, például táblázatokat, sorokat és szavakat.
  • A bizonylatintelligencia szolgáltatás előre betanított nyugtamodelljének használatával felismerheti a nyugták gyakori mezőit.

form_training_client a következő műveletekhez nyújt műveleteket:

  • Egyéni modellek betanítása az egyéni űrlapokban található összes mező és érték elemzéséhez. Ebben a cikkben címkék nélküli modell betanítása című témakörben olvashat.
  • Egyéni modellek betanítása az egyéni űrlapok címkézésével megadott mezők és értékek elemzéséhez. Lásd: Modell betanítása címkékkel ebben a cikkben.
  • Kezelheti a fiókjában létrehozott modelleket.
  • Egyéni modell másolása egy dokumentumintelligencia-erőforrásból egy másikba.

Feljegyzés

A modelleket grafikus felhasználói felülettel, például a Dokumentumintelligencia-címkézési eszközzel is be lehet tanítani.

Az ügyfél hitelesítése

Két ügyfélobjektum hitelesítése a korábban definiált előfizetési változók használatával. Használjon objektumot AzureKeyCredential , hogy szükség esetén új ügyfélobjektumok létrehozása nélkül frissíthesse a kulcsot.

form_recognizer_client = FormRecognizerClient(endpoint, AzureKeyCredential(key))
form_training_client = FormTrainingClient(endpoint, AzureKeyCredential(key))

Eszközök lekérése teszteléshez

A betanítási és tesztelési adatok URL-címeire mutató hivatkozásokat kell hozzáadnia.

  1. Az egyéni modell betanítási adataihoz tartozó SAS-URL-cím lekéréséhez nyissa meg a tárolóerőforrást az Azure Portalon, és válassza az Adattároló-tárolók> lehetőséget.

  2. Lépjen a tárolóra, kattintson a jobb gombbal, és válassza az SAS létrehozása lehetőséget.

    Kérje le a tároló SAS-ját, nem magát a tárfiókot.

  3. Győződjön meg arról, hogy az olvasási, írási, törlési és listaengedélyek ki vannak jelölve, és válassza az SAS-jogkivonat és AZ URL-cím létrehozása lehetőséget.

  4. Másolja az URL-szakaszban lévő értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

Használja a mintákban található mintaűrlapokat és nyugtaképeket, amelyek a GitHubon is elérhetők. Másik lehetőségként vagy a fenti lépésekkel lekérheti egy adott dokumentum SAS-URL-címét a Blob Storage-ban.

Feljegyzés

A projekt kódrészletei az URL-címek által elért távoli űrlapokat használják. Ha inkább helyi dokumentumokat szeretne feldolgozni, tekintse meg a kapcsolódó módszereket a referenciadokumentációban és a mintákban.

Elrendezés elemzése

A Dokumentumintelligencia segítségével elemezheti a dokumentumokban lévő táblákat, sorokat és szavakat anélkül, hogy be kellene tanítania egy modellt. Az elrendezések kinyeréséről további információt a Dokumentumintelligencia-elrendezési modellben talál.

Ha egy fájl tartalmát egy adott URL-címen szeretné elemezni, használja a metódust begin_recognize_content_from_url . A visszaadott érték objektumok gyűjteménye FormPage . A beküldött dokumentumban minden laphoz egy objektum tartozik. Az alábbi kód végigvezeti ezeket az objektumokat, és kinyomtatja a kinyert kulcs-/érték párokat és a táblaadatokat.

formUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/forms/Form_1.jpg"

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

table = page[0].tables[0] # page 1, table 1
print("Table found on page {}:".format(table.page_number))
for cell in table.cells:
    print("Cell text: {}".format(cell.text))
    print("Location: {}".format(cell.bounding_box))
    print("Confidence score: {}\n".format(cell.confidence))

Tipp.

A FormRecognizerClient metódusokkal helyi képekről is lekérhet tartalmakat, példáulbegin_recognize_content.

Table found on page 1:
Cell text: Invoice Number
Location: [Point(x=0.5075, y=2.8088), Point(x=1.9061, y=2.8088), Point(x=1.9061, y=3.3219), Point(x=0.5075, y=3.3219)]
Confidence score: 1.0

Cell text: Invoice Date
Location: [Point(x=1.9061, y=2.8088), Point(x=3.3074, y=2.8088), Point(x=3.3074, y=3.3219), Point(x=1.9061, y=3.3219)]
Confidence score: 1.0

Cell text: Invoice Due Date
Location: [Point(x=3.3074, y=2.8088), Point(x=4.7074, y=2.8088), Point(x=4.7074, y=3.3219), Point(x=3.3074, y=3.3219)]
Confidence score: 1.0

Cell text: Charges
Location: [Point(x=4.7074, y=2.8088), Point(x=5.386, y=2.8088), Point(x=5.386, y=3.3219), Point(x=4.7074, y=3.3219)]
Confidence score: 1.0
...

Visszaigazolások elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a gyakori mezőket az USA-beli nyugtákból egy előre betanított nyugtamodell használatával. A nyugtaelemzéssel kapcsolatos további információkért tekintse meg a Dokumentumintelligencia nyugtamodellt. Az URL-címből származó visszaigazolások elemzéséhez használja a metódust begin_recognize_receipts_from_url .

receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png"

poller = form_recognizer_client.begin_recognize_receipts_from_url(receiptUrl)
result = poller.result()

for receipt in result:
    for name, field in receipt.fields.items():
        if name == "Items":
            print("Receipt Items:")
            for idx, items in enumerate(field.value):
                print("...Item #{}".format(idx + 1))
                for item_name, item in items.value.items():
                    print("......{}: {} has confidence {}".format(item_name, item.value, item.confidence))
        else:
            print("{}: {} has confidence {}".format(name, field.value, field.confidence))

Tipp.

A helyi nyugtaképeket a FormRecognizerClient metódusokkal is elemezheti, példáulbegin_recognize_receipts.

ReceiptType: Itemized has confidence 0.659
MerchantName: Contoso Contoso has confidence 0.516
MerchantAddress: 123 Main Street Redmond, WA 98052 has confidence 0.986
MerchantPhoneNumber: None has confidence 0.99
TransactionDate: 2019-06-10 has confidence 0.985
TransactionTime: 13:59:00 has confidence 0.968
Receipt Items:
...Item #1
......Name: 8GB RAM (Black) has confidence 0.916
......TotalPrice: 999.0 has confidence 0.559
...Item #2
......Quantity: None has confidence 0.858
......Name: SurfacePen has confidence 0.858
......TotalPrice: 99.99 has confidence 0.386
Subtotal: 1098.99 has confidence 0.964
Tax: 104.4 has confidence 0.713
Total: 1203.39 has confidence 0.774

Névjegykártyák elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a gyakori mezőket angol névjegykártyákból egy előre betanított modell használatával. A névjegykártya-elemzéssel kapcsolatos további információkért tekintse meg a Document Intelligence névjegykártya-modelljét.

Az URL-címből származó névjegykártyák elemzéséhez használja a begin_recognize_business_cards_from_url módszert.

bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg"

poller = form_recognizer_client.begin_recognize_business_cards_from_url(bcUrl)
business_cards = poller.result()

for idx, business_card in enumerate(business_cards):
    print("--------Recognizing business card #{}--------".format(idx+1))
    contact_names = business_card.fields.get("ContactNames")
    if contact_names:
        for contact_name in contact_names.value:
            print("Contact First Name: {} has confidence: {}".format(
                contact_name.value["FirstName"].value, contact_name.value["FirstName"].confidence
            ))
            print("Contact Last Name: {} has confidence: {}".format(
                contact_name.value["LastName"].value, contact_name.value["LastName"].confidence
            ))
    company_names = business_card.fields.get("CompanyNames")
    if company_names:
        for company_name in company_names.value:
            print("Company Name: {} has confidence: {}".format(company_name.value, company_name.confidence))
    departments = business_card.fields.get("Departments")
    if departments:
        for department in departments.value:
            print("Department: {} has confidence: {}".format(department.value, department.confidence))
    job_titles = business_card.fields.get("JobTitles")
    if job_titles:
        for job_title in job_titles.value:
            print("Job Title: {} has confidence: {}".format(job_title.value, job_title.confidence))
    emails = business_card.fields.get("Emails")
    if emails:
        for email in emails.value:
            print("Email: {} has confidence: {}".format(email.value, email.confidence))
    websites = business_card.fields.get("Websites")
    if websites:
        for website in websites.value:
            print("Website: {} has confidence: {}".format(website.value, website.confidence))
    addresses = business_card.fields.get("Addresses")
    if addresses:
        for address in addresses.value:
            print("Address: {} has confidence: {}".format(address.value, address.confidence))
    mobile_phones = business_card.fields.get("MobilePhones")
    if mobile_phones:
        for phone in mobile_phones.value:
            print("Mobile phone number: {} has confidence: {}".format(phone.value, phone.confidence))
    faxes = business_card.fields.get("Faxes")
    if faxes:
        for fax in faxes.value:
            print("Fax number: {} has confidence: {}".format(fax.value, fax.confidence))
    work_phones = business_card.fields.get("WorkPhones")
    if work_phones:
        for work_phone in work_phones.value:
            print("Work phone number: {} has confidence: {}".format(work_phone.value, work_phone.confidence))
    other_phones = business_card.fields.get("OtherPhones")
    if other_phones:
        for other_phone in other_phones.value:
            print("Other phone number: {} has confidence: {}".format(other_phone.value, other_phone.confidence))

Tipp.

A helyi névjegykártya-rendszerképeket a FormRecognizerClient metódusokkal is elemezheti, például begin_recognize_business_cards.

Számlák elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a gyakori mezőket az értékesítési számlákból egy előre betanított modell használatával. A számlaelemzéssel kapcsolatos további információkért tekintse meg a Dokumentumintelligencia számlamodellt.

Az URL-címről származó számlák elemzéséhez használja a metódust begin_recognize_invoices_from_url .

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

poller = form_recognizer_client.begin_recognize_invoices_from_url(invoiceUrl)
invoices = poller.result()

for idx, invoice in enumerate(invoices):
    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))
    customer_name = invoice.fields.get("CustomerName")
    if customer_name:
        print("Customer Name: {} has confidence: {}".format(customer_name.value, customer_name.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))

Tipp.

A helyi számlarendszerképeket a FormRecognizerClient metódusokkal is elemezheti, például begin_recognize_invoices.

Azonosító dokumentumok elemzése

Ez a szakasz bemutatja, hogyan elemezheti és kinyerheti a kulcsfontosságú információkat a kormányzati azonosító dokumentumokból, beleértve a világútleveleket és az egyesült államokbeli jogosítványokat a Document Intelligence előre összeállított azonosító modelljének használatával. Az azonosító dokumentumelemzésével kapcsolatos további információkért tekintse meg a Dokumentumintelligencia-azonosító dokumentummodellt.

Az URL-cím azonosító dokumentumainak elemzéséhez használja a metódust begin_recognize_id_documents_from_url .

idURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg"

for idx, id_document in enumerate(id_documents):
    print("--------Recognizing ID document #{}--------".format(idx+1))
    first_name = id_document.fields.get("FirstName")
    if first_name:
        print("First Name: {} has confidence: {}".format(first_name.value, first_name.confidence))
    last_name = id_document.fields.get("LastName")
    if last_name:
        print("Last Name: {} has confidence: {}".format(last_name.value, last_name.confidence))
    document_number = id_document.fields.get("DocumentNumber")
    if document_number:
        print("Document Number: {} has confidence: {}".format(document_number.value, document_number.confidence))
    dob = id_document.fields.get("DateOfBirth")
    if dob:
        print("Date of Birth: {} has confidence: {}".format(dob.value, dob.confidence))
    doe = id_document.fields.get("DateOfExpiration")
    if doe:
        print("Date of Expiration: {} has confidence: {}".format(doe.value, doe.confidence))
    sex = id_document.fields.get("Sex")
    if sex:
        print("Sex: {} has confidence: {}".format(sex.value, sex.confidence))
    address = id_document.fields.get("Address")
    if address:
        print("Address: {} has confidence: {}".format(address.value, address.confidence))
    country_region = id_document.fields.get("CountryRegion")
    if country_region:
        print("Country/Region: {} has confidence: {}".format(country_region.value, country_region.confidence))
    region = id_document.fields.get("Region")
    if region:
        print("Region: {} has confidence: {}".format(region.value, region.confidence))

Tipp.

Az azonosító dokumentumképeket a FormRecognizerClient metódusokkal is elemezheti, például begin_recognize_identity_documents.

Egyéni modell betanítása

Ez a szakasz bemutatja, hogyan taníthat be egy modellt saját adataival. A betanított modellek olyan strukturált adatokat adhatnak ki, amelyek tartalmazzák az eredeti dokumentumban szereplő kulcs-érték kapcsolatokat. A modell betanítása után tesztelheti, átképezheti és végül felhasználhatja, hogy az igényeinek megfelelően megbízhatóan kinyerje az adatokat több űrlapból.

Feljegyzés

A modelleket grafikus felhasználói felülettel, például a Dokumentumintelligencia-mintacímkéző eszközzel is betanítheti.

Modell betanítása címkék nélkül

Egyéni modellek betanítása az egyéni űrlapokban található összes mező és érték elemzéséhez a betanítási dokumentumok manuális címkézése nélkül.

Az alábbi kód a betanítási ügyfelet és a begin_training függvényt használja egy modell betanítására egy adott dokumentumkészleten. A visszaadott CustomFormModel objektum információkat tartalmaz a modell által elemezhető űrlaptípusokról és az egyes űrlaptípusokból kinyerhető mezőkről. Az alábbi kódblokk ezt az információt a konzolra nyomtatja.

# To train a model you need an Azure Storage account.
# Use the SAS URL to access your training files.
trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE"

poller = form_training_client.begin_training(trainingDataUrl, use_training_labels=False)
model = poller.result()

print("Model ID: {}".format(model.model_id))
print("Status: {}".format(model.status))
print("Training started on: {}".format(model.training_started_on))
print("Training completed on: {}".format(model.training_completed_on))

print("\nRecognized fields:")
for submodel in model.submodels:
    print(
        "The submodel with form type '{}' has recognized the following fields: {}".format(
            submodel.form_type,
            ", ".join(
                [
                    field.label if field.label else name
                    for name, field in submodel.fields.items()
                ]
            ),
        )
    )

# Training result information
for doc in model.training_documents:
    print("Document name: {}".format(doc.name))
    print("Document status: {}".format(doc.status))
    print("Document page count: {}".format(doc.page_count))
    print("Document errors: {}".format(doc.errors))

Az alábbi kimenet a Python SDK-ból elérhető betanítási adatokkal betanított modell kimenete.

Model ID: 628739de-779c-473d-8214-d35c72d3d4f7
Status: ready
Training started on: 2020-08-20 23:16:51+00:00
Training completed on: 2020-08-20 23:16:59+00:00

Recognized fields:
The submodel with form type 'form-0' has recognized the following fields: Additional Notes:, Address:, Company Name:, Company Phone:, Dated As:, Details, Email:, Hero Limited, Name:, Phone:, Purchase Order, Purchase Order #:, Quantity, SUBTOTAL, Seattle, WA 93849 Phone:, Shipped From, Shipped To, TAX, TOTAL, Total, Unit Price, Vendor Name:, Website:
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_4.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_5.jpg
Document status: succeeded
Document page count: 1
Document errors: []

Modell betanítása címkékkel

Az egyéni modellek betanításához manuálisan is megjelölheti a betanítási dokumentumokat. A címkékkel való betanítás bizonyos esetekben jobb teljesítményt eredményez. A visszaadott CustomFormModel érték azt jelzi, hogy a modell milyen mezőket tud kinyerni, valamint az egyes mezők becsült pontosságát. Az alábbi kódblokk ezt az információt a konzolra nyomtatja.

Fontos

Címkékkel való betanításhoz speciális címkeinformációs fájlokkal (<fájlnév>.pdf.labels.json) kell rendelkeznie a blobtárolóban a betanítási dokumentumok mellett. A dokumentumintelligencia-mintacímkézési eszköz felhasználói felületet biztosít ezeknek a címkefájloknak a létrehozásához. Miután lekérte őket, meghívhatja a begin_training függvényt úgy, hogy a paraméter a use_training_labels következőre van trueállítva.

# To train a model you need an Azure Storage account.
# Use the SAS URL to access your training files.
trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE"

poller = form_training_client.begin_training(trainingDataUrl, use_training_labels=True)
model = poller.result()
trained_model_id = model.model_id

print("Model ID: {}".format(trained_model_id))
print("Status: {}".format(model.status))
print("Training started on: {}".format(model.training_started_on))
print("Training completed on: {}".format(model.training_completed_on))

print("\nRecognized fields:")
for submodel in model.submodels:
    print(
        "The submodel with form type '{}' has recognized the following fields: {}".format(
            submodel.form_type,
            ", ".join(
                [
                    field.label if field.label else name
                    for name, field in submodel.fields.items()
                ]
            ),
        )
    )

# Training result information
for doc in model.training_documents:
    print("Document name: {}".format(doc.name))
    print("Document status: {}".format(doc.status))
    print("Document page count: {}".format(doc.page_count))
    print("Document errors: {}".format(doc.errors))

Az alábbi kimenet a Python SDK-ból elérhető betanítási adatokkal betanított modell kimenete.

Model ID: ae636292-0b14-4e26-81a7-a0bfcbaf7c91

Status: ready
Training started on: 2020-08-20 23:20:56+00:00
Training completed on: 2020-08-20 23:20:57+00:00

Recognized fields:
The submodel with form type 'form-ae636292-0b14-4e26-81a7-a0bfcbaf7c91' has recognized the following fields: CompanyAddress, CompanyName, CompanyPhoneNumber, DatedAs, Email, Merchant, PhoneNumber, PurchaseOrderNumber, Quantity, Signature, Subtotal, Tax, Total, VendorName, Website
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_4.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_5.jpg
Document status: succeeded
Document page count: 1
Document errors: []

Űrlapok elemzése egyéni modellel

Ez a szakasz bemutatja, hogyan nyerhet ki kulcs-/értékadatokat és egyéb tartalmakat az egyéni sablontípusokból a saját űrlapjaival betanított modellek használatával.

Fontos

A forgatókönyv implementálásához már be kell tanítania egy modellt, hogy átadhassa az azonosítóját a metódusműveletnek. Lásd a Modell betanítása szakaszt.

A metódust begin_recognize_custom_forms_from_url használja. A visszaadott érték objektumok gyűjteménye RecognizedForm . A beküldött dokumentumban minden laphoz egy objektum tartozik. Az alábbi kód kinyomtatja az elemzési eredményeket a konzolon. Kinyomtatja az egyes felismert mezőket és a megfelelő értékeket, valamint egy megbízhatósági pontszámot.


poller = form_recognizer_client.begin_recognize_custom_forms_from_url(
    model_id=trained_model_id, form_url=formUrl)
result = poller.result()

for recognized_form in result:
    print("Form type: {}".format(recognized_form.form_type))
    for name, field in recognized_form.fields.items():
        print("Field '{}' has label '{}' with value '{}' and a confidence score of {}".format(
            name,
            field.label_data.text if field.label_data else name,
            field.value,
            field.confidence
        ))

Tipp.

Helyi képeket is elemezhet. Lásd a FormRecognizerClient metódusokat, például begin_recognize_custom_forms. Vagy tekintse meg a GitHub mintakódját a helyi rendszerképeket érintő forgatókönyvekhez.

Az előző példában szereplő modell a következő kimenetet jeleníti meg:

Form type: form-ae636292-0b14-4e26-81a7-a0bfcbaf7c91
Field 'Merchant' has label 'Merchant' with value 'Invoice For:' and a confidence score of 0.116
Field 'CompanyAddress' has label 'CompanyAddress' with value '1 Redmond way Suite 6000 Redmond, WA' and a confidence score of 0.258
Field 'Website' has label 'Website' with value '99243' and a confidence score of 0.114
Field 'VendorName' has label 'VendorName' with value 'Charges' and a confidence score of 0.145
Field 'CompanyPhoneNumber' has label 'CompanyPhoneNumber' with value '$56,651.49' and a confidence score of 0.249
Field 'CompanyName' has label 'CompanyName' with value 'PT' and a confidence score of 0.245
Field 'DatedAs' has label 'DatedAs' with value 'None' and a confidence score of None
Field 'Email' has label 'Email' with value 'None' and a confidence score of None
Field 'PhoneNumber' has label 'PhoneNumber' with value 'None' and a confidence score of None
Field 'PurchaseOrderNumber' has label 'PurchaseOrderNumber' with value 'None' and a confidence score of None
Field 'Quantity' has label 'Quantity' with value 'None' and a confidence score of None
Field 'Signature' has label 'Signature' with value 'None' and a confidence score of None
Field 'Subtotal' has label 'Subtotal' with value 'None' and a confidence score of None
Field 'Tax' has label 'Tax' with value 'None' and a confidence score of None
Field 'Total' has label 'Total' with value 'None' and a confidence score of None

Egyéni modellek kezelése

Ez a szakasz bemutatja, hogyan kezelheti a fiókjában tárolt egyéni modelleket.

A Modellek számának ellenőrzése a FormRecognizer erőforrásfiókban

Az alábbi kódblokk ellenőrzi, hogy hány modellt mentett a Dokumentumintelligencia-fiókban, és összehasonlítja azt a fiókkorlátkal.

account_properties = form_training_client.get_account_properties()
print("Our account has {} custom models, and we can have at most {} custom models".format(
    account_properties.custom_model_count, account_properties.custom_model_limit
))

Az eredmény az alábbi kimenethez hasonlóan néz ki.

Our account has 5 custom models, and we can have at most 5000 custom models

Az erőforrásfiókban jelenleg tárolt modellek listázása

Az alábbi kód letiltja a fiók aktuális modelljeit, és kinyomtatja a részleteket a konzolon. Az első modellre mutató hivatkozást is ment.

# Next, we get a paged list of all of our custom models
custom_models = form_training_client.list_custom_models()

print("We have models with the following ids:")

# Let's pull out the first model
first_model = next(custom_models)
print(first_model.model_id)
for model in custom_models:
    print(model.model_id)

Az eredmény az alábbi kimenethez hasonlóan néz ki.

Íme egy mintakimenet a tesztfiókhoz.

We have models with the following ids:
453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e
628739de-779c-473d-8214-d35c72d3d4f7
ae636292-0b14-4e26-81a7-a0bfcbaf7c91
b4b5df77-8538-4ffb-a996-f67158ecd305
c6309148-6b64-4fef-aea0-d39521452699

Adott modell lekérése a modell azonosítójával

Az alábbi kódblokk az előző szakaszból mentett modellazonosítót használja, és a modell részleteinek lekérésére használja.

custom_model = form_training_client.get_custom_model(model_id=trained_model_id)
print("Model ID: {}".format(custom_model.model_id))
print("Status: {}".format(custom_model.status))
print("Training started on: {}".format(custom_model.training_started_on))
print("Training completed on: {}".format(custom_model.training_completed_on))

Az előző példában létrehozott egyéni modell mintakimenete.

Model ID: ae636292-0b14-4e26-81a7-a0bfcbaf7c91
Status: ready
Training started on: 2020-08-20 23:20:56+00:00
Training completed on: 2020-08-20 23:20:57+00:00

Modell törlése az erőforrásfiókból

A modell az azonosítójára való hivatkozással is törölhető a fiókjából. Ez a kód törli az előző szakaszban használt modellt.

form_training_client.delete_model(model_id=custom_model.model_id)

try:
    form_training_client.get_custom_model(model_id=custom_model.model_id)
except ResourceNotFoundError:
    print("Successfully deleted model with id {}".format(custom_model.model_id))

Az alkalmazás futtatása

Futtassa az alkalmazást a python következő paranccsal:

python form-recognizer.py

Az erőforrások eltávolítása

Ha törölni és eltávolítani szeretne egy Azure AI-szolgáltatási előfizetést, törölheti az erőforrást vagy az erőforráscsoportot. Az erőforráscsoport törlése a hozzá társított egyéb erőforrásokat is törli.

Hibaelhárítás

Ezek a problémák segíthetnek a hibaelhárításban.

Általános

A Dokumentumintelligencia-ügyfélkódtár az Azure Core-ban definiált kivételeket emeli ki.

Naplózás

Ez a kódtár a szokásos naplózási kódtárat használja a naplózáshoz. A HTTP-munkamenetekkel, például URL-címekkel és fejlécekkel kapcsolatos alapvető információkat az INFO szinten naplózza a rendszer.

A hibakeresési szint részletes naplózása, beleértve a kérelem-/választörzseket és a nem felügyelt fejléceket, engedélyezhető a kulcsszóargumentumot tartalmazó logging_enable ügyfélen:

import sys
import logging
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential

# Create a logger for the 'azure' SDK
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)

# Configure a console output
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)

endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"
credential = AzureKeyCredential("PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE")

# This client will log detailed information about its HTTP sessions, at DEBUG level
form_recognizer_client = FormRecognizerClient(endpoint, credential, logging_enable=True)

Hasonlóképpen logging_enable engedélyezheti a részletes naplózást egyetlen művelet esetében is, még akkor is, ha nincs engedélyezve az ügyfél számára:

receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png"
poller = form_recognizer_client.begin_recognize_receipts_from_url(receiptUrl, logging_enable=True)

REST-minták a GitHubon

Következő lépések

Ebben a projektben a Document Intelligence Python ügyfélkódtárral képezte be a modelleket, és különböző módokon elemezte az űrlapokat. Ezután megtudhatja, hogyan hozhat létre jobb betanítási adatkészletet, és pontosabb modelleket hozhat létre.

Feljegyzés

Ez a projekt az Azure AI Document Intelligence API 2.1-es verzióját célozza meg a cURL használatával REST API-hívások végrehajtásához.

Document Intelligence REST API | Azure REST API-referencia

Előfeltételek

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

  • A cURL parancssori eszköz telepítve van. A Windows 10 és a Windows 11 a cURL egy példányát szállítja. A parancssorba írja be a következő cURL-parancsot. Ha megjelennek a súgóbeállítások, a cURL telepítve van a Windows-környezetben.

    curl -help
    

    Ha a cURL nincs telepítve, itt szerezheti be:

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

  • Betanítási adatokat tartalmazó Azure Storage-blob. Az egyéni modell összeállítása és betanítása tippeket és lehetőségeket kínál a betanítási adatkészlet összeállításához. A fájlokat a mintaadatkészlet Betanítása mappájában használhatja. Töltse le és bontsa ki a sample_data.zip.

  • Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos szolgáltatást. 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 alkalmazás azure document intelligence szolgáltatáshoz való csatlakoztatásához létrehozott erőforrás kulcsa és végpontja.

    1. Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget.
    2. A bal oldali navigációs menüben válassza a Kulcsok és végpont lehetőséget.
    3. Másolja ki az egyik kulcsot és a végpontot a cikk későbbi részében való használatra.

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

  • Egy nyugta képének URL-címe. Mintaképet is használhat.

  • Névjegykártya képének URL-címe. Mintaképet is használhat.

  • Egy számla képének URL-címe. Mintadokumentumot is használhat.

  • Egy azonosító dokumentum képének URL-címe. Mintaképet is használhat

Elrendezés elemzése

A Dokumentumintelligencia segítségével elemezheti és kinyerheti a dokumentumokban lévő táblákat, kijelölési jeleket, szöveget és szerkezetet anélkül, hogy be kellene tanítania egy modellt. Az elrendezések kinyeréséről további információt a Dokumentumintelligencia-elrendezési modellben talál.

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

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-előfizetéshez beszerzett végpontra.
  2. Cserélje le <a kulcsot> az előző lépésből kimásolt kulcsra.
  3. Cserélje le <a dokumentum URL-címét> a példa URL-címek egyikére.
curl -v -i POST "https://<endpoint>/formrecognizer/v2.1/layout/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{​​​​​​​'source': '<your-document-url>'}​​​​​​​​"

Egy csak Operation-Location olvasható fejlécet tartalmazó választ kap202 (Success). 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:

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, lekérdezi 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 <a végpontot> a Dokumentumintelligencia-előfizetéshez beszerzett végpontra.
  2. Cserélje le <a kulcsot> az előző lépésből kimásolt kulcsra.
  3. Cserélje le <a resultId> azonosítót az előző lépés eredményazonosítójával.
curl -v -X GET "https://<endpoint>/formrecognizer/v2.1/layout/analyzeResults/<resultId>" -H "Ocp-Apim-Subscription-Key: <key>"

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.

A Contoso projektutasítási dokumentumának fényképe táblázattal.

Ez a válasz törzskimenete az egyszerűség kedvéért rövidült. Tekintse meg a teljes mintakimenetet a GitHubon.

{
    "status": "succeeded",
    "createdDateTime": "2020-08-20T20:40:50Z",
    "lastUpdatedDateTime": "2020-08-20T20:40:55Z",
    "analyzeResult": {
        "version": "2.1.0",
        "readResults": [
            {
                "page": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "lines": [
                    {
                        "boundingBox": [
                            0.5826,
                            0.4411,
                            2.3387,
                            0.4411,
                            2.3387,
                            0.7969,
                            0.5826,
                            0.7969
                        ],
                        "text": "Contoso, Ltd.",
                        "words": [
                            {
                                "boundingBox": [
                                    0.5826,
                                    0.4411,
                                    1.744,
                                    0.4411,
                                    1.744,
                                    0.7969,
                                    0.5826,
                                    0.7969
                                ],
                                "text": "Contoso,",
                                "confidence": 1
                            },
                            {
                                "boundingBox": [
                                    1.8448,
                                    0.4446,
                                    2.3387,
                                    0.4446,
                                    2.3387,
                                    0.7631,
                                    1.8448,
                                    0.7631
                                ],
                                "text": "Ltd.",
                                "confidence": 1
                            }
                        ]
                    },
                    ...
                        ]
                    }
                ],
                "selectionMarks": [
                    {
                        "boundingBox": [
                            3.9737,
                            3.7475,
                            4.1693,
                            3.7475,
                            4.1693,
                            3.9428,
                            3.9737,
                            3.9428
                        ],
                        "confidence": 0.989,
                        "state": "selected"
                    },
                    ...
                ]
            }
        ],
        "pageResults": [
            {
                "page": 1,
                "tables": [
                    {
                        "rows": 5,
                        "columns": 5,
                        "cells": [
                            {
                                "rowIndex": 0,
                                "columnIndex": 0,
                                "text": "Training Date",
                                "boundingBox": [
                                    0.5133,
                                    4.2167,
                                    1.7567,
                                    4.2167,
                                    1.7567,
                                    4.4492,
                                    0.5133,
                                    4.4492
                                ],
                                "elements": [
                                    "#/readResults/0/lines/12/words/0",
                                    "#/readResults/0/lines/12/words/1"
                                ]
                            },
                            ...
                        ]
                    },
                    ...
                ]
            }
        ]
    }
}

Visszaigazolások elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a gyakori mezőket az AMERIKAI nyugtákból egy előre betanított nyugtamodell használatával. A nyugtaelemzéssel kapcsolatos további információkért tekintse meg a Dokumentumintelligencia nyugtamodellt. A nyugta elemzésének megkezdéséhez hívja meg az Analyze Receipt API-t a cURL paranccsal. A parancs futtatása előtt végezze el a következő módosításokat:

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-előfizetéshez beszerzett végpontra.
  2. Cserélje le <a nyugta URL-címét> egy nyugtakép URL-címére.
  3. Cserélje le <a kulcsot> az előző lépésből kimásolt kulcsra.
curl -i -X POST "https://<endpoint>/formrecognizer/v2.1/prebuilt/receipt/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{ 'source': '<your receipt URL>'}"

Egy fejlécet 202 (Success) Operation-Location tartalmazó választ kap. 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>

A következő példában a következő operations/ sztring az eredményazonosító:

https://cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/operations/aeb13e15-555d-4f02-ba47-04d89b487ed5

Visszaigazolási eredmények lekérése

Miután meghívta az Analyze Receipt API-t, hívja meg a Get Analyze Receipt Result API-t a művelet és a kinyert adatok állapotának lekéréséhez. A parancs futtatása előtt végezze el a következő módosításokat:

  1. Cserélje le <a végpontot> a dokumentumintelligencia-kulccsal beszerzett végpontra.
  2. Cserélje le <a resultId> azonosítót az előző lépés eredményazonosítójával.
  3. Cserélje le <a kulcsot> a kulcsra.
curl -X GET "https://<endpoint>/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/<resultId>" -H "Ocp-Apim-Subscription-Key: <key>"

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.

A "readResults" csomópont tartalmazza az összes felismert szöveget, ha az opcionális includeTextDetails paramétert a következőre trueállítja be: ). A válasz oldal, majd sor, majd egyéni szavak szerint rendezi a szöveget. A "documentResults" csomópont tartalmazza a modell által felderített nyugtaspecifikus értékeket. A "documentResults" csomóponton olyan hasznos kulcs-/érték párokat talál, mint az adó, az összeg, a kereskedő címe stb.

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

A fénykép a Contoso nyomtatott nyugtát ábrázolja.

Ez a válasz törzskimenete rövidítve lett az olvashatóság érdekében. Tekintse meg a teljes mintakimenetet a GitHubon.

{
  "status":"succeeded",
  "createdDateTime":"2019-12-17T04:11:24Z",
  "lastUpdatedDateTime":"2019-12-17T04:11:32Z",
  "analyzeResult":{
    "version":"2.1.0",
    "readResults":[
      {
        "page":1,
        "angle":0.6893,
        "width":1688,
        "height":3000,
        "unit":"pixel",
        "language":"en",
        "lines":[
          {
            "text":"Contoso",
            "boundingBox":[
              635,
              510,
              1086,
              461,
              1098,
              558,
              643,
              604
            ],
            "words":[
              {
                "text":"Contoso",
                "boundingBox":[
                  639,
                  510,
                  1087,
                  461,
                  1098,
                  551,
                  646,
                  604
                ],
                "confidence":0.955
              }
            ]
          },
          ...
        ]
      }
    ],
    "documentResults":[
      {
        "docType":"prebuilt:receipt",
        "pageRange":[
          1,
          1
        ],
        "fields":{
          "ReceiptType":{
            "type":"string",
            "valueString":"Itemized",
            "confidence":0.692
          },
          "MerchantName":{
            "type":"string",
            "valueString":"Contoso Contoso",
            "text":"Contoso Contoso",
            "boundingBox":[
              378.2,
              292.4,
              1117.7,
              468.3,
              1035.7,
              812.7,
              296.3,
              636.8
            ],
            "page":1,
            "confidence":0.613,
            "elements":[
              "#/readResults/0/lines/0/words/0",
              "#/readResults/0/lines/1/words/0"
            ]
          },
          "MerchantAddress":{
            "type":"string",
            "valueString":"123 Main Street Redmond, WA 98052",
            "text":"123 Main Street Redmond, WA 98052",
            "boundingBox":[
              302,
              675.8,
              848.1,
              793.7,
              809.9,
              970.4,
              263.9,
              852.5
            ],
            "page":1,
            "confidence":0.99,
            "elements":[
              "#/readResults/0/lines/2/words/0",
              "#/readResults/0/lines/2/words/1",
              "#/readResults/0/lines/2/words/2",
              "#/readResults/0/lines/3/words/0",
              "#/readResults/0/lines/3/words/1",
              "#/readResults/0/lines/3/words/2"
            ]
          },
          "MerchantPhoneNumber":{
            "type":"phoneNumber",
            "valuePhoneNumber":"+19876543210",
            "text":"987-654-3210",
            "boundingBox":[
              278,
              1004,
              656.3,
              1054.7,
              646.8,
              1125.3,
              268.5,
              1074.7
            ],
            "page":1,
            "confidence":0.99,
            "elements":[
              "#/readResults/0/lines/4/words/0"
            ]
          },
          "TransactionDate":{
            "type":"date",
            "valueDate":"2019-06-10",
            "text":"6/10/2019",
            "boundingBox":[
              265.1,
              1228.4,
              525,
              1247,
              518.9,
              1332.1,
              259,
              1313.5
            ],
            "page":1,
            "confidence":0.99,
            "elements":[
              "#/readResults/0/lines/5/words/0"
            ]
          },
          "TransactionTime":{
            "type":"time",
            "valueTime":"13:59:00",
            "text":"13:59",
            "boundingBox":[
              541,
              1248,
              677.3,
              1261.5,
              668.9,
              1346.5,
              532.6,
              1333
            ],
            "page":1,
            "confidence":0.977,
            "elements":[
              "#/readResults/0/lines/5/words/1"
            ]
          },
          "Items":{
            "type":"array",
            "valueArray":[
              {
                "type":"object",
                "valueObject":{
                  "Quantity":{
                    "type":"number",
                    "text":"1",
                    "boundingBox":[
                      245.1,
                      1581.5,
                      300.9,
                      1585.1,
                      295,
                      1676,
                      239.2,
                      1672.4
                    ],
                    "page":1,
                    "confidence":0.92,
                    "elements":[
                      "#/readResults/0/lines/7/words/0"
                    ]
                  },
                  "Name":{
                    "type":"string",
                    "valueString":"Cappuccino",
                    "text":"Cappuccino",
                    "boundingBox":[
                      322,
                      1586,
                      654.2,
                      1601.1,
                      650,
                      1693,
                      317.8,
                      1678
                    ],
                    "page":1,
                    "confidence":0.923,
                    "elements":[
                      "#/readResults/0/lines/7/words/1"
                    ]
                  },
                  "TotalPrice":{
                    "type":"number",
                    "valueNumber":2.2,
                    "text":"$2.20",
                    "boundingBox":[
                      1107.7,
                      1584,
                      1263,
                      1574,
                      1268.3,
                      1656,
                      1113,
                      1666
                    ],
                    "page":1,
                    "confidence":0.918,
                    "elements":[
                      "#/readResults/0/lines/8/words/0"
                    ]
                  }
                }
              },
              ...
            ]
          },
          "Subtotal":{
            "type":"number",
            "valueNumber":11.7,
            "text":"11.70",
            "boundingBox":[
              1146,
              2221,
              1297.3,
              2223,
              1296,
              2319,
              1144.7,
              2317
            ],
            "page":1,
            "confidence":0.955,
            "elements":[
              "#/readResults/0/lines/13/words/1"
            ]
          },
          "Tax":{
            "type":"number",
            "valueNumber":1.17,
            "text":"1.17",
            "boundingBox":[
              1190,
              2359,
              1304,
              2359,
              1304,
              2456,
              1190,
              2456
            ],
            "page":1,
            "confidence":0.979,
            "elements":[
              "#/readResults/0/lines/15/words/1"
            ]
          },
          "Tip":{
            "type":"number",
            "valueNumber":1.63,
            "text":"1.63",
            "boundingBox":[
              1094,
              2479,
              1267.7,
              2485,
              1264,
              2591,
              1090.3,
              2585
            ],
            "page":1,
            "confidence":0.941,
            "elements":[
              "#/readResults/0/lines/17/words/1"
            ]
          },
          "Total":{
            "type":"number",
            "valueNumber":14.5,
            "text":"$14.50",
            "boundingBox":[
              1034.2,
              2617,
              1387.5,
              2638.2,
              1380,
              2763,
              1026.7,
              2741.8
            ],
            "page":1,
            "confidence":0.985,
            "elements":[
              "#/readResults/0/lines/19/words/0"
            ]
          }
        }
      }
    ]
  }
}

Névjegykártyák elemzése

Ez a szakasz bemutatja, hogyan elemezheti és nyerheti ki a gyakori mezőket angol névjegykártyákból egy előre betanított modell használatával. A névjegykártya-elemzéssel kapcsolatos további információkért tekintse meg a Document Intelligence névjegykártya-modelljét. A névjegykártya elemzésének megkezdéséhez hívja meg az Analyze Business Card API-t a cURL paranccsal. A parancs futtatása előtt végezze el a következő módosításokat:

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-előfizetéshez beszerzett végpontra.
  2. Cserélje le <a névjegykártya URL-címét> egy nyugtakép URL-címére.
  3. Cserélje le <a kulcsot> az előző lépésből kimásolt kulcsra.
curl -i -X POST "https://<endpoint>/formrecognizer/v2.1/prebuilt/businessCard/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{ 'source': '<your receipt URL>'}"

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/businessCard/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/businessCard/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Az Analyze Business Card API meghívása után hívja meg a Névjegykártya eredményének lekérdezé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 <a végpontot> a dokumentumintelligencia-kulccsal beszerzett végpontra.
  2. Cserélje le <a resultId> azonosítót az előző lépés eredményazonosítójával.
  3. Cserélje le <a kulcsot> a kulcsra.
curl -v -X GET https://<endpoint>/formrecognizer/v2.1/prebuilt/businessCard/analyzeResults/<resultId>"
-H "Ocp-Apim-Subscription-Key: <key>"

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

A "readResults" csomópont tartalmazza az összes felismert szöveget. A válasz oldal, majd sor, majd egyéni szavak szerint rendezi a szöveget. A "documentResults" csomópont tartalmazza a modell által felderített névjegykártya-specifikus értékeket. A "documentResults" csomóponton hasznos kapcsolattartási adatokat talál, például a vállalat nevét, vezetéknevét, vezetéknevét, telefonszámát stb.

A fényképen egy Contoso nevű cég névjegykártyája látható.

Ez a JSON-mintakimenet rövidítve lett az olvashatóság érdekében. Tekintse meg a teljes mintakimenetet a GitHubon.

{
    "status": "succeeded",
    "createdDateTime":"2021-02-09T18:14:05Z",
    "lastUpdatedDateTime":"2021-02-09T18:14:10Z",
    "analyzeResult": {
        "version": "2.1.0",
        "readResults": [
            {
             "page":1,
             "angle":-16.6836,
             "width":4032,
             "height":3024,
             "unit":"pixel"
          }
        ],
        "documentResults": [
            {
                "docType": "prebuilt:businesscard",
                "pageRange": [
                    1,
                    1
                ],
                "fields": {
                    "ContactNames": {
                        "type": "array",
                        "valueArray": [
                            {
                                "type": "object",
                                "valueObject": {
                                    "FirstName": {
                                        "type": "string",
                                        "valueString": "Avery",
                                        "text": "Avery",
                                        "boundingBox": [
                                            703,
                                            1096,
                                            1134,
                                            989,
                                            1165,
                                            1109,
                                            733,
                                            1206
                                        ],
                                        "page": 1
                                },
                                "text": "Dr. Avery Smith",
                                "boundingBox": [
                                    419.3,
                                    1154.6,
                                    1589.6,
                                    877.9,
                                    1618.9,
                                    1001.7,
                                    448.6,
                                    1278.4
                                ],
                                "confidence": 0.993
                            }
                        ]
                    },
                    "Emails": {
                        "type": "array",
                        "valueArray": [
                            {
                                "type": "string",
                                "valueString": "avery.smith@contoso.com",
                                "text": "avery.smith@contoso.com",
                                "boundingBox": [
                                    2107,
                                    934,
                                    2917,
                                    696,
                                    2935,
                                    764,
                                    2126,
                                    995
                                ],
                                "page": 1,
                                "confidence": 0.99
                            }
                        ]
                    },
                    "Websites": {
                        "type": "array",
                        "valueArray": [
                            {
                                "type": "string",
                                "valueString": "https://www.contoso.com/",
                                "text": "https://www.contoso.com/",
                                "boundingBox": [
                                    2121,
                                    1002,
                                    2992,
                                    755,
                                    3014,
                                    826,
                                    2143,
                                    1077
                                ],
                                "page": 1,
                                "confidence": 0.995
                            }
                        ]
                    }
                }
            }
        ]
    }
}

A szkript a válaszokat a konzolra nyomtatja, amíg az Elemzés névjegykártya művelet befejeződik.

Számlák elemzése

A Dokumentumintelligencia használatával kinyerheti a mezőszöveget és a szemantikai értékeket egy adott számladokumentumból. A számla elemzésének megkezdéséhez használja a cURL parancsot. A számlaelemzéssel kapcsolatos további információkért tekintse meg a számlafogalmi útmutatót. A számla elemzésének megkezdéséhez hívja meg az Analyze Invoice API-t a cURL paranccsal.

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

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-előfizetéshez beszerzett végpontra.
  2. Cserélje le <a számla URL-címét> egy számladokumentum URL-címére.
  3. Cserélje le <a kulcsot> a kulcsra.
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 "{​​​​​​​'source': '<your invoice URL>'}​​​​​​​​"

Egy fejlécet 202 (Success) Operation-Location tartalmazó választ kap. 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

Miután meghívta az Analyze Invoice API-t, hívja meg a Számla eredményének lekérdezé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 <a végpontot> a dokumentumintelligencia-kulccsal beszerzett végpontra.
  2. Cserélje le <a resultId> azonosítót az előző lépés eredményazonosítójával.
  3. Cserélje le <a kulcsot> a kulcsra.
curl -v -X GET "https://<endpoint>/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/<resultId>" -H "Ocp-Apim-Subscription-Key: <key>"

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 következő számladokumentumot és annak megfelelő JSON-kimenetét.

A válasz törzsének JSON-tartalma rövidítve lett az olvashatóság érdekében. Tekintse meg a teljes mintakimenetet a GitHubon.

{
    "status": "succeeded",
    "createdDateTime": "2020-11-06T23:32:11Z",
    "lastUpdatedDateTime": "2020-11-06T23:32:20Z",
    "analyzeResult": {
        "version": "2.1.0",
        "readResults": [{
            "page": 1,
            "angle": 0,
            "width": 8.5,
            "height": 11,
            "unit": "inch"
        }],
        "pageResults": [{
            "page": 1,
            "tables": [{
                "rows": 3,
                "columns": 4,
                "cells": [{
                    "rowIndex": 0,
                    "columnIndex": 0,
                    "text": "QUANTITY",
                    "boundingBox": [0.4953,
                    5.7306,
                    1.8097,
                    5.7306,
                    1.7942,
                    6.0122,
                    0.4953,
                    6.0122]
                },
                {
                    "rowIndex": 0,
                    "columnIndex": 1,
                    "text": "DESCRIPTION",
                    "boundingBox": [1.8097,
                    5.7306,
                    5.7529,
                    5.7306,
                    5.7452,
                    6.0122,
                    1.7942,
                    6.0122]
                },
                ...
                ],
                "boundingBox": [0.4794,
                5.7132,
                8.0158,
                5.714,
                8.0118,
                6.5627,
                0.4757,
                6.5619]
            },
            {
                "rows": 2,
                "columns": 6,
                "cells": [{
                    "rowIndex": 0,
                    "columnIndex": 0,
                    "text": "SALESPERSON",
                    "boundingBox": [0.4979,
                    4.963,
                    1.8051,
                    4.963,
                    1.7975,
                    5.2398,
                    0.5056,
                    5.2398]
                },
                {
                    "rowIndex": 0,
                    "columnIndex": 1,
                    "text": "P.O. NUMBER",
                    "boundingBox": [1.8051,
                    4.963,
                    3.3047,
                    4.963,
                    3.3124,
                    5.2398,
                    1.7975,
                    5.2398]
                },
                ...
                ],
                "boundingBox": [0.4976,
                4.961,
                7.9959,
                4.9606,
                7.9959,
                5.5204,
                0.4972,
                5.5209]
            }]
        }],
        "documentResults": [{
            "docType": "prebuilt:invoice",
            "pageRange": [1,
            1],
            "fields": {
                "AmountDue": {
                    "type": "number",
                    "valueNumber": 610,
                    "text": "$610.00",
                    "boundingBox": [7.3809,
                    7.8153,
                    7.9167,
                    7.8153,
                    7.9167,
                    7.9591,
                    7.3809,
                    7.9591],
                    "page": 1,
                    "confidence": 0.875
                },
                "BillingAddress": {
                    "type": "string",
                    "valueString": "123 Bill St, Redmond WA, 98052",
                    "text": "123 Bill St, Redmond WA, 98052",
                    "boundingBox": [0.594,
                    4.3724,
                    2.0125,
                    4.3724,
                    2.0125,
                    4.7125,
                    0.594,
                    4.7125],
                    "page": 1,
                    "confidence": 0.997
                },
                "BillingAddressRecipient": {
                    "type": "string",
                    "valueString": "Microsoft Finance",
                    "text": "Microsoft Finance",
                    "boundingBox": [0.594,
                    4.1684,
                    1.7907,
                    4.1684,
                    1.7907,
                    4.2837,
                    0.594,
                    4.2837],
                    "page": 1,
                    "confidence": 0.998
                },
                ...
            }
        }]
    }
}

Identitásdokumentumok elemzése

Az azonosító (ID) dokumentum elemzésének megkezdéséhez használja a cURL parancsot. Az azonosító dokumentumelemzésével kapcsolatos további információkért tekintse meg a Dokumentumintelligencia-azonosító dokumentummodellt. Egy azonosító dokumentum elemzésének megkezdéséhez hívja meg az Analyze ID Document API-t a cURL paranccsal.

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

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-előfizetéshez beszerzett végpontra.
  2. Cserélje le <az azonosító dokumentum URL-címét> egy nyugtakép URL-címére.
  3. Cserélje le <a kulcsot> az előző lépésből kimásolt kulcsra.
curl -i -X POST "https://<endpoint>/formrecognizer/v2.1/prebuilt/idDocument/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{ 'source': '<your ID document URL>'}"

Egy fejlécet 202 (Success) Operation-Location tartalmazó választ kap. 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/documentId/analyzeResults/<resultId>

A következő példában a következő analyzeResults/ sztring az eredményazonosító:

https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/prebuilt/idDocument/analyzeResults/3bc1d6e0-e24c-41d2-8c50-14e9edc336d1

Az Elemzésazonosító dokumentum eredményének lekérése

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

  1. Cserélje le <a végpontot> a dokumentumintelligencia-kulccsal beszerzett végpontra.
  2. Cserélje le <a resultId> azonosítót az előző lépés eredményazonosítójával.
  3. Cserélje le <a kulcsot> a kulcsra.
curl -X GET "https://<endpoint>/formrecognizer/v2.1/prebuilt/idDocument/analyzeResults/<resultId>" -H "Ocp-Apim-Subscription-Key: <key>"

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". Hívja meg újra az API-t manuálisan vagy szkripttel, amíg meg nem kapja az succeeded értéket. Javasoljuk, hogy a hívások között legalább egy másodperces időközt válasszon.

  • A "readResults" mező az azonosító dokumentumból kinyert összes szövegsort tartalmazza.
  • A "documentResults" mező egy objektumtömböt tartalmaz, amelyek mindegyike a bemeneti dokumentumban észlelt azonosító dokumentumot jelöli.

Íme egy mintaazonosító-dokumentum és annak megfelelő JSON-kimenete.

Képernyőkép egy mintaillesztő licencéről.

Itt a válasz törzse.

{
    "status": "succeeded",
    "createdDateTime": "2021-04-13T17:24:52Z",
    "lastUpdatedDateTime": "2021-04-13T17:24:55Z",
    "analyzeResult": {
      "version": "2.1.0",
      "readResults": [
        {
          "page": 1,
          "angle": -0.2823,
          "width": 450,
          "height": 294,
          "unit": "pixel"
        }
      ],
      "documentResults": [
        {
          "docType": "prebuilt:idDocument:driverLicense",
          "docTypeConfidence": 0.995,
          "pageRange": [
            1,
            1
          ],
          "fields": {
            "Address": {
              "type": "string",
              "valueString": "123 STREET ADDRESS YOUR CITY WA 99999-1234",
              "text": "123 STREET ADDRESS YOUR CITY WA 99999-1234",
              "boundingBox": [
                158,
                151,
                326,
                151,
                326,
                177,
                158,
                177
              ],
              "page": 1,
              "confidence": 0.965
            },
            "CountryRegion": {
              "type": "countryRegion",
              "valueCountryRegion": "USA",
              "confidence": 0.99
            },
            "DateOfBirth": {
              "type": "date",
              "valueDate": "1958-01-06",
              "text": "01/06/1958",
              "boundingBox": [
                187,
                133,
                272,
                132,
                272,
                148,
                187,
                149
              ],
              "page": 1,
              "confidence": 0.99
            },
            "DateOfExpiration": {
              "type": "date",
              "valueDate": "2020-08-12",
              "text": "08/12/2020",
              "boundingBox": [
                332,
                230,
                414,
                228,
                414,
                244,
                332,
                245
              ],
              "page": 1,
              "confidence": 0.99
            },
            "DocumentNumber": {
              "type": "string",
              "valueString": "LICWDLACD5DG",
              "text": "LIC#WDLABCD456DG",
              "boundingBox": [
                162,
                70,
                307,
                68,
                307,
                84,
                163,
                85
              ],
              "page": 1,
              "confidence": 0.99
            },
            "FirstName": {
              "type": "string",
              "valueString": "LIAM R.",
              "text": "LIAM R.",
              "boundingBox": [
                158,
                102,
                216,
                102,
                216,
                116,
                158,
                116
              ],
              "page": 1,
              "confidence": 0.985
            },
            "LastName": {
              "type": "string",
              "valueString": "TALBOT",
              "text": "TALBOT",
              "boundingBox": [
                160,
                86,
                213,
                85,
                213,
                99,
                160,
                100
              ],
              "page": 1,
              "confidence": 0.987
            },
            "Region": {
              "type": "string",
              "valueString": "Washington",
              "confidence": 0.99
            },
            "Sex": {
              "type": "string",
              "valueString": "M",
              "text": "M",
              "boundingBox": [
                226,
                190,
                232,
                190,
                233,
                201,
                226,
                201
              ],
              "page": 1,
              "confidence": 0.99
            }
          }
        }
      ]
    }
  }

Egyéni modell betanítása

Az egyéni modellek betanításához betanítási adatokra van szükség egy Azure Storage-blobban. Legalább öt kitöltött űrlapra (PDF-dokumentumokra és/vagy képekre) van szüksége, amelyek azonos típusúak és szerkezetűek. Az egyéni modell összeállítása és betanítása tippeket és lehetőségeket kínál a betanítási adatok összeállításához.

A címkézett adatok nélküli betanítás az alapértelmezett művelet, és egyszerűbb. Másik lehetőségként manuálisan is megjelölhet néhány vagy az összes betanítási adatot. A manuális címkézés összetettebb folyamat, de jobb betanított modellt eredményez.

Feljegyzés

A modelleket grafikus felhasználói felülettel, például a Dokumentumintelligencia-mintacímkéző eszközzel is betanítheti.

Modell betanítása címkék nélkül

Ha be szeretne tanítani egy dokumentumintelligencia-modellt az Azure Blob-tárolóban lévő dokumentumokkal, hívja meg az Egyéni modell betanítása API-t az alábbi cURL parancs futtatásával. A parancs futtatása előtt végezze el a következő módosításokat:

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-előfizetéshez beszerzett végpontra.
  2. Cserélje le <a kulcsot> az előző lépésből kimásolt kulcsra.
  3. Cserélje le <az SAS URL-címet> az Azure Blob Storage-tároló közös hozzáférésű jogosultságkódjának (SAS) URL-címére.

Az egyéni modell betanítási adataihoz tartozó SAS URL-cím lekérése:

  1. Nyissa meg a tárolóerőforrást az Azure Portalon, és válassza az Adattároló-tárolók>lehetőséget.

  2. Lépjen a tárolóra, kattintson a jobb gombbal, és válassza az SAS létrehozása lehetőséget.

    Kérje le a tároló SAS-ját, nem magát a tárfiókot.

  3. Győződjön meg arról, hogy az olvasási, írási, törlési és listaengedélyek ki vannak jelölve, és válassza az SAS-jogkivonat és AZ URL-cím létrehozása lehetőséget.

  4. Másolja az URL-szakaszban lévő értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

Végezze el a módosításokat, majd futtassa a parancsot:

curl -i -X POST "https://<endpoint>/formrecognizer/v2.1/custom/models" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{ 'source': '<SAS URL>'}"

Egy fejléccel ellátott Location választ kap201 (Success). A fejléc értéke tartalmazza az újonnan betanított modell modellazonosítóját, amellyel lekérdezheti a művelet állapotát, és lekérheti az eredményeket:

https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>

Az alábbi példában az URL-cím részeként a modellazonosító utáni sztring models/ lesz.

https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/custom/models/77d8ecad-b8c1-427e-ac20-a3fe4af503e9

Modell betanítása címkékkel

Címkékkel való betanításhoz speciális címkeinformációs fájlokkal (<fájlnév>.pdf.labels.json) kell rendelkeznie a blobtárolóban a betanítási dokumentumok mellett. A dokumentumintelligencia-mintacímkézési eszköz felhasználói felületet biztosít ezeknek a címkefájloknak a létrehozásához. Miután beszerezte őket, hívja meg az Egyéni modell betanítása API-t, amelynek "useLabelFile" paramétere a JSON-törzsben van beállítva true .

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

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-előfizetéshez beszerzett végpontra.
  2. Cserélje le <a kulcsot> az előző lépésből kimásolt kulcsra.
  3. Cserélje le <az SAS URL-címet> az Azure Blob Storage-tároló közös hozzáférésű jogosultságkódjának (SAS) URL-címére.

Az egyéni modell betanítási adataihoz tartozó SAS URL-cím lekérése:

  1. Nyissa meg a tárolóerőforrást az Azure Portalon, és válassza a Data Storage>Containers.1 lehetőséget. Lépjen a tárolóra, kattintson a jobb gombbal, és válassza az SAS létrehozása lehetőséget.

    Kérje le a tároló SAS-ját, nem magát a tárfiókot.

  2. Győződjön meg arról, hogy az olvasási, írási, törlési és listaengedélyek ki vannak jelölve, és válassza az SAS-jogkivonat és AZ URL-cím létrehozása lehetőséget.

  3. Másolja az URL-szakaszban lévő értéket egy ideiglenes helyre. A következő formátumban kell lennie: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

Végezze el a módosításokat, majd futtassa a parancsot:

curl -i -X POST "https://<endpoint>/formrecognizer/v2.1/custom/models" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{ 'source': '<SAS URL>', 'useLabelFile':true}"

Egy fejléccel ellátott Location választ kap201 (Success). A fejléc értéke tartalmazza az újonnan betanított modell modellazonosítóját, amellyel lekérdezheti a művelet állapotát, és lekérheti az eredményeket:

https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>

Az alábbi példában az URL-cím részeként a modellazonosító utáni sztring models/ lesz.

https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/custom/models/62e79d93-78a7-4d18-85be-9540dbb8e792

A betanítási művelet elindítása után az Egyéni modell lekérése használatával ellenőrizze a betanítás állapotát. Adja át a modellazonosítót az API-kérésnek a betanítási állapot ellenőrzéséhez:

  1. Cserélje le <a végpontot> a dokumentumintelligencia-kulccsal beszerzett végpontra.
  2. Kulcs> cseréje <a kulcsra
  3. Cserélje le <a modellazonosítót> az előző lépésben kapott modellazonosítóra
curl -X GET "https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>"

Űrlapok elemzése egyéni modellel

Ezután az újonnan betanított modellel elemezhet egy dokumentumot, és kinyerheti belőle a mezőket és táblákat. Hívja meg az Analyze Form API-t a következő cURL-parancs futtatásával. A parancs futtatása előtt végezze el a következő módosításokat:

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-kulcsból beszerzett végpontra.
  2. Cserélje le <a modellazonosítót> az előző szakaszban kapott modellazonosítóra.
  3. Cserélje le <a SAS URL-címet> egy SAS-URL-címre a fájlhoz az Azure Storage-ban. Kövesse a Betanítás szakaszban leírt lépéseket, de ahelyett, hogy sas URL-címet kapna a teljes blobtárolóhoz, szerezze be az elemezni kívánt fájl egyikét.
  4. Cserélje le <a kulcsot> a kulcsra.
curl -v "https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>/analyze?includeTextDetails=true" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" -d "{ 'source': '<SAS URL>' } "

Egy fejlécet tartalmazó Operation-Location választ kap202 (Success). Ennek a fejlécnek az értéke tartalmaz egy találatazonosítót, amelyet az Elemzés művelet eredményeinek nyomon követésére használ:

https://cognitiveservice/formrecognizer/v2.1/custom/models/<modelId>/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/e175e9db-d920-4c7d-bc44-71d1653cdd06

Mentse ezt az eredményazonosítót a következő lépéshez.

Az Elemzési művelet eredményeinek lekérdezéséhez hívja meg az Analyze Form Result API-t.

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-kulcsból beszerzett végpontra.
  2. Cserélje le <az eredményazonosítót> az előző szakaszban kapott azonosítóra.
  3. Cserélje le <a kulcsot> a kulcsra.
curl -X GET "https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>/analyzeResults/<resultId>" -H "Ocp-Apim-Subscription-Key: <key>"

A következő formátumban kap 200 (Success) választ egy JSON-törzstel. A kimenet az egyszerűség kedvéért rövidült. Figyelje meg a "status" mező alsó részén. Ennek a mezőnek az értéke "succeeded" az Elemzés művelet befejeződésekor van megadva. Ha az Elemzés művelet nem fejeződött be, a parancs újrafuttatásával újra le kell kérdeznie a szolgáltatást. Javasoljuk, hogy a hívások között legalább egy másodperces időközt válasszon.

Címkék nélkül betanított egyéni modellekben a kulcs-érték pár társításai és táblái a "pageResults" JSON-kimenet csomópontjában találhatók. A címkékkel betanított egyéni modellekben a kulcs-érték pár társítása a "documentResults" csomópontban található. Ha az includeTextDetails URL-paraméteren keresztül egyszerű szövegkiemelést is megadott, akkor a csomópont megjeleníti "readResults" a dokumentum összes szövegének tartalmát és pozícióit.

Ez a minta JSON-kimenet az egyszerűség kedvéért rövidült. Tekintse meg a teljes mintakimenetet a GitHubon.

{
  "status": "succeeded",
  "createdDateTime": "2020-08-21T01:13:28Z",
  "lastUpdatedDateTime": "2020-08-21T01:13:42Z",
  "analyzeResult": {
    "version": "2.1.0",
    "readResults": [
      {
        "page": 1,
        "angle": 0,
        "width": 8.5,
        "height": 11,
        "unit": "inch",
        "lines": [
          {
            "text": "Project Statement",
            "boundingBox": [
              5.0444,
              0.3613,
              8.0917,
              0.3613,
              8.0917,
              0.6718,
              5.0444,
              0.6718
            ],
            "words": [
              {
                "text": "Project",
                "boundingBox": [
                  5.0444,
                  0.3587,
                  6.2264,
                  0.3587,
                  6.2264,
                  0.708,
                  5.0444,
                  0.708
                ]
              },
              {
                "text": "Statement",
                "boundingBox": [
                  6.3361,
                  0.3635,
                  8.0917,
                  0.3635,
                  8.0917,
                  0.6396,
                  6.3361,
                  0.6396
                ]
              }
            ]
          },
          ...
        ]
      }
    ],
    "pageResults": [
      {
        "page": 1,
        "keyValuePairs": [
          {
            "key": {
              "text": "Date:",
              "boundingBox": [
                6.9833,
                1.0615,
                7.3333,
                1.0615,
                7.3333,
                1.1649,
                6.9833,
                1.1649
              ],
              "elements": [
                "#/readResults/0/lines/2/words/0"
              ]
            },
            "value": {
              "text": "9/10/2020",
              "boundingBox": [
                7.3833,
                1.0802,
                7.925,
                1.0802,
                7.925,
                1.174,
                7.3833,
                1.174
              ],
              "elements": [
                "#/readResults/0/lines/3/words/0"
              ]
            },
            "confidence": 1
          },
          ...
        ],
        "tables": [
          {
            "rows": 5,
            "columns": 5,
            "cells": [
              {
                "text": "Training Date",
                "rowIndex": 0,
                "columnIndex": 0,
                "boundingBox": [
                  0.6944,
                  4.2779,
                  1.5625,
                  4.2779,
                  1.5625,
                  4.4005,
                  0.6944,
                  4.4005
                ],
                "confidence": 1,
                "rowSpan": 1,
                "columnSpan": 1,
                "elements": [
                  "#/readResults/0/lines/15/words/0",
                  "#/readResults/0/lines/15/words/1"
                ],
                "isHeader": true,
                "isFooter": false
              },
              ...
            ]
          }
        ],
        "clusterId": 0
      }
    ],
    "documentResults": [],
    "errors": []
  }
}

Eredmények javítása

Vizsgálja meg a "confidence" csomópont alatti összes kulcs/érték eredmény értékeit "pageResults" . A csomópont megbízhatósági pontszámait "readResults" is meg kell vizsgálnia, amelyek megfelelnek a szövegolvasási műveletnek. Az olvasási eredmények megbízhatósága nem befolyásolja a kulcs-/érték kinyerési eredmények megbízhatóságát, ezért mindkettőt ellenőriznie kell.

  • Ha az olvasási művelet megbízhatósági pontszámai alacsonyak, próbálja javítani a bemeneti dokumentumok minőségét. További információ: Bemeneti követelmények.
  • Ha a kulcs/érték kinyerési művelet megbízhatósági pontszámai alacsonyak, győződjön meg arról, hogy az elemzett dokumentumok típusa megegyezik a betanítási csoportban használt dokumentumokkal. Ha a betanítási csoportban lévő dokumentumok megjelenése eltérő, érdemes lehet különböző mappákra felosztani őket, és minden változathoz betaníthat egy modellt.

A megcélzott megbízhatósági pontszámok a használati esettől függenek, de általában ajánlott 80%-os vagy magasabb pontszámot célozni. Érzékenyebb esetekben, például orvosi rekordok vagy számlázási utasítások olvasása esetén 100%-os pontszámot ajánlunk.

Egyéni modellek kezelése

Az alábbi parancs Egyéni modellek listázása API-jának használatával adja vissza az előfizetéséhez tartozó összes egyéni modell listáját.

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-előfizetéshez beszerzett végpontra.
  2. Cserélje le <a kulcsot> az előző lépésből kimásolt kulcsra.
curl -v -X GET "https://<endpoint>/formrecognizer/v2.1/custom/models?op=full"
-H "Ocp-Apim-Subscription-Key: <key>"

A következő JSON-adatokkal sikeres választ kap 200 . Az "modelList" elem tartalmazza az összes létrehozott modellt és azok adatait.

{
  "summary": {
    "count": 0,
    "limit": 0,
    "lastUpdatedDateTime": "string"
  },
  "modelList": [
    {
      "modelId": "string",
      "status": "creating",
      "createdDateTime": "string",
      "lastUpdatedDateTime": "string"
    }
  ],
  "nextLink": "string"
}

Adott modell lekérése

Egy adott egyéni modell részletes információinak lekéréséhez használja az Egyéni modell lekérése API-t az alábbi parancsban.

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-előfizetéshez beszerzett végpontra.
  2. Cserélje le <a kulcsot> az előző lépésből kimásolt kulcsra.
  3. Cserélje le <a modelId azonosítót> a keresni kívánt egyéni modell azonosítójára.
curl -v -X GET "https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>" -H "Ocp-Apim-Subscription-Key: <key>"

Sikeres válasz érkezik 200 a kérelem törzsének JSON-adataival, például az alábbiakkal.

{
  "modelInfo": {
    "modelId": "string",
    "status": "creating",
    "createdDateTime": "string",
    "lastUpdatedDateTime": "string"
  },
  "keys": {
    "clusters": {}
  },
  "trainResult": {
    "trainingDocuments": [
      {
        "documentName": "string",
        "pages": 0,
        "errors": [
          "string"
        ],
        "status": "succeeded"
      }
    ],
    "fields": [
      {
        "fieldName": "string",
        "accuracy": 0.0
      }
    ],
    "averageModelAccuracy": 0.0,
    "errors": [
      {
        "message": "string"
      }
    ]
  }
}

Modell törlése az erőforrásfiókból

A modell az azonosítójára való hivatkozással is törölhető a fiókjából. Ez a parancs meghívja az Egyéni modell törlése API-t az előző szakaszban használt modell törléséhez.

  1. Cserélje le <a végpontot> a Dokumentumintelligencia-előfizetéshez beszerzett végpontra.
  2. Cserélje le <a kulcsot> az előző lépésből kimásolt kulcsra.
  3. Cserélje le <a modelId azonosítót> a keresni kívánt egyéni modell azonosítójára.
curl -v -X DELETE "https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>" -H "Ocp-Apim-Subscription-Key: <key>"

Sikeres választ kap 204 , amely azt jelzi, hogy a modell törlésre van megjelölve. A modellösszetevők 48 órán belül törlődnek.

Következő lépések

Ebben a projektben a Document Intelligence REST API-val különböző módokon elemezte az űrlapokat. Ezután tekintse át a referenciadokumentációt a Document Intelligence API részletesebb megismeréséhez.