Aan de slag met Document Intelligence
Belangrijk
- Azure Cognitive Services Form Recognizer is nu Azure AI Document Intelligence.
- Sommige platforms wachten nog steeds op de hernoemingsupdate.
- Alle vermeldingen van Form Recognizer of Document Intelligence in onze documentatie verwijzen naar dezelfde Azure-service.
Deze inhoud is van toepassing op: v4.0 (preview) eerdere versies: v3.1 (GA) v3.0 (GA)
- Aan de slag met de nieuwste preview-versie van Azure AI Document Intelligence (2024-07-31-preview).
Deze inhoud is van toepassing op: v3.1 (GA) Eerdere versies: v3.0 v2.1
- Aan de slag met de nieuwste GA-versie van Azure Form Recognizer (
2023-07-31
).
Deze inhoud is van toepassing op: v3.0 (GA) Nieuwere versie: v3.1 v2.1
- Aan de slag met de verouderde GA-versie van Azure Form Recognizer (
2022-08-31
).
Azure AI Document Intelligence/Form Recognizer is een Azure AI-cloudservice die machine learning gebruikt om sleutel-waardeparen, tekst, tabellen en sleutelgegevens uit uw documenten te extraheren.
U kunt documentverwerkingsmodellen eenvoudig integreren in uw werkstromen en toepassingen met behulp van een programmeertaal-SDK of het aanroepen van de REST API.
Voor deze quickstart raden we u aan de gratis service te gebruiken terwijl u de technologie leert. Houd er rekening mee dat het aantal gratis pagina's beperkt is tot 500 per maand.
Ga naar onze overzichtspagina voor meer informatie over de API-functies en ontwikkelopties.
Naslaginformatie over REST API-naslaginformatie over clientbibliotheek-SDK-referentiepakketvoorbeelden| | | | ondersteunde REST API-versie |
Api-referentiepakket | | voor clientbibliotheek-SDK | (NuGet) | -voorbeelden | ondersteunde REST API-versie
Naslaginformatie over REST API-naslaginformatie over clientbibliotheek-SDK-referentiepakketvoorbeelden | | | | ondersteunde REST API-versie |
In deze quickstart gebruikt u de volgende functies om gegevens en waarden uit formulieren en documenten te analyseren en te extraheren:
Indelingsmodel: tabellen, lijnen, woorden en selectiemarkeringen analyseren en extraheren, zoals keuzerondjes en selectievakjes in documenten, zonder dat u een model hoeft te trainen.
Vooraf samengesteld model: algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf samengesteld model.
Vereisten
Azure-abonnement: Maak een gratis abonnement aan.
De huidige versie van Visual Studio IDE.
Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een resource met één service of Azure AI voor meerdere services , in Azure Portal, om uw sleutel en eindpunt op te halen.
U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
Tip
Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.
Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:
Een Azure AI-services of Form Recognizer-resource. Zodra u uw Azure-abonnement hebt, maakt u een resource met één service of Azure AI voor meerdere services , in Azure Portal, om uw sleutel en eindpunt op te halen.
U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
Tip
Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Maak voor alleen Form Recognizer-toegang een Form Recognizer-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.
Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Form Recognizer-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:
Instellingen
Visual Studio starten.
Kies een nieuw project maken op de startpagina.
Voer op de pagina Een nieuw project maken de console in het zoekvak in. Kies de consoletoepassingssjabloon en kies vervolgens Volgende.
- Voer
doc_intel_quickstart
in het dialoogvenster Uw nieuwe project configureren het vak Projectnaam in. Kies vervolgens Volgende.
- Voer
form_recognizer_quickstart
in het dialoogvenster Uw nieuwe project configureren het vak Projectnaam in. Kies vervolgens Volgende.
Selecteer in het dialoogvenster Aanvullende informatie .NET 8.0 (langetermijnondersteuning) en selecteer vervolgens Maken.
De clientbibliotheek installeren met NuGet
Klik met de rechtermuisknop op uw doc_intel_quickstart project en selecteer NuGet-pakketten beheren... .
Selecteer het tabblad Bladeren en typ Azure.AI.DocumentIntelligence.
Schakel het
Include prerelease
selectievakje in.Kies een versie in het vervolgkeuzemenu en installeer het pakket in uw project.
Klik met de rechtermuisknop op uw form_recognizer_quickstart project en selecteer NuGet-pakketten beheren... .
Selecteer het tabblad Bladeren en typ Azure.AI.FormRecognizer. Selecteer versie 4.1.0 in de vervolgkeuzelijst
Klik met de rechtermuisknop op uw form_recognizer_quickstart project en selecteer NuGet-pakketten beheren... .
Selecteer het tabblad Bladeren en typ Azure.AI.FormRecognizer. Selecteer versie 4.0.0 in de vervolgkeuzelijst
Uw toepassing bouwen
Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentIntelligenceClient
klasse maken. Hiervoor maakt u een AzureKeyCredential
exemplaar met uw key
azure-portal en een DocumentIntelligenceClient
exemplaar met de AzureKeyCredential
en uw documentinformatie endpoint
.
Als u wilt communiceren met de Form Recognizer-service, moet u een exemplaar van de DocumentAnalysisClient
klasse maken. Hiervoor maakt u een AzureKeyCredential
met uw key
vanuit Azure Portal en een DocumentAnalysisClient
exemplaar met de AzureKeyCredential
en uw Form Recognizer endpoint
.
Notitie
- Vanaf .NET 6 genereren nieuwe projecten met behulp van de
console
sjabloon een nieuwe programmastijl die verschilt van eerdere versies. - De nieuwe uitvoer maakt gebruik van recente C#-functies die de code vereenvoudigen die u moet schrijven.
- Wanneer u de nieuwere versie gebruikt, hoeft u alleen de hoofdtekst van de
Main
methode te schrijven. U hoeft geen instructies op het hoogste niveau, globaal gebruik van instructies of impliciet gebruik van instructies op te nemen. - Zie Nieuwe C#-sjablonen voor meer informatie over het genereren van instructies op het hoogste niveau.
Open het Program.cs-bestand .
Verwijder de bestaande code, inclusief de regel
Console.Writeline("Hello World!")
, en selecteer een van de volgende codevoorbeelden om te kopiëren en plakken in het Program.cs bestand van uw toepassing:
Belangrijk
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.
Indelingsmodel
Extraheer tekst, selectiemarkeringen, tekststijlen, tabelstructuren en coördinaten van begrenzingsregio's uit documenten.
- In dit voorbeeld hebt u een documentbestand van een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
- We hebben de bestands-URI-waarde toegevoegd aan de
Uri fileUri
variabele boven aan het script. - Als u de indeling wilt extraheren uit een bepaald bestand op een URI, gebruikt u de
StartAnalyzeDocumentFromUri
methode en geeft u deze doorprebuilt-layout
als de model-id. De geretourneerde waarde is eenAnalyzeResult
object met gegevens uit het ingediende document.
Voeg het volgende codevoorbeeld toe aan het Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:
using Azure;
using Azure.AI.DocumentIntelligence;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
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}");
}
}
Uw toepassing uitvoeren
Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.
Voeg het volgende codevoorbeeld toe aan het Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:
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}'.");
}
}
Uw toepassing uitvoeren
Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.
Uitvoer van indelingsmodel
Hier volgt een fragment van de verwachte uitvoer:
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
Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het indelingsmodel weer te geven.
Voeg het volgende codevoorbeeld toe aan het Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:
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}'.");
}
}
Uw toepassing uitvoeren
Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.
Vooraf samengesteld model
Algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf samengesteld model. In dit voorbeeld analyseren we een factuur met behulp van het vooraf samengestelde factuurmodel .
Tip
U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat voor de analyze
bewerking moet worden gebruikt, is afhankelijk van het type document dat moet worden geanalyseerd. Zie modelgegevensextractie.
- Analyseer een factuur met behulp van het vooraf samengestelde factuurmodel. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
- We hebben de waarde van de bestands-URI toegevoegd aan de
Uri invoiceUri
variabele boven aan het Program.cs-bestand. - Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de
StartAnalyzeDocumentFromUri
methode en geeft u deze doorprebuilt-invoice
als de model-id. De geretourneerde waarde is eenAnalyzeResult
object met gegevens uit het ingediende document. - Ter vereenvoudiging worden alle sleutel-waardeparen die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .
Voeg het volgende codevoorbeeld toe aan uw Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:
using Azure;
using Azure.AI.DocumentIntelligence;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
//sample invoice document
Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");
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}");
}
}
Uw toepassing uitvoeren
Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.
Voeg het volgende codevoorbeeld toe aan uw Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:
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}");
}
}
}
Uw toepassing uitvoeren
Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.
Vooraf samengestelde modeluitvoer
Hier volgt een fragment van de verwachte uitvoer:
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
Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het vooraf gedefinieerde factuurmodel weer te geven.
Voeg het volgende codevoorbeeld toe aan uw Program.cs-bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:
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}");
}
}
}
Uw toepassing uitvoeren
Zodra u een codevoorbeeld aan uw toepassing hebt toegevoegd, kiest u de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of drukt u op F5.
Rest API-referentiepakket voor clientbibliotheek-SDK | | (Maven) | -voorbeelden |ondersteunde REST API-versie |
Rest API-referentiepakket voor clientbibliotheek-SDK | | (Maven) | -voorbeelden| ondersteunde REST API-versie |
Rest API-referentiepakket voor clientbibliotheek-SDK | | (Maven) | -voorbeelden|ondersteunde REST API-versie |
In deze quickstart gebruikt u de volgende functies om gegevens en waarden uit formulieren en documenten te analyseren en te extraheren:
Indeling: tabellen, lijnen, woorden en selectiemarkeringen analyseren en extraheren, zoals keuzerondjes en selectievakjes in documenten, zonder dat u een model hoeft te trainen.
Vooraf samengestelde factuur: algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf getraind model.
Vereisten
Azure-abonnement: Maak een gratis abonnement aan.
De nieuwste versie van Visual Studio Code of uw favoriete IDE. Zie Java in Visual Studio Code.
Tip
- Visual Studio Code biedt een Coderingspakket voor Java voor Windows en macOS. Het coderingspakket is een bundel VS Code, de Java Development Kit (JDK) en een verzameling voorgestelde extensies van Microsoft. Het coderingspakket kan ook worden gebruikt om een bestaande ontwikkelomgeving op te lossen.
- Als u VS Code en het Coderingspakket voor Java gebruikt, installeert u de Gradle voor Java-extensie.
Als u Visual Studio Code niet gebruikt, controleert u of het volgende is geïnstalleerd in uw ontwikkelomgeving:
Een Java Development Kit (JDK) versie 8 of hoger. Zie Microsoft Build van OpenJDK voor meer informatie.
Gradle, versie 6.8 of hoger.
Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services , in Azure Portal, om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.Tip
Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.
Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. Later plakt u uw sleutel en eindpunt in de code:
Instellingen
Een nieuw Gradle-project maken
Maak in het consolevenster (zoals cmd, PowerShell of Bash) een nieuwe map voor uw app met de naam doc-intel-app en navigeer ernaartoe.
mkdir doc-intel-app && doc-intel-app
mkdir doc-intel-app; cd doc-intel-app
Voer de opdracht
gradle init
uit vanuit uw werkmap. Met deze opdracht maakt u essentiële buildbestanden voor Gradle, waaronder build.gradle.kts, die tijdens runtime wordt gebruikt om uw toepassing te maken en te configureren.gradle init --type basic
Wanneer u wordt gevraagd om een DSL te kiezen, selecteert u Kotlin.
Accepteer de standaardprojectnaam (doc-intel-app) door Return of Enter te selecteren.
Maak in het consolevenster (zoals cmd, PowerShell of Bash) een nieuwe map voor uw app met de naam form-recognize-app en navigeer ernaartoe.
mkdir form-recognize-app && form-recognize-app
mkdir form-recognize-app; cd form-recognize-app
Voer de opdracht
gradle init
uit vanuit uw werkmap. Met deze opdracht maakt u essentiële buildbestanden voor Gradle, waaronder build.gradle.kts, die tijdens runtime wordt gebruikt om uw toepassing te maken en te configureren.gradle init --type basic
Wanneer u wordt gevraagd om een DSL te kiezen, selecteert u Kotlin.
Accepteer de standaardprojectnaam (form-recognize-app) door Return of Enter te selecteren.
De clientbibliotheek installeren
Deze quickstart maakt gebruik van de Gradle-afhankelijkheidsmanager. U vindt de clientbibliotheek en informatie voor andere afhankelijkheidsbeheerders in de Maven Central Repository.
Open het bestand build.gradle.kts van het project in uw IDE. Copay en voorbij de volgende code om de clientbibliotheek als instructie implementation
op te nemen, samen met de vereiste invoegtoepassingen en instellingen.
plugins {
java
application
}
application {
mainClass.set("DocIntelligence")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0-beta.4'
}
Deze quickstart maakt gebruik van de Gradle-afhankelijkheidsmanager. U vindt de clientbibliotheek en informatie voor andere afhankelijkheidsbeheerders in de Maven Central Repository.
Open het bestand build.gradle.kts van het project in uw IDE. Copay en voorbij de volgende code om de clientbibliotheek als instructie implementation
op te nemen, samen met de vereiste invoegtoepassingen en instellingen.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.1.0'
}
Deze quickstart maakt gebruik van de Gradle-afhankelijkheidsmanager. U vindt de clientbibliotheek en informatie voor andere afhankelijkheidsbeheerders in de Maven Central Repository.
Open het bestand build.gradle.kts van het project in uw IDE. Copay en voorbij de volgende code om de clientbibliotheek als instructie implementation
op te nemen, samen met de vereiste invoegtoepassingen en instellingen.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'
}
Een Java-toepassing maken
Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentIntelligenceClient
klasse maken. Hiervoor maakt u een AzureKeyCredential
exemplaar met uw key
azure-portal en een DocumentIntelligenceClient
exemplaar met de AzureKeyCredential
en uw documentinformatie endpoint
.
Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentAnalysisClient
klasse maken. Hiervoor maakt u een AzureKeyCredential
exemplaar met uw key
azure-portal en een DocumentAnalysisClient
exemplaar met de AzureKeyCredential
en uw documentinformatie endpoint
.
Voer vanuit de map doc-intel-app de volgende opdracht uit:
mkdir -p src/main/java
U maakt de volgende mapstructuur:
Navigeer naar de map en maak een bestand met de
java
naamDocIntelligence.java
.Tip
- U kunt een nieuw bestand maken met behulp van PowerShell.
- Open een PowerShell-venster in uw projectmap door Shift ingedrukt te houden en met de rechtermuisknop op de map te klikken.
- Typ de volgende opdracht new-item DocIntelligence.java.
Open het bestand
DocIntelligence.java
. Kopieer en plak een van de volgende codevoorbeelden in uw toepassing:
Navigeer naar de map en maak een bestand met de
java
naamFormRecognizer.java
.Tip
- U kunt een nieuw bestand maken met behulp van PowerShell.
- Open een PowerShell-venster in uw projectmap door Shift ingedrukt te houden en met de rechtermuisknop op de map te klikken.
- Typ de volgende opdracht new-item FormRecognizer.java.
Open het bestand
FormRecognizer.java
. Kopieer en plak een van de volgende codevoorbeelden in uw toepassing:
Belangrijk
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.
Indelingsmodel
Extraheer tekst, selectiemarkeringen, tekststijlen, tabelstructuren en coördinaten van begrenzingsregio's uit documenten.
- In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
- Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de
beginAnalyzeDocumentFromUrl
methode en geeft u deze doorprebuilt-layout
als de model-id. De geretourneerde waarde is eenAnalyzeResult
object met gegevens over het ingediende document. - We hebben de bestands-URI-waarde toegevoegd aan de
documentUrl
variabele in de hoofdmethode.
Voeg het volgende codevoorbeeld toe aan het DocIntelligence.java
bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:
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()));
}
}
De toepassing bouwen en uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: doc-intel-app.
Bouw uw toepassing met de
build
opdracht:gradle build
Voer uw toepassing uit met de
run
opdracht:gradle run
Voeg het volgende codevoorbeeld toe aan het FormRecognizer.java
bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:
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(", "));
}
}
De toepassing bouwen en uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: form-recognize-app.
Bouw uw toepassing met de
build
opdracht:gradle build
Voer uw toepassing uit met de
run
opdracht:gradle run
Uitvoer van indelingsmodel
Hier volgt een fragment van de verwachte uitvoer:
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.
Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het indelingsmodel weer te geven.
Voeg het volgende codevoorbeeld toe aan het FormRecognizer.java
bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:
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(", "));
}
}
De toepassing bouwen en uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: form-recognize-app.
Bouw uw toepassing met de
build
opdracht:gradle build
Voer uw toepassing uit met de
run
opdracht:gradle run
Vooraf samengesteld model
Algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf samengesteld model. In dit voorbeeld analyseren we een factuur met behulp van het vooraf samengestelde factuurmodel .
Tip
U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat voor de analyze
bewerking moet worden gebruikt, is afhankelijk van het type document dat moet worden geanalyseerd. Zie modelgegevensextractie.
- Analyseer een factuur met behulp van het vooraf samengestelde factuurmodel. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
- We hebben de waarde van de bestands-URL toegevoegd aan de
invoiceUrl
variabele boven aan het bestand. - Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de
beginAnalyzeDocuments
methode en geeft u deze doorPrebuiltModels.Invoice
als de model-id. De geretourneerde waarde is eenresult
object met gegevens over het ingediende document. - Ter vereenvoudiging worden alle sleutel-waardeparen die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .
Voeg het volgende codevoorbeeld toe aan het DocIntelligence.java
bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:
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());
}
}
}));
}
}
}
}
}
}
De toepassing bouwen en uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: doc-intel-app.
Bouw uw toepassing met de
build
opdracht:gradle build
Voer uw toepassing uit met de
run
opdracht:gradle run
Voeg het volgende codevoorbeeld toe aan het FormRecognizer.java
bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:
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());
}
}
}));
}
}
}
}
}
De toepassing bouwen en uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: doc-intel-app.
Bouw uw toepassing met de
build
opdracht:gradle build
Voer uw toepassing uit met de
run
opdracht:gradle run
Vooraf samengestelde modeluitvoer
Hier volgt een fragment van de verwachte uitvoer:
----------- 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
Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het vooraf gedefinieerde factuurmodel weer te geven.
Voeg het volgende codevoorbeeld toe aan het FormRecognizer.java
bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:
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());
}
}
}));
}
}
}
}
}
De toepassing bouwen en uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, gaat u terug naar de hoofdmap van het project: doc-intel-app.
Bouw uw toepassing met de
build
opdracht:gradle build
Voer uw toepassing uit met de
run
opdracht:gradle run
Rest API-referentiepakket voor clientbibliotheek | (npm) | Voorbeelden |ondersteunde REST API-versie |
Rest API-referentiepakket voor clientbibliotheek-SDK | | (npm) | Voorbeelden |ondersteunde REST API-versie |
Rest API-referentiepakket voor clientbibliotheek-SDK | | (npm) | Voorbeelden |ondersteunde REST API-versie |
In deze quickstart gebruikt u de volgende functies om gegevens en waarden uit formulieren en documenten te analyseren en te extraheren:
Indeling: tabellen, lijnen, woorden en selectiemarkeringen analyseren en extraheren, zoals keuzerondjes en selectievakjes in documenten, zonder dat u een model hoeft te trainen.
Vooraf samengestelde factuur: algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf getraind factuurmodel.
Vereisten
Azure-abonnement: Maak een gratis abonnement aan.
De nieuwste versie van Visual Studio Code of uw favoriete IDE. Zie Node.js in Visual Studio Code voor meer informatie.
De nieuwste
LTS
versie van Node.js.Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services , in Azure Portal, om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.Tip
Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.
Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:
Instellingen
Maak een nieuwe Node.js Express-toepassing: maak en navigeer in een consolevenster (zoals cmd, PowerShell of Bash) naar een nieuwe map voor uw app met de naam
doc-intel-app
.mkdir doc-intel-app && cd doc-intel-app
Voer de
npm init
opdracht uit om de toepassing te initialiseren en uw project te initialiseren.npm init
Geef de kenmerken van uw project op met behulp van de prompts die worden weergegeven in de terminal.
- De belangrijkste kenmerken zijn naam, versienummer en toegangspunt.
- U wordt aangeraden de naam van het toegangspunt op te geven
index.js
. De beschrijving, testopdracht, GitHub-opslagplaats, trefwoorden, auteurs en licentiegegevens zijn optionele kenmerken. Ze kunnen voor dit project worden overgeslagen. - Accepteer de suggesties tussen haakjes door Return of Enter te selecteren.
- Nadat u de aanwijzingen hebt voltooid, wordt er een
package.json
bestand gemaakt in de map doc-intel-app.
Installeer de
ai-document-intelligence
clientbibliotheek enazure/identity
npm-pakketten:npm i @azure-rest/ai-document-intelligence@1.0.0-beta.3 @azure/core-auth
Het
package.json
-bestand van uw app wordt bijgewerkt met de afhankelijkheden.
Installeer de
ai-form-recognizer
clientbibliotheek enazure/identity
npm-pakketten:npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
- Het
package.json
-bestand van uw app wordt bijgewerkt met de afhankelijkheden.
- Het
Installeer de
ai-form-recognizer
clientbibliotheek enazure/identity
npm-pakketten:npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
Maak een bestand met de naam
index.js
in de toepassingsmap.Tip
- U kunt een nieuw bestand maken met behulp van PowerShell.
- Open een PowerShell-venster in uw projectmap door Shift ingedrukt te houden en met de rechtermuisknop op de map te klikken.
- Typ de volgende opdracht New-Item index.js.
Uw toepassing bouwen
Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentIntelligenceClient
klasse maken. Hiervoor maakt u een AzureKeyCredential
exemplaar met uw key
azure-portal en een DocumentIntelligenceClient
exemplaar met de AzureKeyCredential
en uw documentinformatie endpoint
.
Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentAnalysisClient
klasse maken. Hiervoor maakt u een AzureKeyCredential
met uw key
vanuit Azure Portal en een DocumentAnalysisClient
exemplaar met de AzureKeyCredential
en uw Form Recognizer endpoint
.
Open het
index.js
bestand in Visual Studio Code of uw favoriete IDE. Kopieer en plak een van de volgende codevoorbeelden in uw toepassing:
Belangrijk
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.
Indelingsmodel
Extraheer tekst, selectiemarkeringen, tekststijlen, tabelstructuren en coördinaten van begrenzingsregio's uit documenten.
- In dit voorbeeld hebt u een documentbestand van een URL nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
- We hebben de waarde van de bestands-URL toegevoegd aan de
formUrl
variabele boven aan het bestand.- Als u een bepaald bestand wilt analyseren op basis van een URL, gebruikt u de
beginAnalyzeDocuments
methode en geeft u deze doorprebuilt-layout
als de model-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);
});
Uw toepassing uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, voert u het volgende uit:
Navigeer naar de map met uw Document Intelligence-toepassing (doc-intel-app).
Typ de volgende opdracht in uw terminal:
node index.js
Voeg het volgende codevoorbeeld toe aan het index.js
bestand. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:
const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
async function main() {
const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-layout", formUrl);
const {
pages,
tables
} = await poller.pollUntilDone();
if (pages.length <= 0) {
console.log("No pages were extracted from the document.");
} else {
console.log("Pages:");
for (const page of pages) {
console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
console.log(` ${page.width}x${page.height}, angle: ${page.angle}`);
console.log(` ${page.lines.length} lines, ${page.words.length} words`);
}
}
if (tables.length <= 0) {
console.log("No tables were extracted from the document.");
} else {
console.log("Tables:");
for (const table of tables) {
console.log(
`- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
);
}
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Uw toepassing uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, voert u het volgende uit:
Navigeer naar de map met uw Document Intelligence-toepassing (doc-intel-app).
Typ de volgende opdracht in uw terminal:
node index.js
Uitvoer van indelingsmodel
Hier volgt een fragment van de verwachte uitvoer:
Pages:
- Page 1 (unit: inch)
8.5x11, angle: 0
69 lines, 425 words
Tables:
- Extracted table: 3 columns, 5 rows (15 cells)
Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het indelingsmodel weer te geven.
Vooraf samengesteld model
In dit voorbeeld analyseren we een factuur met behulp van het vooraf samengestelde factuurmodel .
Tip
U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat voor de analyze
bewerking moet worden gebruikt, is afhankelijk van het type document dat moet worden geanalyseerd. Zie modelgegevensextractie.
- Analyseer een factuur met behulp van het vooraf samengestelde factuurmodel. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
- We hebben de waarde van de bestands-URL toegevoegd aan de
invoiceUrl
variabele boven aan het bestand. - Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de
beginAnalyzeDocuments
methode en geeft u deze doorPrebuiltModels.Invoice
als de model-id. De geretourneerde waarde is eenresult
object met gegevens over het ingediende document. - Ter vereenvoudiging worden alle sleutel-waardeparen die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .
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);
});
Uw toepassing uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, voert u het volgende uit:
Navigeer naar de map met uw Document Intelligence-toepassing (doc-intel-app).
Typ de volgende opdracht in uw terminal:
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);
});
Uw toepassing uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, voert u het volgende uit:
Navigeer naar de map met uw Document Intelligence-toepassing (doc-intel-app).
Typ de volgende opdracht in uw terminal:
node index.js
Vooraf samengestelde modeluitvoer
Hier volgt een fragment van de verwachte uitvoer:
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
Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het vooraf gedefinieerde factuurmodel weer te geven.
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);
});
Uw toepassing uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, voert u het volgende uit:
Navigeer naar de map met uw Document Intelligence-toepassing (doc-intel-app).
Typ de volgende opdracht in uw terminal:
node index.js
Rest API-referentiepakket voor clientbibliotheek-SDK | | (PyPi) | -voorbeelden | ondersteunde REST API-versie |
Rest API-referentiepakket voor clientbibliotheek-SDK | | (PyPi) | -voorbeelden | ondersteunde REST API-versie |
Rest API-referentiepakket voor clientbibliotheek-SDK | | (PyPi) | -voorbeelden | ondersteunde REST API-versie |
In deze quickstart gebruikt u de volgende functies om gegevens uit formulieren en documenten te analyseren en te extraheren:
Indeling: tabellen, lijnen, woorden en selectiemarkeringen analyseren en extraheren, zoals keuzerondjes en selectievakjes, en sleutel-waardeparen, zonder dat u een model hoeft te trainen.
Vooraf samengestelde factuur: algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf getraind model.
Vereisten
Azure-abonnement: Maak een gratis abonnement aan.
-
- Uw Python-installatie moet pip bevatten. U kunt controleren of pip is geïnstalleerd door op de opdrachtregel uit te voeren
pip --version
. Haal pip op door de nieuwste versie van Python te installeren.
- Uw Python-installatie moet pip bevatten. U kunt controleren of pip is geïnstalleerd door op de opdrachtregel uit te voeren
De nieuwste versie van Visual Studio Code of uw favoriete IDE. Zie Aan de slag met Python in Visual Studio Code voor meer informatie.
Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services , in Azure Portal, om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
Tip
Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.
Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:
Instellingen
Open een terminalvenster in uw lokale omgeving en installeer de Azure AI Document Intelligence-clientbibliotheek voor Python met 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
Uw Python-toepassing maken
Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentIntelligenceClient
klasse maken. Hiervoor maakt u een AzureKeyCredential
exemplaar met uw key
azure-portal en een DocumentIntelligenceClient
exemplaar met de AzureKeyCredential
en uw documentinformatie endpoint
.
Maak een nieuw Python-bestand met de naam doc_intel_quickstart.py in uw favoriete editor of IDE.
Open het bestand doc_intel_quickstart.py en selecteer een van de volgende codevoorbeelden om in uw toepassing te kopiëren en plakken:
Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de DocumentAnalysisClient
klasse maken. Hiervoor maakt u een AzureKeyCredential
exemplaar met uw key
azure-portal en een DocumentAnalysisClient
exemplaar met de AzureKeyCredential
en uw documentinformatie endpoint
.
Maak een nieuw Python-bestand met de naam form_recognizer_quickstart.py in uw favoriete editor of IDE.
Open het bestand form_recognizer_quickstart.py en selecteer een van de volgende codevoorbeelden om in uw toepassing te kopiëren en plakken:
Belangrijk
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.
Indelingsmodel
Extraheer tekst, selectiemarkeringen, tekststijlen, tabelstructuren en coördinaten van begrenzingsregio's uit documenten.
- In dit voorbeeld hebt u een documentbestand van een URL nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
- We hebben de waarde van de bestands-URL toegevoegd aan de
formUrl
variabele in deanalyze_layout
functie.
Voeg het volgende codevoorbeeld toe aan uw doc_intel_quickstart.py toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:
# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
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()
De toepassing uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:
Navigeer naar de map waar u het doc_intel_quickstart.py-bestand hebt.
Typ de volgende opdracht in uw terminal:
python doc_intel_quickstart.py
Als u een bepaald bestand op een URL wilt analyseren, gebruikt u de begin_analyze_document_from_url
methode en geeft u deze door prebuilt-layout
als de model-id. De geretourneerde waarde is een result
object met gegevens over het ingediende document.
Voeg het volgende codevoorbeeld toe aan uw form_recognizer_quickstart.py-toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:
# 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()
De toepassing uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:
Navigeer naar de map waar u uw form_recognizer_quickstart.py-bestand hebt.
Typ de volgende opdracht in uw terminal:
python form_recognizer_quickstart.py
Uitvoer van indelingsmodel
Hier volgt een fragment van de verwachte uitvoer:
----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
Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het indelingsmodel weer te geven.
Voeg het volgende codevoorbeeld toe aan uw form_recognizer_quickstart.py-toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:
# 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()
De toepassing uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:
Navigeer naar de map waar u uw form_recognizer_quickstart.py-bestand hebt.
Typ de volgende opdracht in uw terminal:
python form_recognizer_quickstart.py
Vooraf samengesteld model
Algemene velden analyseren en extraheren uit specifieke documenttypen met behulp van een vooraf samengesteld model. In dit voorbeeld analyseren we een factuur met behulp van het vooraf samengestelde factuurmodel .
Tip
U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat voor de analyze
bewerking moet worden gebruikt, is afhankelijk van het type document dat moet worden geanalyseerd. Zie modelgegevensextractie.
- Analyseer een factuur met behulp van het vooraf samengestelde factuurmodel. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
- We hebben de waarde van de bestands-URL toegevoegd aan de
invoiceUrl
variabele boven aan het bestand. - Ter vereenvoudiging worden alle sleutel-waardeparen die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .
Voeg het volgende codevoorbeeld toe aan uw doc_intel_quickstart.py toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal:
# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
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()
De toepassing uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:
Navigeer naar de map waar u het doc_intel_quickstart.py-bestand hebt.
Typ de volgende opdracht in uw terminal:
python doc_intel_quickstart.py
Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de begin_analyze_document_from_url
methode en geeft u deze door prebuilt-invoice
als de model-id. De geretourneerde waarde is een result
object met gegevens over het ingediende document.
Voeg het volgende codevoorbeeld toe aan uw form_recognizer_quickstart.py-toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:
# 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()
De toepassing uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:
Navigeer naar de map waar u uw form_recognizer_quickstart.py-bestand hebt.
Typ de volgende opdracht in uw terminal:
python form_recognizer_quickstart.py
Vooraf samengestelde modeluitvoer
Hier volgt een fragment van de verwachte uitvoer:
--------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
Als u de volledige uitvoer wilt bekijken, gaat u naar de opslagplaats met Azure-voorbeelden op GitHub om de uitvoer van het vooraf gedefinieerde factuurmodel weer te geven.
Voeg het volgende codevoorbeeld toe aan uw form_recognizer_quickstart.py-toepassing. Zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Azure Portal Form Recognizer-exemplaar:
# 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()
De toepassing uitvoeren
Nadat u een codevoorbeeld aan uw toepassing hebt toegevoegd, bouwt en voert u het programma uit:
Navigeer naar de map waar u uw form_recognizer_quickstart.py-bestand hebt.
Typ de volgende opdracht in uw terminal:
python form_recognizer_quickstart.py
In deze quickstart leert u hoe u de Document Intelligence REST API gebruikt om gegevens en waarden uit documenten te analyseren en te extraheren:
Vereisten
Azure-abonnement: Krijg een gratis abonnement
curl-opdrachtregelprogramma geïnstalleerd.
PowerShell-versie 7.*+ (of een vergelijkbare opdrachtregeltoepassing.):
Als u uw PowerShell-versie wilt controleren, typt u de volgende opdracht ten opzichte van uw besturingssysteem:
- Windows:
Get-Host | Select-Object Version
- macOS of Linux:
$PSVersionTable
- Windows:
Een Document Intelligence-resource (één service) of Azure AI-services (meerdere services). Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services , in Azure Portal, om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
Tip
Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.
Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:
Documenten analyseren en resultaten ophalen
Een POST-aanvraag wordt gebruikt voor het analyseren van documenten met een vooraf samengesteld of aangepast model. Een GET-aanvraag wordt gebruikt om het resultaat van een documentanalyseoproep op te halen. De modelId
wordt gebruikt met POST en resultId
met GET-bewerkingen.
Document analyseren (POST-aanvraag)
Voordat u de cURL-opdracht uitvoert, moet u de volgende wijzigingen aanbrengen in de postaanvraag:
Vervang
{endpoint}
door de eindpuntwaarde van uw Document Intelligence-exemplaar in Azure Portal.Vervang
{key}
door de sleutelwaarde van uw Document Intelligence-exemplaar in Azure Portal.Gebruik de volgende tabel als verwijzing en vervang
{modelID}
deze{your-document-url}
door de gewenste waarden.U hebt een documentbestand nodig op een URL. Voor deze quickstart kunt u de voorbeeldformulieren in de volgende tabel gebruiken voor elke functie:
Voorbeelddocumenten
Functie | {modelID} | {your-document-url} |
---|---|---|
Lezen | vooraf gedefinieerde leesbewerking | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
Indeling | vooraf gedefinieerde indeling | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
Zorgverzekeringskaart | 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 |
Factuur | vooraf samengestelde factuur | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Kwitantie | vooraf samengestelde ontvangstbevestiging | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Id-document | vooraf samengesteld-idDocument | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Voorbeelddocumenten
Functie | {modelID} | {your-document-url} |
---|---|---|
Algemeen document | vooraf samengesteld document | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf |
Lezen | vooraf gedefinieerde leesbewerking | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
Indeling | vooraf gedefinieerde indeling | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
Zorgverzekeringskaart | 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 |
Factuur | vooraf samengestelde factuur | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Kwitantie | vooraf samengestelde ontvangstbevestiging | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Id-document | vooraf samengesteld-idDocument | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Visitekaartje | vooraf samengestelde businessCard | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg |
Belangrijk
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.
POST-aanvraag
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-antwoord (resultID)
U ontvangt een 202 (Success)
antwoord met een alleen-lezen bewerkingslocatieheader . De waarde van deze header bevat een resultID
query die kan worden uitgevoerd om de status van de asynchrone bewerking op te halen en de resultaten op te halen met behulp van een GET-aanvraag met dezelfde resourceabonnementssleutel:
Resultaten analyseren ophalen (GET-aanvraag)
Nadat u de Analyze document
API hebt aangeroepen, roept u de get analyze result-API aan om de status van de bewerking en de geëxtraheerde gegevens op te halen. Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:
Nadat u de Analyze document
API hebt aangeroepen, roept u de get analyze result-API aan om de status van de bewerking en de geëxtraheerde gegevens op te halen. Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:
Nadat u de Analyze document
API hebt aangeroepen, roept u de get analyze result-API aan om de status van de bewerking en de geëxtraheerde gegevens op te halen. Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:
Vervang
{resultID}
de header Operation-Location van het POST-antwoord.Vervang
{key}
door de sleutelwaarde van uw Document Intelligence-exemplaar in Azure Portal.
GET-aanvraag
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}"
Het antwoord bekijken
U ontvangt een 200 (Success)
antwoord met JSON-uitvoer. Het eerste veld, "status"
, geeft de status van de bewerking aan. Als de bewerking niet is voltooid, is de waarde "status"
of "running"
"notStarted"
, en moet u de API opnieuw aanroepen, handmatig of via een script. Een interval van één seconde of meer tussen oproepen wordt aanbevolen.
Voorbeeldantwoord voor vooraf gedefinieerde factuur
{
"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
}
}],
}]
}
}
Ondersteunde documentvelden
Met de vooraf gedefinieerde modellen worden vooraf gedefinieerde sets documentvelden geëxtraheerd. Zie Modelgegevensextractie voor geëxtraheerde veldnamen, typen, beschrijvingen en voorbeelden.
Dat is het, gefeliciteerd!
In deze quickstart hebt u een document Intelligence-model gebruikt om verschillende formulieren en documenten te analyseren. Bekijk vervolgens de Document Intelligence Studio en referentiedocumentatie voor uitgebreide informatie over de Document Intelligence-API.
Volgende stappen
Probeer Document Intelligence Studio voor een verbeterde ervaring en geavanceerde modelkwaliteit
Zie changelog-migratiehandleidingen voor migratie van v3.1 naar v4.0.
Deze inhoud is van toepassing op: v2.1 | Nieuwste versie: v4.0 (preview)
Ga aan de slag met Azure AI Document Intelligence met behulp van de programmeertaal van uw keuze of de REST API. Document Intelligence is een cloudgebaseerde Azure AI-service die machine learning gebruikt om sleutel-waardeparen, tekst en tabellen uit uw documenten te extraheren. U wordt aangeraden de gratis service te gebruiken wanneer u de technologie leert. Houd er rekening mee dat het aantal gratis pagina's beperkt is tot 500 per maand.
Ga naar onze overzichtspagina voor meer informatie over documentinformatiefuncties en ontwikkelingsopties.
Referentiedocumentatie | Broncode van bibliotheek | Pakket (NuGet) | Voorbeelden
In deze quickstart gebruikt u de volgende API's om gestructureerde gegevens uit formulieren en documenten te extraheren:
Vereisten
Azure-abonnement: Maak een gratis abonnement aan.
De huidige versie van Visual Studio IDE.
Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services in Azure Portal om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.Tip
Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.
Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:
Instellingen
Start Visual Studio 2019.
Kies een nieuw project maken op de startpagina.
Voer op de pagina Een nieuw project maken de console in het zoekvak in. Kies de consoletoepassingssjabloon en kies vervolgens Volgende.
Voer
formRecognizer_quickstart
in het dialoogvenster Uw nieuwe project configureren het vak Projectnaam in. Kies vervolgens Volgende.Selecteer in het dialoogvenster Aanvullende informatie .NET 5.0 (Huidig) en selecteer Vervolgens Maken.
De clientbibliotheek installeren met NuGet
Klik met de rechtermuisknop op uw formRecognizer_quickstart project en selecteer NuGet-pakketten beheren... .
Selecteer het tabblad Bladeren en typ Azure.AI.FormRecognizer.
Selecteer versie 3.1.1 in de vervolgkeuzelijst en selecteer Installeren.
Uw toepassing bouwen
Als u wilt communiceren met de Document Intelligence-service, moet u een exemplaar van de FormRecognizerClient
klasse maken. Hiervoor maakt u een AzureKeyCredential
met uw sleutel en een FormRecognizerClient
exemplaar met de AzureKeyCredential
en uw documentinformatie endpoint
.
Notitie
- Vanaf .NET 6 genereren nieuwe projecten met behulp van de
console
sjabloon een nieuwe programmastijl die verschilt van eerdere versies. - De nieuwe uitvoer maakt gebruik van recente C#-functies die de code vereenvoudigen die u moet schrijven.
- Wanneer u de nieuwere versie gebruikt, hoeft u alleen de hoofdtekst van de
Main
methode te schrijven. U hoeft geen instructies op het hoogste niveau, globaal gebruik van instructies of impliciet gebruik van instructies op te nemen. - Zie Nieuwe C#-sjablonen voor meer informatie over het genereren van instructies op het hoogste niveau.
Open het Program.cs-bestand .
Neem de volgende gebruiksrichtlijnen op:
using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
- Stel uw
endpoint
enkey
omgevingsvariabelen in en maak uwAzureKeyCredential
enFormRecognizerClient
exemplaar:
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);
Verwijder de regel
Console.Writeline("Hello World!");
en voeg een van de Codevoorbeelden uitproberen toe aan Program.cs bestand:Selecteer een codevoorbeeld dat u wilt kopiëren en plakken in de main-methode van uw toepassing:
Belangrijk
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie het beveiligingsartikel over Azure AI-services voor meer informatie.
Probeer het: Indelingsmodel
Extraheer tekst, selectiemarkeringen, tekststijlen en tabelstructuren, samen met de bijbehorende begrenzingsregiocoördinaten uit documenten.
- In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
- We hebben de waarde van de bestands-URI toegevoegd aan de
formUri
variabele. - Als u de indeling wilt extraheren uit een bepaald bestand op een URI, gebruikt u de
StartRecognizeContentFromUriAsync
methode.
Voeg de volgende code toe aan uw indelingstoepassing Program.cs bestand:
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}'.");
}
}
}
}
}
}
Probeer het: Vooraf samengesteld model
In dit voorbeeld ziet u hoe u gegevens van bepaalde typen algemene documenten kunt analyseren met vooraf getrainde modellen, met behulp van een factuur als voorbeeld.
- In dit voorbeeld analyseren we een factuurdocument met behulp van een vooraf samengesteld model. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
- We hebben de bestands-URI-waarde toegevoegd aan de
invoiceUri
variabele boven aan de Main-methode. - Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de
StartRecognizeInvoicesFromUriAsync
methode. - Ter vereenvoudiging worden alle velden die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .
Een vooraf samengesteld model kiezen
U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat moet worden gebruikt voor de analysebewerking, is afhankelijk van het type document dat moet worden geanalyseerd. Dit zijn de vooraf gedefinieerde modellen die momenteel worden ondersteund door de Document Intelligence-service:
- Factuur: extraheert tekst, selectiemarkeringen, tabellen, velden en sleutelgegevens uit facturen.
- Ontvangstbewijs: extraheert tekst en belangrijke informatie uit ontvangstbevestigingen.
- Id-document: extraheert tekst en belangrijke informatie uit rijbewijs en internationale paspoorten.
- Visitekaartje: extraheert tekst en belangrijke informatie uit visitekaartjes.
Voeg de volgende code toe aan de vooraf gemaakte factuurtoepassing Program.cs bestandsmethode
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}");
}
}
}
}
}
Uw toepassing uitvoeren
Kies de groene startknop naast formRecognizer_quickstart om uw programma te bouwen en uit te voeren, of druk op F5.
Referentiedocumentatie | Broncode van bibliotheek | Pakket (Maven) | Voorbeelden
In deze quickstart gebruikt u de volgende API's om gestructureerde gegevens uit formulieren en documenten te extraheren:
Vereisten
Azure-abonnement: Maak een gratis abonnement aan.
Een Java Development Kit (JDK) versie 8 of hoger. Zie ondersteunde Java-versies en updateplanning voor meer informatie.
Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services in Azure Portal om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:
Instellingen
Een nieuw Gradle-project maken
Maak in een consolevenster (zoals cmd, PowerShell of Bash) een nieuwe map voor uw app met de naam form-recognizer-app en navigeer ernaartoe.
mkdir form-recognizer-app && form-recognizer-app
Voer de opdracht
gradle init
uit vanuit uw werkmap. Met deze opdracht maakt u essentiële buildbestanden voor Gradle, waaronder build.gradle.kts, die tijdens runtime wordt gebruikt om uw toepassing te maken en te configureren.gradle init --type basic
Wanneer u wordt gevraagd om een DSL te kiezen, selecteert u Kotlin.
Accepteer de standaardprojectnaam (form-recognizer-app)
De clientbibliotheek installeren
Deze quickstart maakt gebruik van de Gradle-afhankelijkheidsmanager. U vindt de clientbibliotheek en informatie voor andere afhankelijkheidsbeheerders in de Maven Central Repository.
Zorg ervoor dat u in het bestand build.gradle.kts de clientbibliotheek opneemt als een implementation
-instructie, samen met de vereiste invoegtoepassen en instellingen.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}
Een Java-bestand maken
Voer de volgende opdracht uit vanuit uw werkmap:
mkdir -p src/main/java
U maakt de volgende mapstructuur:
Navigeer naar de Java-map en maak een bestand met de naam FormRecognizer.java. Open deze in uw favoriete editor of IDE en voeg de volgende pakketdeclaratie en import
-instructies toe:
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;
Selecteer een codevoorbeeld dat u wilt kopiëren en plakken in de hoofdmethode van uw toepassing:
Belangrijk
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.
Probeer het: Indelingsmodel
Extraheer tekst, selectiemarkeringen, tekststijlen en tabelstructuren, samen met de bijbehorende begrenzingsregiocoördinaten uit documenten.
- In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
- Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de
beginRecognizeContentFromUrl
methode. - We hebben de bestands-URI-waarde toegevoegd aan de
formUrl
variabele in de hoofdmethode.
Werk de FormRecognizer-klasse van uw toepassing bij met de volgende code (zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal):
static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
public static void main(String[] args) {FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder()
.credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();
String formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
System.out.println("Get form content...");
GetContent(recognizerClient, formUrl);
}
private static void GetContent(FormRecognizerClient recognizerClient, String invoiceUri) {
String analyzeFilePath = invoiceUri;
SyncPoller<FormRecognizerOperationResult, List<FormPage>> recognizeContentPoller = recognizerClient
.beginRecognizeContentFromUrl(analyzeFilePath);
List<FormPage> contentResult = recognizeContentPoller.getFinalResult();
// </snippet_getcontent_call>
// <snippet_getcontent_print>
contentResult.forEach(formPage -> {
// Table information
System.out.println("----Recognizing content ----");
System.out.printf("Has width: %f and height: %f, measured with unit: %s.%n", formPage.getWidth(),
formPage.getHeight(), formPage.getUnit());
formPage.getTables().forEach(formTable -> {
System.out.printf("Table has %d rows and %d columns.%n", formTable.getRowCount(),
formTable.getColumnCount());
formTable.getCells().forEach(formTableCell -> {
System.out.printf("Cell has text %s.%n", formTableCell.getText());
});
System.out.println();
});
});
}
Probeer het: Vooraf samengesteld model
In dit voorbeeld ziet u hoe u gegevens van bepaalde typen algemene documenten kunt analyseren met vooraf getrainde modellen, met behulp van een factuur als voorbeeld.
- In dit voorbeeld analyseren we een factuurdocument met behulp van een vooraf samengesteld model. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
- Als u een bepaald bestand wilt analyseren op een URI, gebruikt u de
beginRecognizeInvoicesFromUrl
. - We hebben de bestands-URI-waarde toegevoegd aan de
invoiceUrl
variabele in de hoofdmethode. - Ter vereenvoudiging worden alle velden die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .
Een vooraf samengesteld model kiezen
U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat moet worden gebruikt voor de analysebewerking, is afhankelijk van het type document dat moet worden geanalyseerd. Dit zijn de vooraf gedefinieerde modellen die momenteel worden ondersteund door de Document Intelligence-service:
- Factuur: extraheert tekst, selectiemarkeringen, tabellen, velden en sleutelgegevens uit facturen.
- Ontvangstbewijs: extraheert tekst en belangrijke informatie uit ontvangstbevestigingen.
- Id-document: extraheert tekst en belangrijke informatie uit rijbewijs en internationale paspoorten.
- Visitekaartje: extraheert tekst en belangrijke informatie uit visitekaartjes.
Werk de FormRecognizer-klasse van uw toepassing bij met de volgende code (zorg ervoor dat u de sleutel- en eindpuntvariabelen bijwerkt met waarden uit uw Document Intelligence-exemplaar van Azure Portal):
static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
public static void main(String[] args) {
FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder().credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
System.out.println("Analyze invoice...");
AnalyzeInvoice(recognizerClient, invoiceUrl);
}
private static void AnalyzeInvoice(FormRecognizerClient recognizerClient, String invoiceUrl) {
SyncPoller < FormRecognizerOperationResult,
List < RecognizedForm >> recognizeInvoicesPoller = recognizerClient.beginRecognizeInvoicesFromUrl(invoiceUrl);
List < RecognizedForm > recognizedInvoices = recognizeInvoicesPoller.getFinalResult();
for (int i = 0; i < recognizedInvoices.size(); i++) {
RecognizedForm recognizedInvoice = recognizedInvoices.get(i);
Map < String,
FormField > recognizedFields = recognizedInvoice.getFields();
System.out.printf("----------- Recognized invoice info for page %d -----------%n", i);
FormField vendorNameField = recognizedFields.get("VendorName");
if (vendorNameField != null) {
if (FieldValueType.STRING == vendorNameField.getValue().getValueType()) {
String merchantName = vendorNameField.getValue().asString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n", merchantName, vendorNameField.getConfidence());
}
}
FormField vendorAddressField = recognizedFields.get("VendorAddress");
if (vendorAddressField != null) {
if (FieldValueType.STRING == vendorAddressField.getValue().getValueType()) {
String merchantAddress = vendorAddressField.getValue().asString();
System.out.printf("Vendor address: %s, confidence: %.2f%n", merchantAddress, vendorAddressField.getConfidence());
}
}
FormField customerNameField = recognizedFields.get("CustomerName");
if (customerNameField != null) {
if (FieldValueType.STRING == customerNameField.getValue().getValueType()) {
String merchantAddress = customerNameField.getValue().asString();
System.out.printf("Customer Name: %s, confidence: %.2f%n", merchantAddress, customerNameField.getConfidence());
}
}
FormField customerAddressRecipientField = recognizedFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (FieldValueType.STRING == customerAddressRecipientField.getValue().getValueType()) {
String customerAddr = customerAddressRecipientField.getValue().asString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n", customerAddr, customerAddressRecipientField.getConfidence());
}
}
FormField invoiceIdField = recognizedFields.get("InvoiceId");
if (invoiceIdField != null) {
if (FieldValueType.STRING == invoiceIdField.getValue().getValueType()) {
String invoiceId = invoiceIdField.getValue().asString();
System.out.printf("Invoice Id: %s, confidence: %.2f%n", invoiceId, invoiceIdField.getConfidence());
}
}
FormField invoiceDateField = recognizedFields.get("InvoiceDate");
if (customerNameField != null) {
if (FieldValueType.DATE == invoiceDateField.getValue().getValueType()) {
LocalDate invoiceDate = invoiceDateField.getValue().asDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n", invoiceDate, invoiceDateField.getConfidence());
}
}
FormField invoiceTotalField = recognizedFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (FieldValueType.FLOAT == invoiceTotalField.getValue().getValueType()) {
Float invoiceTotal = invoiceTotalField.getValue().asFloat();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n", invoiceTotal, invoiceTotalField.getConfidence());
}
}
}
}
Uw toepassing bouwen en uitvoeren
Ga terug naar de hoofdmap van uw project: form-recognizer-app.
- Bouw uw toepassing met de
build
opdracht:
gradle build
- Voer uw toepassing uit met de
run
opdracht:
gradle run
Referentiedocumentatie | Bibliotheekbroncode | Pakket (npm) | Voorbeelden
In deze quickstart gebruikt u de volgende API's om gestructureerde gegevens uit formulieren en documenten te extraheren:
Vereisten
Azure-abonnement: Maak een gratis abonnement aan.
De nieuwste versie van Visual Studio Code of uw favoriete IDE.
De nieuwste LTS-versie van Node.js
Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services in Azure Portal om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.Tip
Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.
Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:
Instellingen
Een nieuwe Node.js-toepassing maken. Maak in een consolevenster (zoals cmd, PowerShell of Bash) een nieuwe map voor de app, en navigeer naar deze map.
mkdir form-recognizer-app && cd form-recognizer-app
Voer de opdracht
npm init
uit om een knooppunttoepassing te maken met eenpackage.json
-bestand.npm init
Installeer het npm-pakket voor de
ai-form-recognizer
clientbibliotheek:npm install @azure/ai-form-recognizer
Het
package.json
-bestand van uw app wordt bijgewerkt met de afhankelijkheden.Maak een bestand met de naam
index.js
en importeer de volgende bibliotheken:const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
Maak variabelen voor het Azure-eindpunt en de Azure-sleutel van uw resource:
const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE"; const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
Op dit moment moet uw JavaScript-toepassing de volgende coderegels bevatten:
const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer"); const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"; const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
Selecteer een codevoorbeeld om in uw toepassing te kopiëren en plakken:
Belangrijk
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.
Probeer het: Indelingsmodel
- In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
- De bestands-URI-waarde is toegevoegd aan de
formUrl
variabele boven aan het bestand. - Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de
beginRecognizeContent
methode.
Voeg de volgende code toe aan uw indelingstoepassing op de regel onder de key
variabele
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);
});
Probeer het: Vooraf samengesteld model
In dit voorbeeld ziet u hoe u gegevens van bepaalde typen algemene documenten kunt analyseren met vooraf getrainde modellen, met behulp van een factuur als voorbeeld. Bekijk onze vooraf samengestelde conceptpagina voor een volledige lijst met factuurvelden
- In dit voorbeeld analyseren we een factuurdocument met behulp van een vooraf samengesteld model. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
- De bestands-URI-waarde is toegevoegd aan de
invoiceUrl
variabele boven aan het bestand. - Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de
beginRecognizeInvoices
methode. - Ter vereenvoudiging worden alle velden die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .
Een vooraf samengesteld model kiezen
U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat moet worden gebruikt voor de analysebewerking, is afhankelijk van het type document dat moet worden geanalyseerd. Dit zijn de vooraf gedefinieerde modellen die momenteel worden ondersteund door de Document Intelligence-service:
- Factuur: extraheert tekst, selectiemarkeringen, tabellen, velden en sleutelgegevens uit facturen.
- Ontvangstbewijs: extraheert tekst en belangrijke informatie uit ontvangstbevestigingen.
- Id-document: extraheert tekst en belangrijke informatie uit rijbewijs en internationale paspoorten.
- Visitekaartje: extraheert tekst en belangrijke informatie uit visitekaartjes.
Voeg de volgende code toe aan uw vooraf samengestelde factuurtoepassing onder de key
variabele
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);
});
Referentiedocumentatie | Broncode bibliotheek | Package (PyPi) | Voorbeelden
In deze quickstart gebruikt u de volgende API's om gestructureerde gegevens uit formulieren en documenten te extraheren:
Vereisten
Azure-abonnement: Krijg een gratis abonnement
-
- Uw Python-installatie moet pip bevatten. U kunt controleren of pip is geïnstalleerd door op de opdrachtregel uit te voeren
pip --version
. Haal pip op door de nieuwste versie van Python te installeren.
- Uw Python-installatie moet pip bevatten. U kunt controleren of pip is geïnstalleerd door op de opdrachtregel uit te voeren
Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services in Azure Portal om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.Tip
Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.
Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:
Instellingen
Open een terminalvenster in uw lokale omgeving en installeer de Azure AI Document Intelligence-clientbibliotheek voor Python met pip:
pip install azure-ai-formrecognizer
Een nieuwe Python-toepassing maken
Maak een nieuwe Python-toepassing met de naam form_recognizer_quickstart.py in uw favoriete editor of IDE. Importeer vervolgens de volgende bibliotheken:
import os
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential
Variabelen maken voor uw Azure-resource-eindpunt en -sleutel
endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"
Op dit moment moet uw Python-toepassing de volgende regels code bevatten:
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"
Selecteer een codevoorbeeld om in uw toepassing te kopiëren en plakken:
Belangrijk
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.
Probeer het: Indelingsmodel
- In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
- De bestands-URI-waarde is toegevoegd aan de
formUrl
variabele boven aan het bestand. - Als u een bepaald bestand op een URI wilt analyseren, gebruikt u de
begin_recognize_content_from_url
methode.
Voeg de volgende code toe aan uw indelingstoepassing op de regel onder de key
variabele
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()
Probeer het: Vooraf samengesteld model
In dit voorbeeld ziet u hoe u gegevens van bepaalde typen algemene documenten kunt analyseren met vooraf getrainde modellen, met behulp van een factuur als voorbeeld. Bekijk onze vooraf samengestelde conceptpagina voor een volledige lijst met factuurvelden
- In dit voorbeeld analyseren we een factuurdocument met behulp van een vooraf samengesteld model. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
- De bestands-URI-waarde is toegevoegd aan de variabele formUrl bovenaan het bestand.
- Als u een bepaald bestand wilt analyseren op een URI, gebruikt u de methode ''begin_recognize_invoices_from_url'.
- Ter vereenvoudiging worden alle velden die door de service worden geretourneerd, hier niet weergegeven. Als u de lijst met alle ondersteunde velden en bijbehorende typen wilt bekijken, raadpleegt u de pagina Factuurconcept .
Een vooraf samengesteld model kiezen
U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat moet worden gebruikt voor de analysebewerking, is afhankelijk van het type document dat moet worden geanalyseerd. Dit zijn de vooraf gedefinieerde modellen die momenteel worden ondersteund door de Document Intelligence-service:
- Factuur: extraheert tekst, selectiemarkeringen, tabellen, velden en sleutelgegevens uit facturen.
- Ontvangstbewijs: extraheert tekst en belangrijke informatie uit ontvangstbevestigingen.
- Id-document: extraheert tekst en belangrijke informatie uit rijbewijs en internationale paspoorten.
- Visitekaartje: extraheert tekst en belangrijke informatie uit visitekaartjes.
Voeg de volgende code toe aan uw vooraf samengestelde factuurtoepassing onder de key
variabele
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()
Uw toepassing uitvoeren
Navigeer naar de map waar u uw form_recognizer_quickstart.py-bestand hebt.
Typ de volgende opdracht in uw terminal:
python form_recognizer_quickstart.py
| Naslaginformatie voor REST API | voor Azure REST API voor Document Intelligence |
In deze quickstart gebruikt u de volgende API's om gestructureerde gegevens uit formulieren en documenten te extraheren:
Vereisten
Azure-abonnement: Krijg een gratis abonnement
cURL geïnstalleerd.
PowerShell versie 6.0+ of een vergelijkbare opdrachtregeltoepassing.
Een Azure AI-services of Document Intelligence-resource. Zodra u uw Azure-abonnement hebt, maakt u een Document Intelligence-resource met één service of meerdere services in Azure Portal om uw sleutel en eindpunt op te halen. U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.Tip
Maak een Azure AI-servicesresource als u van plan bent om toegang te krijgen tot meerdere Azure AI-services onder één eindpunt/sleutel. Voor alleen toegang tot Document Intelligence maakt u een Document Intelligence-resource. Houd er rekening mee dat u een resource met één service nodig hebt als u Microsoft Entra-verificatie wilt gebruiken.
Nadat de resource is geïmplementeerd, selecteert u Ga naar de resource. U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Document Intelligence-API. U plakt uw sleutel en eindpunt verderop in de code in de quickstart:
Selecteer een codevoorbeeld om in uw toepassing te kopiëren en plakken:
Belangrijk
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie Beveiliging van Azure AI-services voor meer informatie.
Probeer het: Indelingsmodel
- In dit voorbeeld hebt u een documentbestand op een URI nodig. U kunt ons voorbeelddocument gebruiken voor deze quickstart.
- Vervang
{endpoint}
door het eindpunt dat u hebt verkregen door uw Document Intelligence-abonnement. - Vervang
{key}
door de sleutel die u uit de vorige stap hebt gekopieerd. - Vervang door
\"{your-document-url}
een voorbeelddocument-URL:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Aanvraag
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}'}"
Operation-Location
U ontvangt een 202 (Success)
antwoord met een Operation-Location-header . De waarde van deze header bevat een resultaat-id die u kunt gebruiken om de status van de asynchrone bewerking op te vragen en de resultaten op te halen:
https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.
In het volgende voorbeeld, als onderdeel van de URL, is de tekenreeks hierna analyzeResults/
de resultaat-id.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Indelingsresultaten ophalen
Nadat u de Analyze Layout API hebt aangeroepen, roept u de Get Analyze Layout Result API aan om de status van de bewerking en de geëxtraheerde gegevens op te halen. Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:
- Vervang
{endpoint}
door het eindpunt dat u hebt verkregen door uw Document Intelligence-abonnement. - Vervang
{key}
door de sleutel die u uit de vorige stap hebt gekopieerd. - Vervang
{resultId}
door de resultaat-id uit de vorige stap.
Aanvraag
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
De resultaten bekijken
U ontvangt een 200 (success)
antwoord met JSON-inhoud.
Bekijk de volgende factuurafbeelding en de bijbehorende JSON-uitvoer.
- Het knooppunt
"readResults"
bevat elke tekstregel met het bijbehorende begrenzingsvak op de pagina. - Het
selectionMarks
knooppunt toont elk selectieteken (selectievakje, keuzerondje) en of de status welselected
ofunselected
niet is. - De
"pageResults"
sectie bevat de geëxtraheerde tabellen. Voor elke tabel worden de tekst, rij- en kolomindex, rij- en kolomspanning, begrenzingsvak en meer geëxtraheerd.
Hoofdtekst van de reactie
U kunt de volledige voorbeelduitvoer bekijken op GitHub.
Probeer het: Vooraf samengesteld model
- In dit voorbeeld analyseren we een factuurdocument met behulp van een vooraf samengesteld model. U kunt ons voorbeeldfactuurdocument voor deze quickstart gebruiken.
Een vooraf samengesteld model kiezen
U bent niet beperkt tot facturen. Er zijn verschillende vooraf gedefinieerde modellen waaruit u kunt kiezen, die elk een eigen set ondersteunde velden hebben. Het model dat moet worden gebruikt voor de analysebewerking, is afhankelijk van het type document dat moet worden geanalyseerd. Dit zijn de vooraf gedefinieerde modellen die momenteel worden ondersteund door de Document Intelligence-service:
- Factuur: extraheert tekst, selectiemarkeringen, tabellen, velden en sleutelgegevens uit facturen.
- Ontvangstbewijs: extraheert tekst en belangrijke informatie uit ontvangstbevestigingen.
- Id-document: extraheert tekst en belangrijke informatie uit rijbewijs en internationale paspoorten.
- Visitekaartje: extraheert tekst en belangrijke informatie uit visitekaartjes.
Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:
Vervang
{endpoint}
door het eindpunt dat u hebt verkregen door uw Document Intelligence-abonnement.Vervang
{key}
door de sleutel die u uit de vorige stap hebt gekopieerd.Vervang door
\"{your-document-url}
een voorbeeldfactuur-URL:https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf
Aanvraag
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}'}"
Operation-Location
U ontvangt een 202 (Success)
antwoord met een Operation-Location-header . De waarde van deze header bevat een resultaat-id die u kunt gebruiken om de status van de asynchrone bewerking op te vragen en de resultaten op te halen:
https:// cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}
In het volgende voorbeeld, als onderdeel van de URL, is de tekenreeks na analyzeResults/
de resultaat-id:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Factuurresultaten ophalen
Nadat u de Analyze Invoice API hebt aangeroepen, roept u de Get Analyze Invoice Result API aan om de status van de bewerking en de geëxtraheerde gegevens op te halen. Voordat u de opdracht uitvoert, moet u de volgende wijzigingen aanbrengen:
- Vervang
{endpoint}
door het eindpunt dat u hebt verkregen door uw Document Intelligence-sleutel. U vindt deze op het tabblad Overzicht van documentinformatieresources. - Vervang
{resultId}
door de resultaat-id uit de vorige stap. - Vervang
{key}
door uw sleutel.
Aanvraag
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Het antwoord bekijken
U ontvangt een 200 (Success)
antwoord met JSON-uitvoer.
- Het
"readResults"
veld bevat elke tekstregel die is geëxtraheerd uit de factuur. - De
"pageResults"
bevat de tabellen en selectiemarkeringen die zijn geëxtraheerd uit de factuur. - Het
"documentResults"
veld bevat sleutel-/waardegegevens voor de meest relevante onderdelen van de factuur.
Zie het voorbeeldfactuurdocument .
Hoofdtekst van de reactie
Bekijk de volledige voorbeelduitvoer op GitHub.
Dat is het, goed gedaan!
Volgende stappen
Voor een verbeterde ervaring en geavanceerde modelkwaliteit kunt u Document Intelligence Studio gebruiken.
De Studio ondersteunt elk model dat is getraind met v2.1 gelabelde gegevens.
De wijzigingenlogboeken bieden gedetailleerde informatie over het migreren van v3.1 naar v4.0.