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: v4.0 (förhandsversion) Tidigare versioner: v3.1 (GA) 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: v3.1 (GA) Tidigare versioner: v3.0 v2.1
- Kom igång med Azure Formigenkänning senaste GA-versionen (
2023-07-31
).
Det här innehållet gäller för: v3.0 (GA) Nyare version: v3.1 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-API-referenspaket | | (NuGet) | Exempel | som 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
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 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:
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:
Konfigurera
Starta Visual Studio.
På startsidan väljer du Skapa ett nytt projekt.
På sidan Skapa ett nytt projekt anger du konsolen i sökrutan. Välj mallen Konsolprogram och välj sedan Nästa.
- I dialogrutan Konfigurera det nya projektet anger du
doc_intel_quickstart
i rutan Projektnamn. Välj sedan Nästa.
- I dialogrutan Konfigurera det nya projektet anger du
form_recognizer_quickstart
i rutan Projektnamn. Välj sedan Nästa.
I dialogrutan Ytterligare information väljer du .NET 8.0 (långsiktigt stöd)och väljer sedan Skapa.
Installera klientbiblioteket med NuGet
Högerklicka på ditt doc_intel_quickstart projekt och välj Hantera NuGet-paket... .
Välj fliken Bläddra och skriv Azure.AI.DocumentIntelligence.
Markera kryssrutan
Include prerelease
.Välj en version från den nedrullningsbara menyn och installera paketet i projektet.
Högerklicka på ditt form_recognizer_quickstart projekt och välj Hantera NuGet-paket... .
Välj fliken Bläddra och skriv Azure.AI.FormRecognizer. Välj version 4.1.0 i listrutan
Högerklicka på ditt form_recognizer_quickstart projekt och välj Hantera NuGet-paket... .
Välj fliken Bläddra och skriv Azure.AI.FormRecognizer. Välj version 4.0.0 i listrutan
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.
Öppna filen Program.cs .
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 skickarprebuilt-layout
den som modell-ID. Det returnerade värdet är ettAnalyzeResult
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.
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.
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.
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 skickarprebuilt-invoice
den som modell-ID. Det returnerade värdet är ettAnalyzeResult
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.
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.
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.
Klientbibliotekets SDK-referens | REST API-referenspaket | (Maven) | Exempel |som stöds REST API-version |
Klientbibliotekets SDK-referens | REST API-referenspaket | (Maven) | Exempel| som stöds REST API-version |
Klientbibliotekets SDK-referens | REST API-referenspaket | (Maven) | Exempel|som 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:
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:
Java Development Kit (JDK) version 8 eller senare. Mer information finns i Microsoft Build of OpenJDK.
Gradle, version 6.8 eller senare.
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:
Konfigurera
Skapa ett nytt Gradle-projekt
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
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
Välj en DSL när du uppmanas till det och välj Kotlin.
Acceptera standardprojektets namn (doc-intel-app) genom att välja Retur eller Retur.
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
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
Välj en DSL när du uppmanas till det och välj Kotlin.
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
.
Kör följande kommando från katalogen doc-intel-app:
mkdir -p src/main/java
Du skapar följande katalogstruktur:
Navigera till
java
katalogen och skapa en fil med namnetDocIntelligence.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.
Öppna
DocIntelligence.java
-filen. Kopiera och klistra in något av följande kodexempel i ditt program:
Navigera till
java
katalogen och skapa en fil med namnetFormRecognizer.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.
Ö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 skickarprebuilt-layout
den som modell-ID. Det returnerade värdet är ettAnalyzeResult
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.
Skapa ditt program med
build
kommandot :gradle build
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.
Skapa ditt program med
build
kommandot :gradle build
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.
Skapa ditt program med
build
kommandot :gradle build
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 skickarPrebuiltModels.Invoice
den som modell-ID. Det returnerade värdet är ettresult
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.
Skapa ditt program med
build
kommandot :gradle build
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.
Skapa ditt program med
build
kommandot :gradle build
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.
Skapa ditt program med
build
kommandot :gradle build
Kör programmet med
run
kommandot :gradle run
REST API-referenspaket för klientbibliotek | (npm) | Exempel |som stöds REST API-version |
Klientbibliotekets SDK-referens | REST API-referenspaket | (npm) | Exempel |som stöds REST API-version |
Klientbibliotekets SDK-referens | REST API-referenspaket | (npm) | Exempel |som 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:
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:
Konfigurera
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
npm init
Kör kommandot för att initiera programmet och skapa en autogenerering av projektet.npm init
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.
ai-document-intelligence
Installera klientbiblioteket ochazure/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.
ai-form-recognizer
Installera klientbiblioteket ochazure/identity
npm-paketen:npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
- Appens
package.json
fil uppdateras med beroendena.
- Appens
ai-form-recognizer
Installera klientbiblioteket ochazure/identity
npm-paketen:npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
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
.
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 inprebuilt-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:
Gå till mappen där du har ditt dokumentinformationsprogram (doc-intel-app).
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:
Gå till mappen där du har ditt dokumentinformationsprogram (doc-intel-app).
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 skickarPrebuiltModels.Invoice
den som modell-ID. Det returnerade värdet är ettresult
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:
Gå till mappen där du har ditt dokumentinformationsprogram (doc-intel-app).
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:
Gå till mappen där du har ditt dokumentinformationsprogram (doc-intel-app).
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:
Gå till mappen där du har ditt dokumentinformationsprogram (doc-intel-app).
Skriv följande kommando i terminalen:
node index.js
Klientbibliotekets SDK-referens | REST API-referenspaket | (PyPi) | Exempel | som stöds REST API-version |
Klientbibliotekets SDK-referens | REST API-referenspaket | (PyPi) | Exempel | som stöds REST API-version |
Klientbibliotekets SDK-referens | REST API-referenspaket | (PyPi) | Exempel | som stöds REST API-version |
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-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.
- Python-installationen bör innehålla pip. Du kan kontrollera om du har pip installerat genom att köra
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:
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
.
Skapa en ny Python-fil med namnet doc_intel_quickstart.py i önskad redigerare eller IDE.
Ö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
.
Skapa en ny Python-fil med namnet form_recognizer_quickstart.py i önskad redigerare eller IDE.
Ö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:
Gå till mappen där du har din doc_intel_quickstart.py-fil .
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:
Gå till den mapp där du har din form_recognizer_quickstart.py-fil .
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:
Gå till den mapp där du har din form_recognizer_quickstart.py-fil .
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:
Gå till mappen där du har din doc_intel_quickstart.py-fil .
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:
Gå till den mapp där du har din form_recognizer_quickstart.py-fil .
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:
Gå till den mapp där du har din form_recognizer_quickstart.py-fil .
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
- Windows:
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:
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:
Ersätt
{endpoint}
med slutpunktsvärdet från din Azure Portal Document Intelligence-instans.Ersätt
{key}
med nyckelvärdet från din Azure Portal Document Intelligence-instans.Använd följande tabell som referens och ersätt
{modelID}
och{your-document-url}
med önskade värden.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:
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:
Ersätt
{resultID}
rubriken Operation-Location från POST-svaret.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
Om du vill ha en förbättrad upplevelse och avancerad modellkvalitet kan du prova Document Intelligence Studio
För migrering v3.1 till v4.0, se Migreringsguider för Ändringslogg.
Det här innehållet gäller för: v2.1 | Senaste version: 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:
Konfigurera
Starta Visual Studio 2019.
På startsidan väljer du Skapa ett nytt projekt.
På sidan Skapa ett nytt projekt anger du konsolen i sökrutan. Välj mallen Konsolprogram och välj sedan Nästa.
I dialogrutan Konfigurera det nya projektet anger du
formRecognizer_quickstart
i rutan Projektnamn. Välj sedan Nästa.I dialogrutan Ytterligare information väljer du .NET 5.0 (Aktuell) och väljer sedan Skapa.
Installera klientbiblioteket med NuGet
Högerklicka på ditt formRecognizer_quickstart projekt och välj Hantera NuGet-paket... .
Välj fliken Bläddra och skriv Azure.AI.FormRecognizer.
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
endpoint
och .
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.
Öppna filen Program.cs .
Inkludera följande med hjälp av direktiv:
using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
- Ange dina
endpoint
miljövariabler ochkey
skapa instansenAzureKeyCredential
ochFormRecognizerClient
:
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);
Ta bort raden
Console.Writeline("Hello World!");
, och lägg till ett av try it-kodexemplen i Program.cs fil: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.
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:
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
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
Välj en DSL när du uppmanas till det och välj Kotlin.
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:
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.
- Skapa ditt program med
build
kommandot :
gradle build
- 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:
Konfigurera
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
Kör kommandot
npm init
för att skapa ett nodprogram med enpackage.json
-fil.npm init
Installera npm-paketet för
ai-form-recognizer
klientbiblioteket:npm install @azure/ai-form-recognizer
Appens
package.json
fil uppdateras med beroendena.Skapa en fil med namnet
index.js
, öppna den och importera följande bibliotek:const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
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";
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-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.
- Python-installationen bör innehålla pip. Du kan kontrollera om du har pip installerat genom att köra
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:
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
Gå till den mapp där du har din form_recognizer_quickstart.py-fil .
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:
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.
- Ersätt
{endpoint}
med slutpunkten som du fick med din document intelligence-prenumeration. - Ersätt
{key}
med nyckeln som du kopierade från föregående steg. - 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:
- Ersätt
{endpoint}
med slutpunkten som du fick med din document intelligence-prenumeration. - Ersätt
{key}
med nyckeln som du kopierade från föregående steg. - 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 ärselected
ellerunselected
. - Avsnittet
"pageResults"
innehåller de tabeller som extraherats. För varje tabell extraheras text-, rad- och kolumnindex, rad- och kolumnintervall, avgränsningsruta med mera.
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:
Ersätt
{endpoint}
med slutpunkten som du fick med din document intelligence-prenumeration.Ersätt
{key}
med nyckeln som du kopierade från föregående steg.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:
- Ersätt
{endpoint}
med slutpunkten som du fick med din dokumentinformationsnyckel. Du hittar den på fliken Översikt över dokumentinformationsresurs. - Ersätt
{resultId}
med resultat-ID:t från föregående steg. - 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.
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.