Kom igång med Dokumentinformation

Viktigt!

  • Azure Cognitive Services Formigenkänning är nu Azure AI Document Intelligence.
  • Vissa plattformar väntar fortfarande på uppdatering av namnbytet.
  • Alla omnämnanden av Formigenkänning eller dokumentinformation i vår dokumentation avser samma Azure-tjänst.

Det här innehållet gäller för: Bockmarkering v4.0 (förhandsversion) Tidigare versioner: blå bockmarkering v3.1 (GA) blå bockmarkering v3.0 (GA)

  • Kom igång med Azure AI Document Intelligence senaste förhandsversion (2024-07-31-preview).

Det här innehållet gäller för: Bockmarkering v3.1 (GA) Tidigare versioner: blå bockmarkering v3.0 blå bockmarkering v2.1

  • Kom igång med Azure Formigenkänning senaste GA-versionen (2023-07-31).

Det här innehållet gäller för: Bockmarkering v3.0 (GA) Nyare version: blå bockmarkering v3.1blå bockmarkering v2.1

  • Kom igång med Azure Formigenkänning äldre GA-version (2022-08-31).
  • Azure AI Document Intelligence/Formigenkänning är en molnbaserad Azure AI-tjänst som använder maskininlärning för att extrahera nyckel/värde-par, text, tabeller och nyckeldata från dina dokument.

  • Du kan enkelt integrera modeller för dokumentbearbetning i dina arbetsflöden och program med hjälp av ett SDK för programmeringsspråk eller genom att anropa REST-API:et.

  • För den här snabbstarten rekommenderar vi att du använder den kostnadsfria tjänsten medan du lär dig tekniken. Kom ihåg att antalet kostnadsfria sidor är begränsat till 500 per månad.

Mer information om API-funktioner och utvecklingsalternativ finns på vår översiktssida .

Klientbibliotekets SDK-referens | REST API-referens | Paketexempel|| stöds REST API-version |

Klientbibliotekets SDK-referens | REST API-referens | Paketexempel | | stöds REST API-version |

I den här snabbstarten använder du följande funktioner för att analysera och extrahera data och värden från formulär och dokument:

  • Layoutmodell – Analysera och extrahera tabeller, linjer, ord och markeringsmarkeringar som alternativknappar och kryssrutor i dokument, utan att behöva träna en modell.

  • Fördefinierad modell – Analysera och extrahera vanliga fält från specifika dokumenttyper med hjälp av en fördefinierad modell.

Förutsättningar

  • En Azure AI-tjänst eller dokumentinformationsresurs. När du har din Azure-prenumeration skapar du en resurs med en enda tjänst eller Azure AI med flera tjänster i Azure Portal för att hämta din nyckel och slutpunkt.

  • Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.

Dricks

Skapa en Azure AI-tjänstresurs om du planerar att komma åt flera Azure AI-tjänster under en enda slutpunkt/nyckel. För endast åtkomst till dokumentinformation skapar du en dokumentinformationsresurs. Observera att du behöver en resurs med en enda tjänst om du tänker använda Microsoft Entra-autentisering.

  • När resursen har distribuerats väljer du Gå till resurs. Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till API:et för dokumentinformation. Du klistrar in nyckeln och slutpunkten i koden senare i snabbstarten:

    Skärmbild av nycklar och slutpunktsplats i Azure Portal.

  • En Azure AI-tjänst eller Formigenkänning resurs. När du har din Azure-prenumeration skapar du en resurs med en enda tjänst eller Azure AI med flera tjänster i Azure Portal för att hämta din nyckel och slutpunkt.

  • Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.

Dricks

Skapa en Azure AI-tjänstresurs om du planerar att komma åt flera Azure AI-tjänster under en enda slutpunkt/nyckel. Skapa en Formigenkänning resurs för endast Formigenkänning åtkomst. Observera att du behöver en resurs med en enda tjänst om du tänker använda Microsoft Entra-autentisering.

  • När resursen har distribuerats väljer du Gå till resurs. Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till Formigenkänning-API:et. Du klistrar in nyckeln och slutpunkten i koden senare i snabbstarten:

    Skärmbild av nycklar och slutpunktsplats i Azure Portal.

Konfigurera

  1. Starta Visual Studio.

  2. På startsidan väljer du Skapa ett nytt projekt.

    Skärmbild av Visual Studio-startfönstret.

  3. På sidan Skapa ett nytt projekt anger du konsolen i sökrutan. Välj mallen Konsolprogram och välj sedan Nästa.

    Skärmbild av sidan Skapa nytt projekt i Visual Studio.

  1. I dialogrutan Konfigurera det nya projektet anger du doc_intel_quickstart i rutan Projektnamn. Välj sedan Nästa.
  1. I dialogrutan Konfigurera det nya projektet anger du form_recognizer_quickstart i rutan Projektnamn. Välj sedan Nästa.
  1. I dialogrutan Ytterligare information väljer du .NET 8.0 (långsiktigt stöd)och väljer sedan Skapa.

    Skärmbild av dialogrutan för ytterligare information i Visual Studio.

Installera klientbiblioteket med NuGet

  1. Högerklicka på ditt doc_intel_quickstart projekt och välj Hantera NuGet-paket... .

    Skärmbild av fönstret Välj NuGet-förhandsversionspaket i Visual Studio.

  2. Välj fliken Bläddra och skriv Azure.AI.FormRecognizer.

  3. Markera kryssrutan Include prerelease .

    Skärmbild av välj Förhandsversion av NuGet-paketet i Visual Studio.

  4. Välj en version från den nedrullningsbara menyn och installera paketet i projektet.

  1. Högerklicka på ditt form_recognizer_quickstart projekt och välj Hantera NuGet-paket... .

    Skärmbild av fönstret Hitta NuGet-paket i Visual Studio.

  2. Välj fliken Bläddra och skriv Azure.AI.FormRecognizer. Välj version 4.1.0 i listrutan

    Skärmbild av välj NuGet Formigenkänning-paket i Visual Studio.

  1. Högerklicka på ditt form_recognizer_quickstart projekt och välj Hantera NuGet-paket... .

    Skärmbild av NuGet-paketfönstret i Visual Studio.

  2. Välj fliken Bläddra och skriv Azure.AI.FormRecognizer. Välj version 4.0.0 i listrutan

    Skärmbild av välj NuGet-äldre paket i Visual Studio.

Skapa ditt program

Om du vill interagera med document intelligence-tjänsten måste du skapa en instans av DocumentIntelligenceClient klassen. För att göra det skapar du en AzureKeyCredential med din key från Azure Portal och en DocumentIntelligenceClient instans med och dokumentinformationen AzureKeyCredential endpoint.

Om du vill interagera med Formigenkänning-tjänsten måste du skapa en instans av DocumentAnalysisClient klassen. För att göra det skapar du en AzureKeyCredential med din key från Azure Portal och en DocumentAnalysisClient instans med AzureKeyCredential och din Formigenkänning endpoint.

Kommentar

  • Från och med .NET 6 genererar nya projekt med mallen console ett nytt programformat som skiljer sig från tidigare versioner.
  • De nya utdata använder de senaste C#-funktionerna som förenklar koden du behöver skriva.
  • När du använder den nyare versionen behöver du bara skriva metodens Main brödtext. Du behöver inte inkludera toppnivåinstruktioner, globala användningsdirektiv eller implicita med hjälp av direktiv.
  • Mer information finns i Nya C#-mallar genererar toppnivåinstruktioner.
  1. Öppna filen Program.cs .

  2. Ta bort den befintliga koden, inklusive raden Console.Writeline("Hello World!"), och välj något av följande kodexempel för att kopiera och klistra in i programmets Program.cs fil:

Viktigt!

Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i Säkerhet för Azure AI-tjänster.

Layoutmodell

Extrahera text, markeringsmarkeringar, textformat, tabellstrukturer och koordinater för avgränsningsregionen från dokument.

  • I det här exemplet behöver du en dokumentfil från en URI. Du kan använda vårt exempeldokument för den här snabbstarten.
  • Vi har lagt till fil-URI-värdet i variabeln Uri fileUri överst i skriptet.
  • Om du vill extrahera layouten från en viss fil vid en URI använder du StartAnalyzeDocumentFromUri metoden och skickar prebuilt-layout den som modell-ID. Det returnerade värdet är ett AnalyzeResult objekt som innehåller data från det skickade dokumentet.

Lägg till följande kodexempel i filen Program.cs. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans:


using Azure;
using Azure.AI.DocumentIntelligence;

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

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

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

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

AnalyzeResult result = operation.Value;

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

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

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

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

        Console.WriteLine();
    }

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

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

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

        Console.WriteLine();
    }
}

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

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

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

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

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

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

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

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

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

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

Kör ditt program

När du har lagt till ett kodexempel i programmet väljer du den gröna Start-knappen bredvid formRecognizer_quickstart för att skapa och köra programmet, eller tryck på F5.

Skärmbild av knappen Kör Visual Studio-programmet.

Lägg till följande kodexempel i filen Program.cs. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Formigenkänning-instans:

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

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

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

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

AnalyzeResult result = operation.Value;

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

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding box is:");
        Console.WriteLine($"      Upper left => X: {line.BoundingPolygon[0].X}, Y= {line.BoundingPolygon[0].Y}");
        Console.WriteLine($"      Upper right => X: {line.BoundingPolygon[1].X}, Y= {line.BoundingPolygon[1].Y}");
        Console.WriteLine($"      Lower right => X: {line.BoundingPolygon[2].X}, Y= {line.BoundingPolygon[2].Y}");
        Console.WriteLine($"      Lower left => X: {line.BoundingPolygon[3].X}, Y= {line.BoundingPolygon[3].Y}");
    }

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

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding box is:");
        Console.WriteLine($"      Upper left => X: {selectionMark.BoundingPolygon[0].X}, Y= {selectionMark.BoundingPolygon[0].Y}");
        Console.WriteLine($"      Upper right => X: {selectionMark.BoundingPolygon[1].X}, Y= {selectionMark.BoundingPolygon[1].Y}");
        Console.WriteLine($"      Lower right => X: {selectionMark.BoundingPolygon[2].X}, Y= {selectionMark.BoundingPolygon[2].Y}");
        Console.WriteLine($"      Lower left => X: {selectionMark.BoundingPolygon[3].X}, Y= {selectionMark.BoundingPolygon[3].Y}");
    }
}

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

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

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

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

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

Kör ditt program

När du har lagt till ett kodexempel i programmet väljer du den gröna Start-knappen bredvid formRecognizer_quickstart för att skapa och köra programmet, eller tryck på F5.

Skärmbild av hur du kör knappplatsen för Visual Studio-programmet.

Utdata för layoutmodell

Här är ett kodfragment av förväntade utdata:

  Document Page 1 has 69 line(s), 425 word(s), and 15 selection mark(s).
  Line 0 has content: 'UNITED STATES'.
    Its bounding box is:
      Upper left => X: 3.4915, Y= 0.6828
      Upper right => X: 5.0116, Y= 0.6828
      Lower right => X: 5.0116, Y= 0.8265
      Lower left => X: 3.4915, Y= 0.8265
  Line 1 has content: 'SECURITIES AND EXCHANGE COMMISSION'.
    Its bounding box is:
      Upper left => X: 2.1937, Y= 0.9061
      Upper right => X: 6.297, Y= 0.9061
      Lower right => X: 6.297, Y= 1.0498
      Lower left => X: 2.1937, Y= 1.0498

Om du vill visa hela utdata går du till Azure-exempellagringsplatsen på GitHub för att visa layoutmodellens utdata.

Lägg till följande kodexempel i filen Program.cs. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Formigenkänning-instans:

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

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

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

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

AnalyzeResult result = operation.Value;

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

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < line.BoundingPolygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {line.BoundingPolygon[j].X}, Y: {line.BoundingPolygon[j].Y}");
        }
    }

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

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < selectionMark.BoundingPolygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {selectionMark.BoundingPolygon[j].X}, Y: {selectionMark.BoundingPolygon[j].Y}");
        }
    }
}

Console.WriteLine("Paragraphs:");

foreach (DocumentParagraph paragraph in result.Paragraphs)
{
    Console.WriteLine($"  Paragraph content: {paragraph.Content}");

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

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

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

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

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
    }
}
Extract the layout of a document from a file stream
To extract the layout from a given file at a file stream, use the AnalyzeDocument method and pass prebuilt-layout as the model ID. The returned value is an AnalyzeResult object containing data about the submitted document.

string filePath = "<filePath>";
using var stream = new FileStream(filePath, FileMode.Open);

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", stream);
AnalyzeResult result = operation.Value;

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

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < line.BoundingPolygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {line.BoundingPolygon[j].X}, Y: {line.BoundingPolygon[j].Y}");
        }
    }

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

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < selectionMark.BoundingPolygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {selectionMark.BoundingPolygon[j].X}, Y: {selectionMark.BoundingPolygon[j].Y}");
        }
    }
}

Console.WriteLine("Paragraphs:");

foreach (DocumentParagraph paragraph in result.Paragraphs)
{
    Console.WriteLine($"  Paragraph content: {paragraph.Content}");

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

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

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

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

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

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

Kör ditt program

När du har lagt till ett kodexempel i programmet väljer du den gröna Start-knappen bredvid formRecognizer_quickstart för att skapa och köra programmet, eller tryck på F5.

Skärmbild av hur du kör Visual Studio-programmet.

Fördefinierad modell

Analysera och extrahera vanliga fält från specifika dokumenttyper med hjälp av en fördefinierad modell. I det här exemplet analyserar vi en faktura med hjälp av den fördefinierade fakturamodellen .

Dricks

Du är inte begränsad till fakturor – det finns flera fördefinierade modeller att välja mellan, som var och en har en egen uppsättning fält som stöds. Vilken modell som ska användas för analyze åtgärden beror på vilken typ av dokument som ska analyseras. Se extrahering av modelldata.

  • Analysera en faktura med hjälp av den fördefinierade fakturamodellen. Du kan använda vårt exempelfakturadokument för den här snabbstarten.
  • Vi har lagt till fil-URI-värdet i variabeln Uri invoiceUri överst i filen Program.cs.
  • Om du vill analysera en viss fil vid en URI använder du StartAnalyzeDocumentFromUri metoden och skickar prebuilt-invoice den som modell-ID. Det returnerade värdet är ett AnalyzeResult objekt som innehåller data från det skickade dokumentet.
  • För enkelhetens skull visas inte alla nyckel/värde-par som tjänsten returnerar här. Om du vill se listan över alla fält som stöds och motsvarande typer kan du läsa vår fakturakonceptsida.

Lägg till följande kodexempel i din Program.cs-fil. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans:


using Azure;
using Azure.AI.DocumentIntelligence;

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

//sample invoice document

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

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

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

AnalyzeResult result = operation.Value;

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

    AnalyzedDocument document = result.Documents[i];

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

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

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

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

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

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

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

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

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

Kör ditt program

När du har lagt till ett kodexempel i programmet väljer du den gröna Start-knappen bredvid formRecognizer_quickstart för att skapa och köra programmet, eller tryck på F5.

Skärmbild av knappen Kör Visual Studio-programmet.

Lägg till följande kodexempel i din Program.cs-fil. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Formigenkänning-instans:


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

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

//sample invoice document

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

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

AnalyzeResult result = operation.Value;

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

    AnalyzedDocument document = result.Documents[i];

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

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

    if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
    {
        if (itemsField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField itemField in itemsField.Value.AsList())
            {
                Console.WriteLine("Item:");

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

                    if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
                    {
                        if (itemDescriptionField.FieldType == DocumentFieldType.String)
                        {
                            string itemDescription = itemDescriptionField.Value.AsString();

                            Console.WriteLine($"  Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
                        }
                    }

                    if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
                    {
                        if (itemAmountField.FieldType == DocumentFieldType.Currency)
                        {
                            CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();

                            Console.WriteLine($"  Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
                        }
                    }
                }
            }
        }
    }

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

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

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

Kör ditt program

När du har lagt till ett kodexempel i programmet väljer du den gröna Start-knappen bredvid formRecognizer_quickstart för att skapa och köra programmet, eller tryck på F5.

Skärmbild av hur du kör knappplatsen för Visual Studio-programmet.

Fördefinierade modellutdata

Här är ett kodfragment av förväntade utdata:

  Document 0:
  Vendor Name: 'CONTOSO LTD.', with confidence 0.962
  Customer Name: 'MICROSOFT CORPORATION', with confidence 0.951
  Item:
    Description: 'Test for 23 fields', with confidence 0.899
    Amount: '100', with confidence 0.902
  Sub Total: '100', with confidence 0.979

Om du vill visa hela utdata går du till Azure-exempellagringsplatsen på GitHub för att visa de fördefinierade fakturamodellutdata.

Lägg till följande kodexempel i din Program.cs-fil. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Formigenkänning-instans:


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

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

//sample invoice document

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

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

AnalyzeResult result = operation.Value;

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

    AnalyzedDocument document = result.Documents[i];

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

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

    if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
    {
        if (itemsField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField itemField in itemsField.Value.AsList())
            {
                Console.WriteLine("Item:");

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

                    if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
                    {
                        if (itemDescriptionField.FieldType == DocumentFieldType.String)
                        {
                            string itemDescription = itemDescriptionField.Value.AsString();

                            Console.WriteLine($"  Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
                        }
                    }

                    if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
                    {
                        if (itemAmountField.FieldType == DocumentFieldType.Currency)
                        {
                            CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();

                            Console.WriteLine($"  Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
                        }
                    }
                }
            }
        }
    }

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

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

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

Kör ditt program

När du har lagt till ett kodexempel i programmet väljer du den gröna Start-knappen bredvid formRecognizer_quickstart för att skapa och köra programmet, eller tryck på F5.

Skärmbild av hur du kör Visual Studio-programmet.

I den här snabbstarten använder du följande funktioner för att analysera och extrahera data och värden från formulär och dokument:

  • Layout – Analysera och extrahera tabeller, rader, ord och markeringar som alternativknappar och kryssrutor i dokument, utan att behöva träna en modell.

  • Fördefinierad faktura – Analysera och extrahera vanliga fält från specifika dokumenttyper med hjälp av en förtränad modell.

Förutsättningar

  • Azure-prenumeration – Skapa en kostnadsfritt.

  • Den senaste versionen av Visual Studio Code eller önskad IDE. Se Java i Visual Studio Code.

    Dricks

    • Visual Studio Code erbjuder ett kodningspaket för Java för Windows och macOS. Kodningspaketet är ett paket med VS Code, Java Development Kit (JDK) och en samling föreslagna tillägg från Microsoft. Kodningspaketet kan också användas för att åtgärda en befintlig utvecklingsmiljö.
    • Om du använder VS Code och kodningspaketet för Java installerar du Tillägget Gradle for Java .
  • Om du inte använder Visual Studio Code kontrollerar du att följande är installerat i utvecklingsmiljön:

  • En Azure AI-tjänst eller dokumentinformationsresurs. När du har din Azure-prenumeration skapar du en dokumentinformationsresurs med en tjänst eller flera tjänster i Azure Portal för att hämta din nyckel och slutpunkt. Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.

    Dricks

    Skapa en Azure AI-tjänstresurs om du planerar att komma åt flera Azure AI-tjänster under en enda slutpunkt/nyckel. För endast åtkomst till dokumentinformation skapar du en dokumentinformationsresurs. Observera att du behöver en resurs med en enda tjänst om du tänker använda Microsoft Entra-autentisering.

  • När resursen har distribuerats väljer du Gå till resurs. Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till API:et för dokumentinformation. Senare klistrar du in nyckeln och slutpunkten i koden:

    Skärmbild av nycklar och slutpunktsplats i Azure Portal.

Konfigurera

Skapa ett nytt Gradle-projekt

  1. I konsolfönstret (till exempel cmd, PowerShell eller Bash) skapar du en ny katalog för din app med namnet doc-intel-app och navigerar till den.

    mkdir doc-intel-app && doc-intel-app
    
    mkdir doc-intel-app; cd doc-intel-app
    
  2. Kör kommandot från arbetskatalogen gradle init . Det här kommandot skapar viktiga byggfiler för Gradle, inklusive build.gradle.kts, som används vid körning för att skapa och konfigurera ditt program.

    gradle init --type basic
    
  3. Välj en DSL när du uppmanas till det och välj Kotlin.

  4. Acceptera standardprojektets namn (doc-intel-app) genom att välja Retur eller Retur.

  1. I konsolfönstret (till exempel cmd, PowerShell eller Bash) skapar du en ny katalog för din app med namnet formigenkänningsapp och navigerar till den.

    mkdir form-recognize-app && form-recognize-app
    
    mkdir form-recognize-app; cd form-recognize-app
    
  2. Kör kommandot från arbetskatalogen gradle init . Det här kommandot skapar viktiga byggfiler för Gradle, inklusive build.gradle.kts, som används vid körning för att skapa och konfigurera ditt program.

    gradle init --type basic
    
  3. Välj en DSL när du uppmanas till det och välj Kotlin.

  4. Acceptera standardprojektets namn (formigenkänningsapp) genom att välja Retur eller Retur.

Installera klientbiblioteket

Den här snabbstarten använder Gradle-beroendehanteraren. Du hittar klientbiblioteket och information för andra beroendehanterare på Den centrala Maven-lagringsplatsen.

Öppna projektets build.gradle.kts-fil i din IDE. Copay och förbi följande kod för att inkludera klientbiblioteket som en implementation instruktion, tillsammans med nödvändiga plugin-program och inställningar.

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

   }

Den här snabbstarten använder Gradle-beroendehanteraren. Du hittar klientbiblioteket och information för andra beroendehanterare på Den centrala Maven-lagringsplatsen.

Öppna projektets build.gradle.kts-fil i din IDE. Copay och förbi följande kod för att inkludera klientbiblioteket som en implementation instruktion, tillsammans med nödvändiga plugin-program och inställningar.

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

   }

Den här snabbstarten använder Gradle-beroendehanteraren. Du hittar klientbiblioteket och information för andra beroendehanterare på Den centrala Maven-lagringsplatsen.

Öppna projektets build.gradle.kts-fil i din IDE. Copay och förbi följande kod för att inkludera klientbiblioteket som en implementation instruktion, tillsammans med nödvändiga plugin-program och inställningar.

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


   }

Skapa ett Java-program

Om du vill interagera med document intelligence-tjänsten måste du skapa en instans av DocumentIntelligenceClient klassen. För att göra det skapar du en AzureKeyCredential med din key från Azure Portal och en DocumentIntelligenceClient instans med och dokumentinformationen AzureKeyCredential endpoint.

Om du vill interagera med document intelligence-tjänsten måste du skapa en instans av DocumentAnalysisClient klassen. För att göra det skapar du en AzureKeyCredential med din key från Azure Portal och en DocumentAnalysisClient instans med och dokumentinformationen AzureKeyCredential endpoint.

  1. Kör följande kommando från katalogen doc-intel-app:

    mkdir -p src/main/java
    

    Du skapar följande katalogstruktur:

    Skärmbild av Java-katalogstruktur

  1. Navigera till java katalogen och skapa en fil med namnet DocIntelligence.java.

    Dricks

    • Du kan skapa en ny fil med hjälp av PowerShell.
    • Öppna ett PowerShell-fönster i projektkatalogen genom att hålla ned Skift-tangenten och högerklicka på mappen.
    • Skriv följande kommando New-Item DocIntelligence.java.
  2. Öppna DocIntelligence.java-filen. Kopiera och klistra in något av följande kodexempel i ditt program:

  1. Navigera till java katalogen och skapa en fil med namnet FormRecognizer.java.

    Dricks

    • Du kan skapa en ny fil med hjälp av PowerShell.
    • Öppna ett PowerShell-fönster i projektkatalogen genom att hålla ned Skift-tangenten och högerklicka på mappen.
    • Skriv följande kommando new-item FormRecognizer.java.
  2. Öppna FormRecognizer.java-filen. Kopiera och klistra in något av följande kodexempel i ditt program:

Viktigt!

Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i Säkerhet för Azure AI-tjänster.

Layoutmodell

Extrahera text, markeringsmarkeringar, textformat, tabellstrukturer och koordinater för avgränsningsregionen från dokument.

  • I det här exemplet behöver du en dokumentfil på en URI. Du kan använda vårt exempeldokument för den här snabbstarten.
  • Om du vill analysera en viss fil vid en URI använder beginAnalyzeDocumentFromUrl du metoden och skickar prebuilt-layout den som modell-ID. Det returnerade värdet är ett AnalyzeResult objekt som innehåller data om det skickade dokumentet.
  • Vi har lagt till fil-URI-värdet i variabeln documentUrl i huvudmetoden.

Lägg till följande kodexempel i DocIntelligence.java filen. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans:


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

import java.util.List;

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

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

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

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

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

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

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

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

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

Skapa och köra programmet

När du har lagt till ett kodexempel i programmet går du tillbaka till huvudprojektkatalogen – doc-intel-app.

  1. Skapa ditt program med build kommandot :

    gradle build
    
  2. Kör programmet med run kommandot :

    gradle run
    

Lägg till följande kodexempel i FormRecognizer.java filen. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans:


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

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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();

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

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

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

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

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

Skapa och köra programmet

När du har lagt till ett kodexempel i programmet går du tillbaka till huvudprojektkatalogen – formigenkänningsapp.

  1. Skapa ditt program med build kommandot :

    gradle build
    
  2. Kör programmet med run kommandot :

    gradle run
    

Utdata för layoutmodell

Här är ett kodfragment av förväntade utdata:

  Table 0 has 5 rows and 3 columns.
  Cell 'Title of each class', has row index 0 and column index 0.
  Cell 'Trading Symbol', has row index 0 and column index 1.
  Cell 'Name of exchange on which registered', has row index 0 and column index 2.
  Cell 'Common stock, $0.00000625 par value per share', has row index 1 and column index 0.
  Cell 'MSFT', has row index 1 and column index 1.
  Cell 'NASDAQ', has row index 1 and column index 2.
  Cell '2.125% Notes due 2021', has row index 2 and column index 0.
  Cell 'MSFT', has row index 2 and column index 1.
  Cell 'NASDAQ', has row index 2 and column index 2.
  Cell '3.125% Notes due 2028', has row index 3 and column index 0.
  Cell 'MSFT', has row index 3 and column index 1.
  Cell 'NASDAQ', has row index 3 and column index 2.
  Cell '2.625% Notes due 2033', has row index 4 and column index 0.
  Cell 'MSFT', has row index 4 and column index 1.
  Cell 'NASDAQ', has row index 4 and column index 2.

Om du vill visa hela utdata går du till Azure-exempellagringsplatsen på GitHub för att visa layoutmodellens utdata.

Lägg till följande kodexempel i FormRecognizer.java filen. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans:


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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();

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

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

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

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

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

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

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

Skapa och köra programmet

När du har lagt till ett kodexempel i programmet går du tillbaka till huvudprojektkatalogen – formigenkänningsapp.

  1. Skapa ditt program med build kommandot :

    gradle build
    
  2. Kör programmet med run kommandot :

    gradle run
    

Fördefinierad modell

Analysera och extrahera vanliga fält från specifika dokumenttyper med hjälp av en fördefinierad modell. I det här exemplet analyserar vi en faktura med hjälp av den fördefinierade fakturamodellen .

Dricks

Du är inte begränsad till fakturor – det finns flera fördefinierade modeller att välja mellan, som var och en har en egen uppsättning fält som stöds. Vilken modell som ska användas för analyze åtgärden beror på vilken typ av dokument som ska analyseras. Se extrahering av modelldata.

  • Analysera en faktura med hjälp av den fördefinierade fakturamodellen. Du kan använda vårt exempelfakturadokument för den här snabbstarten.
  • Vi har lagt till fil-URL-värdet i variabeln invoiceUrl överst i filen.
  • Om du vill analysera en viss fil vid en URI använder beginAnalyzeDocuments du metoden och skickar PrebuiltModels.Invoice den som modell-ID. Det returnerade värdet är ett result objekt som innehåller data om det skickade dokumentet.
  • För enkelhetens skull visas inte alla nyckel/värde-par som tjänsten returnerar här. Om du vill se listan över alla fält som stöds och motsvarande typer kan du läsa vår fakturakonceptsida.

Lägg till följande kodexempel i DocIntelligence.java filen. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans:


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

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

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Skapa och köra programmet

När du har lagt till ett kodexempel i programmet går du tillbaka till huvudprojektkatalogen – doc-intel-app.

  1. Skapa ditt program med build kommandot :

    gradle build
    
  2. Kör programmet med run kommandot :

    gradle run
    

Lägg till följande kodexempel i FormRecognizer.java filen. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans:


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

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

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

public class FormRecognizer {

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

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

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

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

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

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

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

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

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

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

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

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

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

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

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

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

Skapa och köra programmet

När du har lagt till ett kodexempel i programmet går du tillbaka till huvudprojektkatalogen – doc-intel-app.

  1. Skapa ditt program med build kommandot :

    gradle build
    
  2. Kör programmet med run kommandot :

    gradle run
    

Fördefinierade modellutdata

Här är ett kodfragment av förväntade utdata:

  ----------- Analyzing invoice  0 -----------
  Analyzed document has doc type invoice with confidence : 1.00
  Vendor Name: CONTOSO LTD., confidence: 0.92
  Vendor address: 123 456th St New York, NY, 10001, confidence: 0.91
  Customer Name: MICROSOFT CORPORATION, confidence: 0.84
  Customer Address Recipient: Microsoft Corp, confidence: 0.92
  Invoice ID: INV-100, confidence: 0.97
  Invoice Date: 2019-11-15, confidence: 0.97

Om du vill visa hela utdata går du till Azure-exempellagringsplatsen på GitHub för att visa de fördefinierade fakturamodellutdata.

Lägg till följande kodexempel i FormRecognizer.java filen. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans:


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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

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

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

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

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

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

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

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

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

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

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

Skapa och köra programmet

När du har lagt till ett kodexempel i programmet går du tillbaka till huvudprojektkatalogen – doc-intel-app.

  1. Skapa ditt program med build kommandot :

    gradle build
    
  2. Kör programmet med run kommandot :

    gradle run
    

I den här snabbstarten använder du följande funktioner för att analysera och extrahera data och värden från formulär och dokument:

  • Layout – Analysera och extrahera tabeller, rader, ord och markeringar som alternativknappar och kryssrutor i dokument, utan att behöva träna en modell.

  • Fördefinierad faktura – Analysera och extrahera vanliga fält från specifika dokumenttyper med hjälp av en förtränad fakturamodell.

Förutsättningar

  • Azure-prenumeration – Skapa en kostnadsfritt.

  • Den senaste versionen av Visual Studio Code eller önskad IDE. Mer information finns i Node.js i Visual Studio Code.

  • Den senaste LTS versionen av Node.js.

  • En Azure AI-tjänst eller dokumentinformationsresurs. När du har din Azure-prenumeration skapar du en dokumentinformationsresurs med en tjänst eller flera tjänster i Azure Portal för att hämta din nyckel och slutpunkt. Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.

    Dricks

    Skapa en Azure AI-tjänstresurs om du planerar att komma åt flera Azure AI-tjänster under en enda slutpunkt/nyckel. För endast åtkomst till dokumentinformation skapar du en dokumentinformationsresurs. Observera att du behöver en resurs med en enda tjänst om du tänker använda Microsoft Entra-autentisering.

  • När resursen har distribuerats väljer du Gå till resurs. Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till API:et för dokumentinformation. Du klistrar in nyckeln och slutpunkten i koden senare i snabbstarten:

    Skärmbild av nycklar och slutpunktsplats i Azure Portal.

Konfigurera

  1. Skapa ett nytt Node.js Express-program: I ett konsolfönster (till exempel cmd, PowerShell eller Bash) skapar och navigerar du till en ny katalog för din app med namnet doc-intel-app.

    mkdir doc-intel-app && cd doc-intel-app
    
  2. npm init Kör kommandot för att initiera programmet och skapa en autogenerering av projektet.

    npm init
    
  3. Ange projektets attribut med hjälp av de prompter som visas i terminalen.

    • De viktigaste attributen är namn, versionsnummer och startpunkt.
    • Vi rekommenderar att du behåller index.js namnet på startpunkten. Beskrivningen, testkommandot, GitHub-lagringsplatsen, nyckelord, författare och licensinformation är valfria attribut – de kan hoppas över för det här projektet.
    • Acceptera förslagen inom parenteser genom att välja Retur eller Retur.
    • När du har slutfört anvisningarna skapas en package.json fil i katalogen doc-intel-app.
  1. ai-document-intelligence Installera klientbiblioteket och azure/identity npm-paketen:

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

    Appens package.json fil uppdateras med beroendena.

  1. ai-form-recognizer Installera klientbiblioteket och azure/identity npm-paketen:

    npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
    
    • Appens package.json fil uppdateras med beroendena.
  1. ai-form-recognizer Installera klientbiblioteket och azure/identity npm-paketen:

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. Skapa en fil med namnet index.js i programkatalogen.

    Dricks

    • Du kan skapa en ny fil med hjälp av PowerShell.
    • Öppna ett PowerShell-fönster i projektkatalogen genom att hålla ned Skift-tangenten och högerklicka på mappen.
    • Skriv följande kommando new-item index.js.

Skapa ditt program

Om du vill interagera med document intelligence-tjänsten måste du skapa en instans av DocumentIntelligenceClient klassen. För att göra det skapar du en AzureKeyCredential med din key från Azure Portal och en DocumentIntelligenceClient instans med och dokumentinformationen AzureKeyCredential endpoint.

Om du vill interagera med document intelligence-tjänsten måste du skapa en instans av DocumentAnalysisClient klassen. För att göra det skapar du en AzureKeyCredential med din key från Azure Portal och en DocumentAnalysisClient instans med AzureKeyCredential och din Formigenkänning endpoint.

  1. index.js Öppna filen i Visual Studio Code eller din favorit-IDE. Kopiera och klistra in något av följande kodexempel i ditt program:

Viktigt!

Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i Säkerhet för Azure AI-tjänster.

Layoutmodell

Extrahera text, markeringsmarkeringar, textformat, tabellstrukturer och koordinater för avgränsningsregionen från dokument.

  • I det här exemplet behöver du en dokumentfil från en URL. Du kan använda vårt exempeldokument för den här snabbstarten.
  • Vi har lagt till fil-URL-värdet i variabeln formUrl längst upp i filen.
  • Om du vill analysera en viss fil från en URL använder beginAnalyzeDocuments du metoden och skickar in prebuilt-layout som modell-ID.
    const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
  { getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

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

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

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

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


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

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

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

    const documents = analyzeResult?.documents;

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

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

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

Kör ditt program

När du har lagt till ett kodexempel i programmet kör du programmet:

  1. Gå till mappen där du har ditt dokumentinformationsprogram (doc-intel-app).

  2. Skriv följande kommando i terminalen:

    node index.js
    

Lägg till följande kodexempel i index.js filen. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans:


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

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

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

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

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

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

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

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

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

Kör ditt program

När du har lagt till ett kodexempel i programmet kör du programmet:

  1. Gå till mappen där du har ditt dokumentinformationsprogram (doc-intel-app).

  2. Skriv följande kommando i terminalen:

    node index.js
    

Utdata för layoutmodell

Här är ett kodfragment av förväntade utdata:

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

Om du vill visa hela utdata går du till Azure-exempellagringsplatsen på GitHub för att visa layoutmodellens utdata.

Fördefinierad modell

I det här exemplet analyserar vi en faktura med hjälp av den fördefinierade fakturamodellen .

Dricks

Du är inte begränsad till fakturor – det finns flera fördefinierade modeller att välja mellan, som var och en har en egen uppsättning fält som stöds. Vilken modell som ska användas för analyze åtgärden beror på vilken typ av dokument som ska analyseras. Se extrahering av modelldata.

  • Analysera en faktura med hjälp av den fördefinierade fakturamodellen. Du kan använda vårt exempelfakturadokument för den här snabbstarten.
  • Vi har lagt till fil-URL-värdet i variabeln invoiceUrl överst i filen.
  • Om du vill analysera en viss fil vid en URI använder beginAnalyzeDocuments du metoden och skickar PrebuiltModels.Invoice den som modell-ID. Det returnerade värdet är ett result objekt som innehåller data om det skickade dokumentet.
  • För enkelhetens skull visas inte alla nyckel/värde-par som tjänsten returnerar här. Om du vill se listan över alla fält som stöds och motsvarande typer kan du läsa vår fakturakonceptsida.

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

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

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

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

async function main() {

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

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

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

    const poller = await getLongRunningPoller(client, initialResponse);

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

    const documents = analyzeResult?.documents;

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

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


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

Kör ditt program

När du har lagt till ett kodexempel i programmet kör du programmet:

  1. Gå till mappen där du har ditt dokumentinformationsprogram (doc-intel-app).

  2. Skriv följande kommando i terminalen:

    node index.js
    

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

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

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

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

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

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

            if (page.lines && page.lines.length > 0) {
                console.log("  Lines:");

                for (const line of page.lines) {
                    console.log(`  - "${line.content}"`);

                    // The words of the line can also be iterated independently. The words are computed based on their
                    // corresponding spans.
                    for (const word of line.words()) {
                        console.log(`    - "${word.content}"`);
                    }
                }
            }
        }
    }

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

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

Kör ditt program

När du har lagt till ett kodexempel i programmet kör du programmet:

  1. Gå till mappen där du har ditt dokumentinformationsprogram (doc-intel-app).

  2. Skriv följande kommando i terminalen:

    node index.js
    

Fördefinierade modellutdata

Här är ett kodfragment av förväntade utdata:

  Vendor Name: CONTOSO LTD.
  Customer Name: MICROSOFT CORPORATION
  Invoice Date: 2019-11-15T00:00:00.000Z
  Due Date: 2019-12-15T00:00:00.000Z
  Items:
  - <no product code>
    Description: Test for 23 fields
    Quantity: 1
    Date: undefined
    Unit: undefined
    Unit Price: 1
    Tax: undefined
    Amount: 100

Om du vill visa hela utdata går du till Azure-exempellagringsplatsen på GitHub för att visa de fördefinierade fakturamodellutdata.

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

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

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

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

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


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

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

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

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

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


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

Kör ditt program

När du har lagt till ett kodexempel i programmet kör du programmet:

  1. Gå till mappen där du har ditt dokumentinformationsprogram (doc-intel-app).

  2. Skriv följande kommando i terminalen:

    node index.js
    

I den här snabbstarten använder du följande funktioner för att analysera och extrahera data från formulär och dokument:

  • Layout – Analysera och extrahera tabeller, linjer, ord och markeringsmarkeringar som alternativknappar och kryssrutor och nyckel/värde-par, utan att behöva träna en modell.

  • Fördefinierad faktura – Analysera och extrahera vanliga fält från specifika dokumenttyper med hjälp av en förtränad modell.

Förutsättningar

  • Azure-prenumeration – Skapa en kostnadsfritt.

  • Python 3.7 eller senare.

    • Python-installationen bör innehålla pip. Du kan kontrollera om du har pip installerat genom att köra pip --version på kommandoraden. Hämta pip genom att installera den senaste versionen av Python.
  • Den senaste versionen av Visual Studio Code eller önskad IDE. Mer information finns i Komma igång med Python i Visual Studio Code.

  • En Azure AI-tjänst eller dokumentinformationsresurs. När du har din Azure-prenumeration skapar du en dokumentinformationsresurs med en tjänst eller flera tjänster i Azure Portal för att hämta din nyckel och slutpunkt. Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.

Dricks

Skapa en Azure AI-tjänstresurs om du planerar att komma åt flera Azure AI-tjänster under en enda slutpunkt/nyckel. För endast åtkomst till dokumentinformation skapar du en dokumentinformationsresurs. Observera att du behöver en resurs med en enda tjänst om du tänker använda Microsoft Entra-autentisering.

  • När resursen har distribuerats väljer du Gå till resurs. Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till API:et för dokumentinformation. Du klistrar in nyckeln och slutpunkten i koden senare i snabbstarten:

    Skärmbild av nycklar och slutpunktsplats i Azure Portal.

Konfigurera

Öppna ett terminalfönster i din lokala miljö och installera Azure AI Document Intelligence-klientbiblioteket för Python med pip:

pip install azure-ai-documentintelligence==1.0.0b4

pip install azure-ai-formrecognizer==3.3.0

pip install azure-ai-formrecognizer==3.2.0b6

Skapa ditt Python-program

Om du vill interagera med document intelligence-tjänsten måste du skapa en instans av DocumentIntelligenceClient klassen. För att göra det skapar du en AzureKeyCredential med din key från Azure Portal och en DocumentIntelligenceClient instans med och dokumentinformationen AzureKeyCredential endpoint.

  1. Skapa en ny Python-fil med namnet doc_intel_quickstart.py i önskad redigerare eller IDE.

  2. Öppna filen doc_intel_quickstart.py och välj något av följande kodexempel för att kopiera och klistra in i ditt program:

Om du vill interagera med document intelligence-tjänsten måste du skapa en instans av DocumentAnalysisClient klassen. För att göra det skapar du en AzureKeyCredential med din key från Azure Portal och en DocumentAnalysisClient instans med och dokumentinformationen AzureKeyCredential endpoint.

  1. Skapa en ny Python-fil med namnet form_recognizer_quickstart.py i önskad redigerare eller IDE.

  2. Öppna filen form_recognizer_quickstart.py och välj något av följande kodexempel för att kopiera och klistra in i ditt program:

Viktigt!

Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i Säkerhet för Azure AI-tjänster.

Layoutmodell

Extrahera text, markeringsmarkeringar, textformat, tabellstrukturer och koordinater för avgränsningsregionen från dokument.

  • I det här exemplet behöver du en dokumentfil från en URL. Du kan använda vårt exempeldokument för den här snabbstarten.
  • Vi har lagt till fil-URL-värdet i variabeln formUrl analyze_layout i funktionen.

Lägg till följande kodexempel i ditt doc_intel_quickstart.py program. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans:


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

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

# helper functions

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


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


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

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

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

    result: AnalyzeResult = poller.result()

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

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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()

Kör programmet

När du har lagt till ett kodexempel i ditt program skapar och kör du programmet:

  1. Gå till mappen där du har din doc_intel_quickstart.py-fil .

  2. Skriv följande kommando i terminalen:

    python doc_intel_quickstart.py
    

Om du vill analysera en viss fil på en URL använder begin_analyze_document_from_url du metoden och skickar in prebuilt-layout som modell-ID. Det returnerade värdet är ett result objekt som innehåller data om det skickade dokumentet.

Lägg till följande kodexempel i ditt form_recognizer_quickstart.py-program. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Formigenkänning-instans:


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

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

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

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

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

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

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

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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()

Kör programmet

När du har lagt till ett kodexempel i ditt program skapar och kör du programmet:

  1. Gå till den mapp där du har din form_recognizer_quickstart.py-fil .

  2. Skriv följande kommando i terminalen:

    python form_recognizer_quickstart.py
    

Utdata för layoutmodell

Här är ett kodfragment av förväntade utdata:

  ----Analyzing layout from page #1----
  Page has width: 8.5 and height: 11.0, measured with unit: inch
  ...Line # 0 has word count 2 and text 'UNITED STATES' within bounding box '[3.4915, 0.6828], [5.0116, 0.6828], [5.0116, 0.8265], [3.4915, 0.8265]'
  ......Word 'UNITED' has a confidence of 1.0
  ......Word 'STATES' has a confidence of 1.0
  ...Line # 1 has word count 4 and text 'SECURITIES AND EXCHANGE COMMISSION' within bounding box '[2.1937, 0.9061], [6.297, 0.9061], [6.297, 1.0498], [2.1937, 1.0498]'
  ......Word 'SECURITIES' has a confidence of 1.0
  ......Word 'AND' has a confidence of 1.0
  ......Word 'EXCHANGE' has a confidence of 1.0
  ......Word 'COMMISSION' has a confidence of 1.0
  ...Line # 2 has word count 3 and text 'Washington, D.C. 20549' within bounding box '[3.4629, 1.1179], [5.031, 1.1179], [5.031, 1.2483], [3.4629, 1.2483]'
  ......Word 'Washington,' has a confidence of 1.0
  ......Word 'D.C.' has a confidence of 1.0

Om du vill visa hela utdata går du till Azure-exempellagringsplatsen på GitHub för att visa layoutmodellens utdata.

Lägg till följande kodexempel i ditt form_recognizer_quickstart.py-program. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Formigenkänning-instans:


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

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


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

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

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

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

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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()


Kör programmet

När du har lagt till ett kodexempel i ditt program skapar och kör du programmet:

  1. Gå till den mapp där du har din form_recognizer_quickstart.py-fil .

  2. Skriv följande kommando i terminalen:

    python form_recognizer_quickstart.py
    

Fördefinierad modell

Analysera och extrahera vanliga fält från specifika dokumenttyper med hjälp av en fördefinierad modell. I det här exemplet analyserar vi en faktura med hjälp av den fördefinierade fakturamodellen .

Dricks

Du är inte begränsad till fakturor – det finns flera fördefinierade modeller att välja mellan, som var och en har en egen uppsättning fält som stöds. Vilken modell som ska användas för analyze åtgärden beror på vilken typ av dokument som ska analyseras. Se extrahering av modelldata.

  • Analysera en faktura med hjälp av den fördefinierade fakturamodellen. Du kan använda vårt exempelfakturadokument för den här snabbstarten.
  • Vi har lagt till fil-URL-värdet i variabeln invoiceUrl överst i filen.
  • För enkelhetens skull visas inte alla nyckel/värde-par som tjänsten returnerar här. Om du vill se listan över alla fält som stöds och motsvarande typer kan du läsa vår fakturakonceptsida.

Lägg till följande kodexempel i ditt doc_intel_quickstart.py program. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans:


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



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

def analyze_invoice():
    # sample document

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

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

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

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


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


if __name__ == "__main__":
    analyze_invoice()


Kör programmet

När du har lagt till ett kodexempel i ditt program skapar och kör du programmet:

  1. Gå till mappen där du har din doc_intel_quickstart.py-fil .

  2. Skriv följande kommando i terminalen:

    python doc_intel_quickstart.py
    

Om du vill analysera en viss fil vid en URI använder begin_analyze_document_from_url du metoden och skickar prebuilt-invoice den som modell-ID. Det returnerade värdet är ett result objekt som innehåller data om det skickade dokumentet.

Lägg till följande kodexempel i ditt form_recognizer_quickstart.py-program. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Formigenkänning-instans:

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

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


def format_bounding_region(bounding_regions):
    if not bounding_regions:
        return "N/A"
    return ", ".join(
        "Page #{}: {}".format(region.page_number, format_polygon(region.polygon))
        for region in bounding_regions
    )


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


def analyze_invoice():

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

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

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-invoice", invoiceUrl
    )
    invoices = poller.result()

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

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

if __name__ == "__main__":
    analyze_invoice()


Kör programmet

När du har lagt till ett kodexempel i ditt program skapar och kör du programmet:

  1. Gå till den mapp där du har din form_recognizer_quickstart.py-fil .

  2. Skriv följande kommando i terminalen:

    python form_recognizer_quickstart.py
    

Fördefinierade modellutdata

Här är ett kodfragment av förväntade utdata:

  --------Recognizing invoice #1--------
  Vendor Name: CONTOSO LTD. has confidence: 0.919
  Vendor Address: 123 456th St New York, NY, 10001 has confidence: 0.907
  Vendor Address Recipient: Contoso Headquarters has confidence: 0.919
  Customer Name: MICROSOFT CORPORATION has confidence: 0.84
  Customer Id: CID-12345 has confidence: 0.956
  Customer Address: 123 Other St, Redmond WA, 98052 has confidence: 0.909
  Customer Address Recipient: Microsoft Corp has confidence: 0.917
  Invoice Id: INV-100 has confidence: 0.972
  Invoice Date: 2019-11-15 has confidence: 0.971
  Invoice Total: CurrencyValue(amount=110.0, symbol=$) has confidence: 0.97
  Due Date: 2019-12-15 has confidence: 0.973

Om du vill visa hela utdata går du till Azure-exempellagringsplatsen på GitHub för att visa de fördefinierade fakturamodellutdata.

Lägg till följande kodexempel i ditt form_recognizer_quickstart.py-program. Se till att du uppdaterar nyckel- och slutpunktsvariablerna med värden från din Azure Portal Formigenkänning-instans:


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

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


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


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

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

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

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


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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()


Kör programmet

När du har lagt till ett kodexempel i ditt program skapar och kör du programmet:

  1. Gå till den mapp där du har din form_recognizer_quickstart.py-fil .

  2. Skriv följande kommando i terminalen:

    python form_recognizer_quickstart.py
    

I den här snabbstarten lär du dig att använda REST-API:et för dokumentinformation för att analysera och extrahera data och värden från dokument:

Förutsättningar

  • Azure-prenumeration – Skapa en kostnadsfritt

  • curl-kommandoradsverktyget installerat.

  • PowerShell version 7.*+ (eller ett liknande kommandoradsprogram.):

  • Om du vill kontrollera din PowerShell-version skriver du följande kommando i förhållande till operativsystemet:

    • Windows: Get-Host | Select-Object Version
    • macOS eller Linux: $PSVersionTable
  • En dokumentinformationsresurs (enskild tjänst) eller Azure AI-tjänster (flera tjänster). När du har din Azure-prenumeration skapar du en dokumentinformationsresurs med en tjänst eller flera tjänster i Azure Portal för att hämta din nyckel och slutpunkt. Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.

Dricks

Skapa en Azure AI-tjänstresurs om du planerar att komma åt flera Azure AI-tjänster under en enda slutpunkt/nyckel. För endast åtkomst till dokumentinformation skapar du en dokumentinformationsresurs. Observera att du behöver en resurs med en enda tjänst om du tänker använda Microsoft Entra-autentisering.

  • När resursen har distribuerats väljer du Gå till resurs. Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till API:et för dokumentinformation. Du klistrar in nyckeln och slutpunkten i koden senare i snabbstarten:

    Skärmbild av nycklar och slutpunktsplats i Azure Portal.

Analysera dokument och få resultat

En POST-begäran används för att analysera dokument med en fördefinierad eller anpassad modell. En GET-begäran används för att hämta resultatet av ett dokumentanalysanrop. modelId Används med POST och resultId med GET-åtgärder.

Analysera dokument (POST-begäran)

Innan du kör cURL-kommandot gör du följande ändringar i efterbegäran:

  1. Ersätt {endpoint} med slutpunktsvärdet från din Azure Portal Document Intelligence-instans.

  2. Ersätt {key} med nyckelvärdet från din Azure Portal Document Intelligence-instans.

  3. Använd följande tabell som referens och ersätt {modelID} och {your-document-url} med önskade värden.

  4. Du behöver en dokumentfil på en URL. För den här snabbstarten kan du använda exempelformulären i följande tabell för varje funktion:

Exempeldokument

Funktion {modelID} {your-document-url}
Läs prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Layout fördefinierad layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Sjukförsäkringskort prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
W-2 prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Faktura fördefinierad faktura https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Kvitto fördefinierad kvitto https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
ID-dokument prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

Exempeldokument

Funktion {modelID} {your-document-url}
Allmänt dokument prebuilt-document https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Läs prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Layout fördefinierad layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Sjukförsäkringskort prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
W-2 prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Faktura fördefinierad faktura https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Kvitto fördefinierad kvitto https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
ID-dokument prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png
Visitkort prebuilt-businessCard https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg

Viktigt!

Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i Säkerhet för Azure AI-tjänster.

POST-begäran

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

POST-svar (resultID)

Du får ett 202 (Success) svar som innehåller en skrivskyddad rubrik för åtgärdsplats . Värdet för det här huvudet innehåller en resultID som kan efterfrågas för att hämta status för den asynkrona åtgärden och hämta resultaten med hjälp av en GET-begäran med samma resursprenumerationsnyckel:

{alt-text}

Hämta analysresultat (GET-begäran)

När du har anropat API:et Analyze document anropar du API:et Hämta analysresultat för att hämta status för åtgärden och extraherade data. Innan du kör kommandot gör du följande ändringar:

När du har anropat API:et Analyze document anropar du API:et Hämta analysresultat för att hämta status för åtgärden och extraherade data. Innan du kör kommandot gör du följande ändringar:

När du har anropat API:et Analyze document anropar du API:et Hämta analysresultat för att hämta status för åtgärden och extraherade data. Innan du kör kommandot gör du följande ändringar:

  1. Ersätt {resultID} rubriken Operation-Location från POST-svaret.

  2. Ersätt {key} med nyckelvärdet från din Document Intelligence-instans i Azure Portal.

GET-begäranden

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

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

Granska svaret

Du får ett 200 (Success) svar med JSON-utdata. Det första fältet, "status", anger status för åtgärden. Om åtgärden inte är slutförd är "running" värdet "status" för eller "notStarted", och du bör anropa API:et igen, antingen manuellt eller via ett skript. Vi rekommenderar ett intervall på en sekund eller mer mellan anrop.

Exempelsvar för fördefinierad faktura

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

Dokumentfält som stöds

De fördefinierade modellerna extraherar fördefinierade uppsättningar med dokumentfält. Se Extrahering av modelldata för extraherade fältnamn, typer, beskrivningar och exempel.

Det var allt, grattis!

I den här snabbstarten använde du en dokumentinformationsmodell för att analysera olika formulär och dokument. Utforska sedan Document Intelligence Studio och referensdokumentationen för att lära dig mer om API för dokumentinformation på djupet.

Nästa steg

Det här innehållet gäller för: Bockmarkering v2.1 | Senaste version: blå bockmarkering v4.0 (förhandsversion)

Kom igång med Azure AI Document Intelligence med det programmeringsspråk du väljer eller REST-API:et. Document Intelligence är en molnbaserad Azure AI-tjänst som använder maskininlärning för att extrahera nyckel/värde-par, text och tabeller från dina dokument. Vi rekommenderar att du använder den kostnadsfria tjänsten när du lär dig tekniken. Kom ihåg att antalet kostnadsfria sidor är begränsat till 500 per månad.

Mer information om funktioner och utvecklingsalternativ för dokumentinformation finns på vår översiktssida .

Referensdokumentation NuGet-exempel (Library Source Code | Package) | |

I den här snabbstarten använder du följande API:er för att extrahera strukturerade data från formulär och dokument:

Förutsättningar

  • Azure-prenumeration – Skapa en kostnadsfritt.

  • Den aktuella versionen av Visual Studio IDE.

  • En Azure AI-tjänst eller dokumentinformationsresurs. När du har din Azure-prenumeration skapar du en dokumentinformationsresurs med en tjänst eller flera tjänster i Azure Portal för att hämta din nyckel och slutpunkt. Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.

    Dricks

    Skapa en Azure AI-tjänstresurs om du planerar att komma åt flera Azure AI-tjänster under en enda slutpunkt/nyckel. För endast åtkomst till dokumentinformation skapar du en dokumentinformationsresurs. Observera att du behöver en resurs med en enda tjänst om du tänker använda Microsoft Entra-autentisering.

  • När resursen har distribuerats väljer du Gå till resurs. Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till API:et för dokumentinformation. Du klistrar in nyckeln och slutpunkten i koden senare i snabbstarten:

    Skärmbild av nycklar och slutpunktsplats i Azure Portal.

Konfigurera

  1. Starta Visual Studio 2019.

  2. På startsidan väljer du Skapa ett nytt projekt.

    Skärmbild av Visual Studio-startfönstret.

  3. På sidan Skapa ett nytt projekt anger du konsolen i sökrutan. Välj mallen Konsolprogram och välj sedan Nästa.

    Skärmbild av sidan Skapa nytt projekt i Visual Studio.

  4. I dialogrutan Konfigurera det nya projektet anger du formRecognizer_quickstart i rutan Projektnamn. Välj sedan Nästa.

    Skärmbild av dialogrutan Konfigurera nytt projekt i Visual Studios.

  5. I dialogrutan Ytterligare information väljer du .NET 5.0 (Aktuell) och väljer sedan Skapa.

    Skärmbild av dialogrutan För ytterligare information i Visual Studio.

Installera klientbiblioteket med NuGet

  1. Högerklicka på ditt formRecognizer_quickstart projekt och välj Hantera NuGet-paket... .

    Skärmbild som visar fönstret Välj NuGet-paket.

  2. Välj fliken Bläddra och skriv Azure.AI.FormRecognizer.

    Skärmbild som visar listrutan välj Dokumentinformationspaket.

  3. Välj version 3.1.1 på den nedrullningsbara menyn och välj Installera.

Skapa ditt program

Om du vill interagera med document intelligence-tjänsten måste du skapa en instans av FormRecognizerClient klassen. För att göra det skapar du en AzureKeyCredential med din nyckel och en FormRecognizerClient instans med dokumentinformationen AzureKeyCredential endpointoch .

Kommentar

  • Från och med .NET 6 genererar nya projekt med mallen console ett nytt programformat som skiljer sig från tidigare versioner.
  • De nya utdata använder de senaste C#-funktionerna som förenklar koden du behöver skriva.
  • När du använder den nyare versionen behöver du bara skriva metodens Main brödtext. Du behöver inte inkludera toppnivåinstruktioner, globala användningsdirektiv eller implicita med hjälp av direktiv.
  • Mer information finns i Nya C#-mallar genererar toppnivåinstruktioner.
  1. Öppna filen Program.cs .

  2. Inkludera följande med hjälp av direktiv:

using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
  1. Ange dina endpoint miljövariabler och key skapa instansen AzureKeyCredential och FormRecognizerClient :
private static readonly string endpoint = "your-form-recognizer-endpoint";
private static readonly string key = "your-api-key";
private static readonly AzureKeyCredential credential = new AzureKeyCredential(key);
  1. Ta bort raden Console.Writeline("Hello World!"); , och lägg till ett av try it-kodexemplen i Program.cs fil:

    Skärmbild av hur du lägger till exempelkoden i Main-metoden.

  2. Välj ett kodexempel för att kopiera och klistra in i programmets Main-metod:

Viktigt!

Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i artikeln om Säkerhet för Azure AI-tjänster.

Prova: Layoutmodell

Extrahera text, markeringsmarkeringar, textformat och tabellstrukturer, tillsammans med deras koordinater för avgränsningsregionen från dokument.

  • I det här exemplet behöver du en dokumentfil på en URI. Du kan använda vårt exempeldokument för den här snabbstarten.
  • Vi har lagt till fil-URI-värdet i variabeln formUri .
  • Om du vill extrahera layouten från en viss fil på en URI använder du StartRecognizeContentFromUriAsync metoden .

Lägg till följande kod i layoutprogrammet Program.cs fil:


FormRecognizerClient recognizerClient = AuthenticateClient();

Task recognizeContent = RecognizeContent(recognizerClient);
Task.WaitAll(recognizeContent);

private static FormRecognizerClient AuthenticateClient()
            {
                var credential = new AzureKeyCredential(key);
                var client = new FormRecognizerClient(new Uri(endpoint), credential);
                return client;
            }

            private static async Task RecognizeContent(FormRecognizerClient recognizerClient)
        {
            string formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
            FormPageCollection formPages = await recognizerClient
        .StartRecognizeContentFromUri(new Uri(formUrl))
        .WaitForCompletionAsync();

            foreach (FormPage page in formPages)
            {
                Console.WriteLine($"Form Page {page.PageNumber} has {page.Lines.Count} lines.");

                for (int i = 0; i < page.Lines.Count; i++)
                {
                    FormLine line = page.Lines[i];
                    Console.WriteLine($"    Line {i} has {line.Words.Count} word{(line.Words.Count > 1 ? "s" : "")}, and text: '{line.Text}'.");
                }

                for (int i = 0; i < page.Tables.Count; i++)
                {
                    FormTable table = page.Tables[i];
                    Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
                    foreach (FormTableCell cell in table.Cells)
                    {
                        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) contains text: '{cell.Text}'.");
                    }
                }
            }
        }
    }
}

Prova: Fördefinierad modell

Det här exemplet visar hur du analyserar data från vissa typer av vanliga dokument med förtränad modeller med hjälp av en faktura som exempel.

  • I det här exemplet ska vi analysera ett fakturadokument med hjälp av en fördefinierad modell. Du kan använda vårt exempelfakturadokument för den här snabbstarten.
  • Vi har lagt till fil-URI-värdet i variabeln invoiceUri överst i Main-metoden.
  • Om du vill analysera en viss fil vid en URI använder du StartRecognizeInvoicesFromUriAsync metoden .
  • För enkelhetens skull visas inte alla fält som tjänsten returnerar här. Om du vill se listan över alla fält som stöds och motsvarande typer kan du läsa vår fakturakonceptsida.

Välj en fördefinierad modell

Du är inte begränsad till fakturor – det finns flera fördefinierade modeller att välja mellan, som var och en har en egen uppsättning fält som stöds. Vilken modell som ska användas för analysåtgärden beror på vilken typ av dokument som ska analyseras. Här är de fördefinierade modeller som för närvarande stöds av document intelligence-tjänsten:

  • Faktura: extraherar text, markeringar, tabeller, fält och nyckelinformation från fakturor.
  • Kvitto: extraherar text och nyckelinformation från kvitton.
  • ID-dokument: extraherar text och viktig information från körkort och internationella pass.
  • Visitkort: extraherar text och viktig information från visitkort.

Lägg till följande kod i ditt fördefinierade fakturaprogram Program.cs filmetod

FormRecognizerClient recognizerClient = AuthenticateClient();

  Task analyzeinvoice = AnalyzeInvoice(recognizerClient, invoiceUrl);
  Task.WaitAll(analyzeinvoice);

   private static FormRecognizerClient AuthenticateClient() {
     var credential = new AzureKeyCredential(key);
     var client = new FormRecognizerClient(new Uri(endpoint), credential);
     return client;
   }

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

   private static async Task AnalyzeInvoice(FormRecognizerClient recognizerClient, string invoiceUrl) {
     var options = new RecognizeInvoicesOptions() {
       Locale = "en-US"
     };
     RecognizedFormCollection invoices = await recognizerClient.StartRecognizeInvoicesFromUriAsync(new Uri(invoiceUrl), options).WaitForCompletionAsync();

     RecognizedForm invoice = invoices[0];

     FormField invoiceIdField;
     if (invoice.Fields.TryGetValue("InvoiceId", out invoiceIdField)) {
       if (invoiceIdField.Value.ValueType == FieldValueType.String) {
         string invoiceId = invoiceIdField.Value.AsString();
         Console.WriteLine($"    Invoice Id: '{invoiceId}', with confidence {invoiceIdField.Confidence}");
       }
     }

     FormField invoiceDateField;
     if (invoice.Fields.TryGetValue("InvoiceDate", out invoiceDateField)) {
       if (invoiceDateField.Value.ValueType == FieldValueType.Date) {
         DateTime invoiceDate = invoiceDateField.Value.AsDate();
         Console.WriteLine($"    Invoice Date: '{invoiceDate}', with confidence {invoiceDateField.Confidence}");
       }
     }

     FormField dueDateField;
     if (invoice.Fields.TryGetValue("DueDate", out dueDateField)) {
       if (dueDateField.Value.ValueType == FieldValueType.Date) {
         DateTime dueDate = dueDateField.Value.AsDate();
         Console.WriteLine($"    Due Date: '{dueDate}', with confidence {dueDateField.Confidence}");
       }
     }

     FormField vendorNameField;
     if (invoice.Fields.TryGetValue("VendorName", out vendorNameField)) {
       if (vendorNameField.Value.ValueType == FieldValueType.String) {
         string vendorName = vendorNameField.Value.AsString();
         Console.WriteLine($"    Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
       }
     }

     FormField vendorAddressField;
     if (invoice.Fields.TryGetValue("VendorAddress", out vendorAddressField)) {
       if (vendorAddressField.Value.ValueType == FieldValueType.String) {
         string vendorAddress = vendorAddressField.Value.AsString();
         Console.WriteLine($"    Vendor Address: '{vendorAddress}', with confidence {vendorAddressField.Confidence}");
       }
     }

     FormField customerNameField;
     if (invoice.Fields.TryGetValue("CustomerName", out customerNameField)) {
       if (customerNameField.Value.ValueType == FieldValueType.String) {
         string customerName = customerNameField.Value.AsString();
         Console.WriteLine($"    Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
       }
     }

     FormField customerAddressField;
     if (invoice.Fields.TryGetValue("CustomerAddress", out customerAddressField)) {
       if (customerAddressField.Value.ValueType == FieldValueType.String) {
         string customerAddress = customerAddressField.Value.AsString();
         Console.WriteLine($"    Customer Address: '{customerAddress}', with confidence {customerAddressField.Confidence}");
       }
     }

     FormField customerAddressRecipientField;
     if (invoice.Fields.TryGetValue("CustomerAddressRecipient", out customerAddressRecipientField)) {
       if (customerAddressRecipientField.Value.ValueType == FieldValueType.String) {
         string customerAddressRecipient = customerAddressRecipientField.Value.AsString();
         Console.WriteLine($"    Customer address recipient: '{customerAddressRecipient}', with confidence {customerAddressRecipientField.Confidence}");
       }
     }

     FormField invoiceTotalField;
     if (invoice.Fields.TryGetValue("InvoiceTotal", out invoiceTotalField)) {
       if (invoiceTotalField.Value.ValueType == FieldValueType.Float) {
         float invoiceTotal = invoiceTotalField.Value.AsFloat();
         Console.WriteLine($"    Invoice Total: '{invoiceTotal}', with confidence {invoiceTotalField.Confidence}");
       }
     }
   }
 }
}

Köra ditt program

Välj den gröna startknappen bredvid formRecognizer_quickstart för att skapa och köra programmet, eller tryck på F5.

Skärmbild av hur du kör Visual Studio-programmet.

Referensdokumentation Exempel på källkodspaket | för bibliotek (Maven) | |

I den här snabbstarten använder du följande API:er för att extrahera strukturerade data från formulär och dokument:

Förutsättningar

  • Azure-prenumeration – Skapa en kostnadsfritt.

  • Java Development Kit (JDK) version 8 eller senare. Mer information finns i Java-versioner som stöds och uppdateringsschema.

  • En Azure AI-tjänst eller dokumentinformationsresurs. När du har din Azure-prenumeration skapar du en dokumentinformationsresurs med en tjänst eller flera tjänster i Azure Portal för att hämta din nyckel och slutpunkt. Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.

  • När resursen har distribuerats väljer du Gå till resurs. Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till API:et för dokumentinformation. Du klistrar in nyckeln och slutpunkten i koden senare i snabbstarten:

    Skärmbild av nycklar och slutpunktsplats i Azure Portal.

Konfigurera

Skapa ett nytt Gradle-projekt

I ett konsolfönster (till exempel cmd, PowerShell eller Bash) skapar du en ny katalog för din app med namnet formigenkänningsapp och navigerar till den.

mkdir form-recognizer-app && form-recognizer-app
  1. Kör kommandot från arbetskatalogen gradle init . Det här kommandot skapar viktiga byggfiler för Gradle, inklusive build.gradle.kts, som används vid körning för att skapa och konfigurera ditt program.

    gradle init --type basic
    
  2. Välj en DSL när du uppmanas till det och välj Kotlin.

  3. Acceptera standardprojektets namn (formigenkänningsapp)

Installera klientbiblioteket

Den här snabbstarten använder Gradle-beroendehanteraren. Du hittar klientbiblioteket och information för andra beroendehanterare på Den centrala Maven-lagringsplatsen.

I projektets build.gradle.kts-fil tar du med klientbiblioteket som en implementation instruktion, tillsammans med nödvändiga plugin-program och inställningar.

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

Skapa en Java-fil

Kör följande kommando från arbetskatalogen:

mkdir -p src/main/java

Du skapar följande katalogstruktur:

Skärmbild av programmets Java-katalogstruktur.

Gå till Java-katalogen och skapa en fil med namnet FormRecognizer.java. Öppna den i önskad redigerare eller IDE och lägg till följande paketdeklaration och import -instruktioner:

import com.azure.ai.formrecognizer.*;
import com.azure.ai.formrecognizer.models.*;

import java.util.concurrent.atomic.AtomicReference;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.Context;
import com.azure.core.util.polling.SyncPoller;

Välj ett kodexempel för att kopiera och klistra in i programmets huvudmetod:

Viktigt!

Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i Säkerhet för Azure AI-tjänster.

Prova: Layoutmodell

Extrahera text, markeringsmarkeringar, textformat och tabellstrukturer, tillsammans med deras koordinater för avgränsningsregionen från dokument.

  • I det här exemplet behöver du en dokumentfil på en URI. Du kan använda vårt exempeldokument för den här snabbstarten.
  • Om du vill analysera en viss fil vid en URI använder beginRecognizeContentFromUrl du metoden .
  • Vi har lagt till fil-URI-värdet i variabeln formUrl i huvudmetoden.

Uppdatera programmets FormRecognizer-klass med följande kod (se till att uppdatera nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans):


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

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

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

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

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

Prova: Fördefinierad modell

Det här exemplet visar hur du analyserar data från vissa typer av vanliga dokument med förtränad modeller med hjälp av en faktura som exempel.

  • I det här exemplet ska vi analysera ett fakturadokument med hjälp av en fördefinierad modell. Du kan använda vårt exempelfakturadokument för den här snabbstarten.
  • Om du vill analysera en viss fil vid en URI använder beginRecognizeInvoicesFromUrl du .
  • Vi har lagt till fil-URI-värdet i variabeln invoiceUrl i huvudmetoden.
  • För enkelhetens skull visas inte alla fält som tjänsten returnerar här. Om du vill se listan över alla fält som stöds och motsvarande typer kan du läsa vår fakturakonceptsida.

Välj en fördefinierad modell

Du är inte begränsad till fakturor – det finns flera fördefinierade modeller att välja mellan, som var och en har en egen uppsättning fält som stöds. Vilken modell som ska användas för analysåtgärden beror på vilken typ av dokument som ska analyseras. Här är de fördefinierade modeller som för närvarande stöds av document intelligence-tjänsten:

  • Faktura: extraherar text, markeringar, tabeller, fält och nyckelinformation från fakturor.
  • Kvitto: extraherar text och nyckelinformation från kvitton.
  • ID-dokument: extraherar text och viktig information från körkort och internationella pass.
  • Visitkort: extraherar text och viktig information från visitkort.

Uppdatera programmets FormRecognizer-klass med följande kod (se till att uppdatera nyckel- och slutpunktsvariablerna med värden från din Azure Portal Document Intelligence-instans):


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

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

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

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

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

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

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

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

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

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

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

Skapa och köra ditt program

Gå tillbaka till huvudprojektkatalogen – form-recognizer-app.

  1. Skapa ditt program med build kommandot :
gradle build
  1. Kör programmet med run kommandot :
gradle run

Referensdokumentation Bibliotek källkodspaket | (npm)Exempel | |

I den här snabbstarten använder du följande API:er för att extrahera strukturerade data från formulär och dokument:

Förutsättningar

  • Azure-prenumeration – Skapa en kostnadsfritt.

  • Den senaste versionen av Visual Studio Code eller önskad IDE.

  • Den senaste LTS-versionen av Node.js

  • En Azure AI-tjänst eller dokumentinformationsresurs. När du har din Azure-prenumeration skapar du en dokumentinformationsresurs med en tjänst eller flera tjänster i Azure Portal för att hämta din nyckel och slutpunkt. Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.

    Dricks

    Skapa en Azure AI-tjänstresurs om du planerar att komma åt flera Azure AI-tjänster under en enda slutpunkt/nyckel. För endast åtkomst till dokumentinformation skapar du en dokumentinformationsresurs. Observera att du behöver en resurs med en enda tjänst om du tänker använda Microsoft Entra-autentisering.

  • När resursen har distribuerats väljer du Gå till resurs. Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till API:et för dokumentinformation. Du klistrar in nyckeln och slutpunkten i koden senare i snabbstarten:

    Skärmbild av nycklar och slutpunktsplats i Azure Portal.

Konfigurera

  1. Skapa ett nytt Node.js-program. Skapa en ny katalog för din app i ett konsolfönster (till exempel cmd, PowerShell eller bash) och navigera till den.

    mkdir form-recognizer-app && cd form-recognizer-app
    
  2. Kör kommandot npm init för att skapa ett nodprogram med en package.json-fil.

    npm init
    
  3. Installera npm-paketet för ai-form-recognizer klientbiblioteket:

    npm install @azure/ai-form-recognizer
    

    Appens package.json fil uppdateras med beroendena.

  4. Skapa en fil med namnet index.js, öppna den och importera följande bibliotek:

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. Skapa variabler för resursens Azure-slutpunkt och nyckel:

    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    
  6. I det här läget bör javaScript-programmet innehålla följande kodrader:

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

Välj ett kodexempel för att kopiera och klistra in i ditt program:

Viktigt!

Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i Säkerhet för Azure AI-tjänster.

Prova: Layoutmodell

  • I det här exemplet behöver du en dokumentfil på en URI. Du kan använda vårt exempeldokument för den här snabbstarten.
  • Vi har lagt till fil-URI-värdet i variabeln formUrl längst upp i filen.
  • Om du vill analysera en viss fil vid en URI använder beginRecognizeContent du metoden .

Lägg till följande kod i layoutprogrammet på raden under variabeln key

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

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

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

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

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

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

Prova: Fördefinierad modell

Det här exemplet visar hur du analyserar data från vissa typer av vanliga dokument med förtränad modeller med hjälp av en faktura som exempel. Se vår fördefinierade konceptsida för en fullständig lista över fakturafält

  • I det här exemplet ska vi analysera ett fakturadokument med hjälp av en fördefinierad modell. Du kan använda vårt exempelfakturadokument för den här snabbstarten.
  • Vi har lagt till fil-URI-värdet i variabeln invoiceUrl överst i filen.
  • Om du vill analysera en viss fil vid en URI använder beginRecognizeInvoices du metoden .
  • För enkelhetens skull visas inte alla fält som tjänsten returnerar här. Om du vill se listan över alla fält som stöds och motsvarande typer kan du läsa vår fakturakonceptsida.

Välj en fördefinierad modell

Du är inte begränsad till fakturor – det finns flera fördefinierade modeller att välja mellan, som var och en har en egen uppsättning fält som stöds. Vilken modell som ska användas för analysåtgärden beror på vilken typ av dokument som ska analyseras. Här är de fördefinierade modeller som för närvarande stöds av document intelligence-tjänsten:

  • Faktura: extraherar text, markeringar, tabeller, fält och nyckelinformation från fakturor.
  • Kvitto: extraherar text och nyckelinformation från kvitton.
  • ID-dokument: extraherar text och viktig information från körkort och internationella pass.
  • Visitkort: extraherar text och viktig information från visitkort.

Lägg till följande kod i ditt fördefinierade fakturaprogram under variabeln key


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

async function recognizeInvoices() {

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

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

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

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

    console.log("Invoice fields:");

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

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

    console.log("- Items:");

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

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

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

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

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

Exempel på källkodspaket (PyPi) | för referensdokumentation | |

I den här snabbstarten använder du följande API:er för att extrahera strukturerade data från formulär och dokument:

Förutsättningar

  • Azure-prenumeration – Skapa en kostnadsfritt

  • Python 3.x

    • Python-installationen bör innehålla pip. Du kan kontrollera om du har pip installerat genom att köra pip --version på kommandoraden. Hämta pip genom att installera den senaste versionen av Python.
  • En Azure AI-tjänst eller dokumentinformationsresurs. När du har din Azure-prenumeration skapar du en dokumentinformationsresurs med en tjänst eller flera tjänster i Azure Portal för att hämta din nyckel och slutpunkt. Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.

    Dricks

    Skapa en Azure AI-tjänstresurs om du planerar att komma åt flera Azure AI-tjänster under en enda slutpunkt/nyckel. För endast åtkomst till dokumentinformation skapar du en dokumentinformationsresurs. Observera att du behöver en resurs med en enda tjänst om du tänker använda Microsoft Entra-autentisering.

  • När resursen har distribuerats väljer du Gå till resurs. Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till API:et för dokumentinformation. Du klistrar in nyckeln och slutpunkten i koden senare i snabbstarten:

    Skärmbild av nycklar och slutpunktsplats i Azure Portal.

Konfigurera

Öppna ett terminalfönster i din lokala miljö och installera Azure AI Document Intelligence-klientbiblioteket för Python med pip:

pip install azure-ai-formrecognizer

Skapa ett nytt Python-program

Skapa ett nytt Python-program med namnet form_recognizer_quickstart.py i önskad redigerare eller IDE. Importera sedan följande bibliotek:

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

Skapa variabler för azure-resursens slutpunkt och nyckel

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

I det här läget bör Python-programmet innehålla följande kodrader:

import os
from azure.core.exceptions import ResourceNotFoundError
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

Välj ett kodexempel för att kopiera och klistra in i ditt program:

Viktigt!

Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i Säkerhet för Azure AI-tjänster.

Prova: Layoutmodell

  • I det här exemplet behöver du en dokumentfil på en URI. Du kan använda vårt exempeldokument för den här snabbstarten.
  • Vi har lagt till fil-URI-värdet i variabeln formUrl längst upp i filen.
  • Om du vill analysera en viss fil vid en URI använder begin_recognize_content_from_url du metoden .

Lägg till följande kod i layoutprogrammet på raden under variabeln key


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

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

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

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

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

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

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


if __name__ == "__main__":
    recognize_content()

Prova: Fördefinierad modell

Det här exemplet visar hur du analyserar data från vissa typer av vanliga dokument med förtränad modeller med hjälp av en faktura som exempel. Se vår fördefinierade konceptsida för en fullständig lista över fakturafält

  • I det här exemplet ska vi analysera ett fakturadokument med hjälp av en fördefinierad modell. Du kan använda vårt exempelfakturadokument för den här snabbstarten.
  • Vi har lagt till fil-URI-värdet i variabeln "formUrl" överst i filen.
  • Om du vill analysera en viss fil vid en URI använder du metoden ''begin_recognize_invoices_from_url'.
  • För enkelhetens skull visas inte alla fält som tjänsten returnerar här. Om du vill se listan över alla fält som stöds och motsvarande typer kan du läsa vår fakturakonceptsida.

Välj en fördefinierad modell

Du är inte begränsad till fakturor – det finns flera fördefinierade modeller att välja mellan, som var och en har en egen uppsättning fält som stöds. Vilken modell som ska användas för analysåtgärden beror på vilken typ av dokument som ska analyseras. Här är de fördefinierade modeller som för närvarande stöds av document intelligence-tjänsten:

  • Faktura: extraherar text, markeringar, tabeller, fält och nyckelinformation från fakturor.
  • Kvitto: extraherar text och nyckelinformation från kvitton.
  • ID-dokument: extraherar text och viktig information från körkort och internationella pass.
  • Visitkort: extraherar text och viktig information från visitkort.

Lägg till följande kod i ditt fördefinierade fakturaprogram under variabeln key


def recognize_invoice():

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

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

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

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


if __name__ == "__main__":
    recognize_invoice()

Köra ditt program

  1. Gå till den mapp där du har din form_recognizer_quickstart.py-fil .

  2. Skriv följande kommando i terminalen:

python form_recognizer_quickstart.py

| Referens för REST API | för dokumentinformation i Azure REST API |

I den här snabbstarten använder du följande API:er för att extrahera strukturerade data från formulär och dokument:

Förutsättningar

  • Azure-prenumeration – Skapa en kostnadsfritt

  • cURL installerat.

  • PowerShell version 6.0+ eller ett liknande kommandoradsprogram.

  • En Azure AI-tjänst eller dokumentinformationsresurs. När du har din Azure-prenumeration skapar du en dokumentinformationsresurs med en tjänst eller flera tjänster i Azure Portal för att hämta din nyckel och slutpunkt. Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.

    Dricks

    Skapa en Azure AI-tjänstresurs om du planerar att komma åt flera Azure AI-tjänster under en enda slutpunkt/nyckel. För endast åtkomst till dokumentinformation skapar du en dokumentinformationsresurs. Observera att du behöver en resurs med en enda tjänst om du tänker använda Microsoft Entra-autentisering.

  • När resursen har distribuerats väljer du Gå till resurs. Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till API:et för dokumentinformation. Du klistrar in nyckeln och slutpunkten i koden senare i snabbstarten:

    Skärmbild av nycklar och slutpunktsplats i Azure Portal.

Välj ett kodexempel för att kopiera och klistra in i ditt program:

Viktigt!

Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i Säkerhet för Azure AI-tjänster.

Prova: Layoutmodell

  • I det här exemplet behöver du en dokumentfil på en URI. Du kan använda vårt exempeldokument för den här snabbstarten.
  1. Ersätt {endpoint} med slutpunkten som du fick med din document intelligence-prenumeration.
  2. Ersätt {key} med nyckeln som du kopierade från föregående steg.
  3. Ersätt \"{your-document-url} med en exempeldokument-URL:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf

Förfrågan

curl -v -i POST "https://{endpoint}/formrecognizer/v2.1/layout/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{​​​​​​​'urlSource': '{your-document-url}'}​​​​​​​​"

Åtgärdsplats

Du får ett 202 (Success) svar som innehåller en rubrik för Åtgärd-plats . Värdet för det här huvudet innehåller ett resultat-ID som du kan använda för att fråga status för den asynkrona åtgärden och hämta resultatet:

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

I följande exempel, som en del av URL:en, är strängen efter analyzeResults/ resultat-ID:t.

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

Hämta layoutresultat

När du har anropat API:et Analysera layout anropar du API:et Get Analyze Layout Result FÖR att hämta status för åtgärden och extraherade data. Innan du kör kommandot gör du följande ändringar:

  1. Ersätt {endpoint} med slutpunkten som du fick med din document intelligence-prenumeration.
  2. Ersätt {key} med nyckeln som du kopierade från föregående steg.
  3. Ersätt {resultId} med resultat-ID:t från föregående steg.

Förfrågan

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

Granska resultaten

Du får ett 200 (success) svar med JSON-innehåll.

Se följande fakturabild och dess motsvarande JSON-utdata.

  • Noden "readResults" innehåller varje textrad med respektive placering av avgränsningsrutan på sidan.
  • Noden selectionMarks visar varje markeringsmarkering (kryssruta, alternativmarkering) och om dess status är selected eller unselected.
  • Avsnittet "pageResults" innehåller de tabeller som extraherats. För varje tabell extraheras text-, rad- och kolumnindex, rad- och kolumnintervall, avgränsningsruta med mera.

Contoso-projektuttrycksdokument med en tabell.

Själva svaret

Du kan visa fullständiga exempelutdata på GitHub.

Prova: Fördefinierad modell

  • I det här exemplet ska vi analysera ett fakturadokument med hjälp av en fördefinierad modell. Du kan använda vårt exempelfakturadokument för den här snabbstarten.

Välj en fördefinierad modell

Du är inte begränsad till fakturor – det finns flera fördefinierade modeller att välja mellan, som var och en har en egen uppsättning fält som stöds. Vilken modell som ska användas för analysåtgärden beror på vilken typ av dokument som ska analyseras. Här är de fördefinierade modeller som för närvarande stöds av document intelligence-tjänsten:

  • Faktura: extraherar text, markeringar, tabeller, fält och nyckelinformation från fakturor.
  • Kvitto: extraherar text och nyckelinformation från kvitton.
  • ID-dokument: extraherar text och viktig information från körkort och internationella pass.
  • Visitkort: extraherar text och viktig information från visitkort.

Innan du kör kommandot gör du följande ändringar:

  1. Ersätt {endpoint} med slutpunkten som du fick med din document intelligence-prenumeration.

  2. Ersätt {key} med nyckeln som du kopierade från föregående steg.

  3. Ersätt \"{your-document-url} med en exempelfaktura-URL:

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

Förfrågan

curl -v -i POST https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key:  {key}" --data-ascii "{​​​​​​​'urlSource': '{your invoice URL}'}​​​​​​​​"

Åtgärdsplats

Du får ett 202 (Success) svar som innehåller en rubrik för Åtgärd-plats . Värdet för det här huvudet innehåller ett resultat-ID som du kan använda för att fråga status för den asynkrona åtgärden och hämta resultatet:

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

I följande exempel, som en del av URL:en, är strängen efter analyzeResults/ resultat-ID:t:

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

Hämta fakturaresultat

När du har anropat API:et Analysera faktura anropar du API:et Hämta analysera fakturaresultat för att hämta status för åtgärden och extraherade data. Innan du kör kommandot gör du följande ändringar:

  1. Ersätt {endpoint} med slutpunkten som du fick med din dokumentinformationsnyckel. Du hittar den på fliken Översikt över dokumentinformationsresurs.
  2. Ersätt {resultId} med resultat-ID:t från föregående steg.
  3. Ersätt {key} med din nyckel.

Förfrågan

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

Granska svaret

Du får ett 200 (Success) svar med JSON-utdata.

  • Fältet "readResults" innehåller varje textrad som extraherades från fakturan.
  • Innehåller "pageResults" tabeller och markeringar som extraherats från fakturan.
  • Fältet "documentResults" innehåller nyckel-/värdeinformation för de mest relevanta delarna av fakturan.

Se exempelfakturadokumentet.

Själva svaret

Se fullständiga exempelutdata på GitHub.

Det är allt, bra gjort!

Nästa steg

  • Om du vill ha en förbättrad upplevelse och avancerad modellkvalitet kan du prova Document Intelligence Studio.

    • Studio stöder alla modeller som tränats med v2.1-märkta data.

    • Ändringsloggarna innehåller detaljerad information om migrering från v3.1 till v4.0.