Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wichtig
- Azure Cognitive Services Formularerkennung ist jetzt Azure Document Intelligence in Foundry Tools.
- Einige Plattformen warten noch auf das Umbenennungsupdate.
- Alle Erwähnungen von Formularerkennung oder Document Intelligence in unserer Dokumentation beziehen sich auf denselben Azure Dienst.
Dieser Inhalt gilt für:
v4.0 (GA)Frühere Versionen:
v3.1 (GA)
v3.0 (GA)
- Erste Schritte mit Azure Document Intelligence, neueste stabile Version v4.0
2024-11-30(GA).
Dieser Inhalt gilt für:
v3.1 (GA)Frühere Versionen:
v3.0
v2.1
- Erste Schritte mit der neuesten GA-Version von Azure Formularerkennung (
2023-07-31).
Dieser Inhalt gilt für:
v3.0 (GA)Neuere Version:
v3.1
v2.1
- Erste Schritte mit der Legacy-GA-Version des Azure Formularerkennungs (
2022-08-31).
Azure Document Intelligence /Formularerkennung ist ein cloudbasierter Foundry Tools-Dienst, der maschinelles Lernen verwendet, um Schlüsselwertpaare, Text, Tabellen und Schlüsseldaten aus Ihren Dokumenten zu extrahieren.
Sie können Dokumentverarbeitungsmodelle ganz einfach in Ihre Workflows und Anwendungen integrieren, indem Sie ein Programmiersprachen-SDK verwenden oder die REST-API aufrufen.
Es wird empfohlen, den kostenlosen Dienst zu verwenden, während Sie die Technologie für diese Schnellstartanleitung erlernen. Denken Sie daran, dass die Anzahl der kostenlosen Seiten auf 500 pro Monat begrenzt ist.
Weitere Informationen zu den API-Features und Entwicklungsoptionen finden Sie auf unserer Übersichtsseite .
Verwenden Sie in dieser Schnellstartanleitung die folgenden Features, um Daten und Werte aus Formularen und Dokumenten zu analysieren und zu extrahieren:
Layout-Modell – Analyse und Extraktion von Tabellen, Linien, Wörtern und Auswahlmarkierungen wie Optionsfeldern und Kontrollkästchen in Dokumenten, ohne dass ein Modell trainiert werden muss.
Vordefiniertes Modell – Analysieren und Extrahieren allgemeiner Felder aus bestimmten Dokumenttypen mithilfe eines vordefinierten Modells.
Voraussetzungen
Azure-Abonnement – Kostenlos erstellen.
Die aktuelle Version von Visual Studio-IDE.
Eine Foundry Tools- oder Document Intelligence-Ressource. Wenn Sie über Ihr Azure-Abonnement verfügen, erstellen Sie eine single-service oder Azure multi-service Ressource im Azure Portal, um Ihren Schlüssel und Endpunkt abzurufen.
Sie können das kostenlose Preisniveau (
F0) verwenden, um den Dienst zu testen und später auf eine kostenpflichtige Stufe für die Produktion zu aktualisieren.
Tipp
Erstellen Sie eine Microsoft Foundry-Ressource, wenn Sie beabsichtigen, unter einem einzelnen Endpunkt/Schlüssel auf mehrere Foundry-Tools zuzugreifen. Erstellen Sie für den Dokumentintelligenzzugriff nur eine Document Intelligence-Ressource. Sie benötigen eine Einzeldienstressource, wenn Sie Microsoft Entra authentication verwenden möchten.
Nachdem Ihre Ressource bereitgestellt wurde, wählen Sie "Zur Ressource wechseln" aus. Sie benötigen den Schlüssel und endpunkt aus der Ressource, die Sie erstellen, um Ihre Anwendung mit der Document Intelligence-API zu verbinden. Sie fügen Ihren Schlüssel und Endpunkt später in der Schnellstartanleitung in den Code ein:
Eine Foundry Tools- oder Document Intelligence-Ressource. Wenn Sie über Ihr Azure-Abonnement verfügen, erstellen Sie eine single-service oder Azure multi-service Ressource im Azure Portal, um Ihren Schlüssel und Endpunkt abzurufen.
Sie können das kostenlose Preisniveau (
F0) verwenden, um den Dienst zu testen und später auf eine kostenpflichtige Stufe für die Produktion zu aktualisieren.
Tipp
Erstellen Sie eine Microsoft Foundry-Ressource, wenn Sie beabsichtigen, unter einem einzelnen Endpunkt/Schlüssel auf mehrere Foundry-Tools zuzugreifen. Erstellen Sie nur für Formularerkennung Zugriff eine Formularerkennung Ressource. Sie benötigen eine Einzeldienstressource, wenn Sie Microsoft Entra authentication verwenden möchten.
Nachdem Ihre Ressource bereitgestellt wurde, wählen Sie "Zur Ressource wechseln" aus. Sie benötigen den Schlüssel und endpunkt aus der Ressource, die Sie erstellen, um Ihre Anwendung mit der Formularerkennung-API zu verbinden. Sie fügen Ihren Schlüssel und Endpunkt später in der Schnellstartanleitung in den Code ein:
Einrichten
Starten Sie Visual Studio.
Wählen Sie auf der Startseite "Neues Projekt erstellen" aus.
Geben Sie auf der Seite "Neues Projekt erstellen" die Konsole in das Suchfeld ein. Wählen Sie die Vorlage "Konsolenanwendung" und dann "Weiter" aus.
- Geben Sie im Dialogfeld "Configure your new project" im Feld "Project Name"
doc_intel_quickstartein. Wählen Sie dann "Weiter" aus.
- Geben Sie im Dialogfeld "Configure your new project" im Feld "Project Name"
form_recognizer_quickstartein. Wählen Sie dann "Weiter" aus.
Wählen Sie im Dialogfeld Weitere Informationen.NET 8.0 (Long-term support) aus, und wählen Sie dann Create aus.
Installieren der Clientbibliothek mit NuGet
Klicken Sie mit der rechten Maustaste auf Ihr doc_intel_quickstart Projekt, und wählen Sie "NuGet-Pakete verwalten" aus.
Wählen Sie die Registerkarte Browse aus, und geben Sie Azure ein. AI. DocumentIntelligence.
Aktivieren Sie das
Include prereleaseKontrollkästchen.
Wählen Sie im Dropdownmenü eine Version aus, und installieren Sie das Paket in Ihrem Projekt.
Klicken Sie mit der rechten Maustaste auf Ihr form_recognizer_quickstart Projekt, und wählen Sie "NuGet-Pakete verwalten" aus.
Wählen Sie die Registerkarte "Durchsuchen" aus, und geben Sie Azure.AI.FormRecognizer ein. Wählen Sie Version 4.1.0 im Dropdownmenü aus.
Klicken Sie mit der rechten Maustaste auf Ihr form_recognizer_quickstart Projekt, und wählen Sie "NuGet-Pakete verwalten" aus.
Wählen Sie die Registerkarte "Durchsuchen" aus, und geben Sie Azure.AI.FormRecognizer ein. Wählen Sie Version 4.0.0 im Dropdownmenü aus.
Erstellen Ihrer Anwendung
Um mit dem Dokumentintelligenzdienst zu interagieren, müssen Sie eine Instanz der DocumentIntelligenceClient Klasse erstellen. Dazu erstellen Sie eine AzureKeyCredential mit Ihrem key aus dem Azure-Portal und einer DocumentIntelligenceClient-Instanz mit der AzureKeyCredential und Ihrer Dokumentenintelligenz endpoint.
Um mit dem Formularerkennung-Dienst zu interagieren, müssen Sie eine Instanz der klasse DocumentAnalysisClient erstellen. Dazu erstellen Sie eine AzureKeyCredential mit Ihrem key aus dem Azure-Portal und eine DocumentAnalysisClient-Instanz mit dem AzureKeyCredential und Ihrem Formularerkennung endpoint.
Hinweis
- Ab .NET 6 generieren neue Projekte mit der Vorlage
consoleeinen neuen Programmstil, der sich von früheren Versionen unterscheidet. - Die neue Ausgabe verwendet aktuelle C#-Features, die den Code vereinfachen, den Sie schreiben müssen.
- Wenn Sie die neuere Version verwenden, müssen Sie nur den Textkörper der
MainMethode schreiben. Sie müssen keine Anweisungen auf oberster Ebene, globale Using-Direktiven oder implizite Using-Direktiven einschließen. - Weitere Informationen finden Sie unter"Neue C#-Vorlagen generieren Anweisungen der obersten Ebene".
Öffnen Sie die datei Program.cs .
Löschen Sie den vorhandenen Code, einschließlich der Zeile
Console.Writeline("Hallo Welt!"), und wählen Sie eines der folgenden Codebeispiele aus, um die Program.cs Datei Ihrer Anwendung zu kopieren und einzufügen:
Wichtig
Wir empfehlen die Microsoft Entra ID-Authentifizierung mit verwalteten Identitäten für Azure-Ressourcen, um zu vermeiden, dass Anmeldeinformationen in Ihren Anwendungen gespeichert werden, die in der Cloud ausgeführt werden.
Verwenden Sie API-Schlüssel mit Vorsicht. Fügen Sie den API-Schlüssel nicht direkt in Ihren Code ein, und veröffentlichen Sie ihn nie öffentlich. Wenn Sie API-Schlüssel verwenden, speichern Sie sie sicher in Azure Key Vault, drehen Sie die Schlüssel regelmäßig, und beschränken Sie den Zugriff auf Azure Key Vault mithilfe rollenbasierter Zugriffssteuerung und Netzwerkzugriffseinschränkungen. Weitere Informationen zur sicheren Verwendung von API-Schlüsseln in Ihren Apps finden Sie unter API-Schlüssel mit Azure Key Vault.
Weitere Informationen zur Sicherheit von AI-Diensten finden Sie unter Authenticate-Anforderungen an Azure KI Services.
Layoutmodell
Extrahieren Sie Text, Markierungen, Textformatvorlagen, Tabellenstrukturen und Begrenzungsbereichskoordinaten aus Dokumenten.
- In diesem Beispiel benötigen Sie eine Dokumentdatei aus einem URI. Sie können unser sample-Dokument für diese Schnellstartanleitung verwenden.
- Wir haben den Datei-URI-Wert zur
Uri fileUriVariablen oben im Skript hinzugefügt. - Um das Layout aus einer bestimmten Datei an einem URI zu extrahieren, verwenden Sie die
AnalyzeDocumentAsync-Methode und übergeben Sieprebuilt-layoutals Modell-ID. Der zurückgegebene Wert ist einAnalyzeResultObjekt, das Daten aus dem übermittelten Dokument enthält.
Fügen Sie der Program.cs-Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz aktualisieren:
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}");
}
}
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Startschaltfläche neben formRecognizer_quickstart aus, um Ihr Programm zu erstellen und auszuführen, oder drücken Sie F5.
Fügen Sie der Program.cs-Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrem Azure Portal Formularerkennung Instanz aktualisieren:
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.Polygon[0].X}, Y= {line.Polygon[0].Y}");
Console.WriteLine($" Upper right => X: {line.Polygon[1].X}, Y= {line.Polygon[1].Y}");
Console.WriteLine($" Lower right => X: {line.Polygon[2].X}, Y= {line.Polygon[2].Y}");
Console.WriteLine($" Lower left => X: {line.Polygon[3].X}, Y= {line.Polygon[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.Polygon[0].X}, Y= {selectionMark.Polygon[0].Y}");
Console.WriteLine($" Upper right => X: {selectionMark.Polygon[1].X}, Y= {selectionMark.Polygon[1].Y}");
Console.WriteLine($" Lower right => X: {selectionMark.Polygon[2].X}, Y= {selectionMark.Polygon[2].Y}");
Console.WriteLine($" Lower left => X: {selectionMark.Polygon[3].X}, Y= {selectionMark.Polygon[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}'.");
}
}
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Startschaltfläche neben formRecognizer_quickstart aus, um Ihr Programm zu erstellen und auszuführen, oder drücken Sie F5.
Ausgabe des Layoutmodells
Hier ist ein Ausschnitt der erwarteten Ausgabe:
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
Um die gesamte Ausgabe anzusehen, besuchen Sie das Azure-Beispiele-Repository auf GitHub, um das Layoutmodell-Output anzusehen.
Fügen Sie der Program.cs-Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrem Azure Portal Formularerkennung Instanz aktualisieren:
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.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[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.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[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.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[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.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[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}'.");
}
}
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Startschaltfläche neben formRecognizer_quickstart aus, um Ihr Programm zu erstellen und auszuführen, oder drücken Sie F5.
Vorkonfiguriertes Modell
Analysieren und Extrahieren allgemeiner Felder aus bestimmten Dokumenttypen mithilfe eines vordefinierten Modells. In diesem Beispiel analysieren wir eine Rechnung mithilfe des vorkonfigurierten Rechnungsmodells .
Tipp
Sie sind nicht auf Rechnungen beschränkt – es gibt mehrere vordefinierte Modelle, aus denen jeder eine eigene Gruppe unterstützter Felder hat. Das modell, das für den analyze Vorgang verwendet werden soll, hängt vom Typ des zu analysierenden Dokuments ab. Siehe Modelldatenextraktion.
- Analysieren Sie eine Rechnung mithilfe des vorkonfigurierten Rechnungsmodells. Sie können unser sample-Rechnungsdokument für diese Schnellstartanleitung verwenden.
- Wir haben den Datei-URI-Wert der
Uri invoiceUriVariablen oben in der Program.cs Datei hinzugefügt. - Verwenden Sie die
AnalyzeDocumentAsync-Methode, und übergeben Sieprebuilt-invoiceals Modell-ID, um eine bestimmte Datei an einem URI zu analysieren. Der zurückgegebene Wert ist einAnalyzeResultObjekt, das Daten aus dem übermittelten Dokument enthält. - Aus Gründen der Einfachheit werden nicht alle Schlüssel-Wert-Paare angezeigt, die der Dienst zurückgibt. Die Liste aller unterstützten Felder und entsprechenden Typen finden Sie auf unserer Seite " Rechnungskonzept ".
Fügen Sie der Program.cs Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz aktualisieren:
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.FieldType == DocumentFieldType.String)
{
string vendorName = vendorNameField.ValueString;
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField)
&& customerNameField.FieldType == DocumentFieldType.String)
{
string customerName = customerNameField.ValueString;
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
&& itemsField.FieldType == DocumentFieldType.List)
{
foreach (DocumentField itemField in itemsField.ValueList)
{
Console.WriteLine("Item:");
if (itemField.FieldType == DocumentFieldType.Dictionary)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueDictionary;
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField)
&& itemDescriptionField.FieldType == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.ValueString;
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField)
&& itemAmountField.FieldType == 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.FieldType == 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.FieldType == 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.FieldType == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
Console.WriteLine($"Invoice Total: '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
}
}
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Startschaltfläche neben formRecognizer_quickstart aus, um Ihr Programm zu erstellen und auszuführen, oder drücken Sie F5.
Fügen Sie der Program.cs Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrem Azure Portal Formularerkennung Instanz aktualisieren:
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}");
}
}
}
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Startschaltfläche neben formRecognizer_quickstart aus, um Ihr Programm zu erstellen und auszuführen, oder drücken Sie F5.
Vorkonfigurierte Modellausgabe
Hier ist ein Ausschnitt der erwarteten Ausgabe:
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
Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Azure Samples-Repository auf GitHub, um die Ausgabe des prebuilt-Rechnungsmodells anzusehen.
Fügen Sie der Program.cs Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrem Azure Portal Formularerkennung Instanz aktualisieren:
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}");
}
}
}
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, wählen Sie die grüne Startschaltfläche neben formRecognizer_quickstart aus, um Ihr Programm zu erstellen und auszuführen, oder drücken Sie F5.
Verwenden Sie in dieser Schnellstartanleitung die folgenden Features, um Daten und Werte aus Formularen und Dokumenten zu analysieren und zu extrahieren:
Layout – Analysieren und Extrahieren von Tabellen, Linien, Wörtern und Auswahlmarkierungen wie Optionsfeldern und Kontrollkästchen in Dokumenten, ohne dass ein Modell trainiert werden muss.
Vorkonfigurierte Rechnung – Analysieren und Extrahieren allgemeiner Felder aus bestimmten Dokumenttypen mithilfe eines vortrainierten Modells.
Voraussetzungen
Azure-Abonnement – Kostenlos erstellen.
Die neueste Version von Visual Studio Code oder Ihrer bevorzugten IDE. SieheJava in Visual Studio Code.
Tipp
- Visual Studio Code bietet ein Coding Pack für Java für Windows und macOS.Das Codierungspaket ist ein Bündel von VS Code, das Java Development Kit (JDK) und eine Sammlung von vorgeschlagenen Erweiterungen durch Microsoft. Das Coding Pack kann auch verwendet werden, um eine vorhandene Entwicklungsumgebung zu beheben.
- Wenn Sie VS Code und das Coding Pack for Java verwenden, installieren Sie die Erweiterung Gradle für Java.
Wenn Sie Visual Studio Code nicht verwenden, stellen Sie sicher, dass Die folgenden Komponenten in Ihrer Entwicklungsumgebung installiert sind:
Ein Java Development Kit (JDK) Version 8 oder höher. Weitere Informationen seeMicrosoft-Build von OpenJDK.
Gradle, Version 6.8 oder höher.
Eine Foundry Tools- oder Document Intelligence-Ressource. Wenn Sie über Ihr Azure-Abonnement verfügen, erstellen Sie eine single-service oder multi-service Document Intelligence-Ressource im Azure Portal, um Ihren Schlüssel und Endpunkt abzurufen. Sie können das kostenlose Preisniveau (
F0) verwenden, um den Dienst zu testen und später auf eine kostenpflichtige Stufe für die Produktion zu aktualisieren.Tipp
Erstellen Sie eine Microsoft Foundry-Ressource, wenn Sie beabsichtigen, unter einem einzelnen Endpunkt/Schlüssel auf mehrere Foundry-Tools zuzugreifen. Erstellen Sie für den Dokumentintelligenzzugriff nur eine Document Intelligence-Ressource. Sie benötigen eine Einzeldienstressource, wenn Sie Microsoft Entra authentication verwenden möchten.
Nachdem Ihre Ressource bereitgestellt wurde, wählen Sie "Zur Ressource wechseln" aus. Sie benötigen den Schlüssel und endpunkt aus der Ressource, die Sie erstellen, um Ihre Anwendung mit der Document Intelligence-API zu verbinden. Später fügen Sie Ihren Schlüssel und Endpunkt in den Code ein:
Einrichten
Erstellen eines neuen Gradle-Projekts
Erstellen Sie im Konsolenfenster (z. B. cmd, PowerShell oder Bash) ein neues Verzeichnis für Ihre App namens doc-intel-app, und navigieren Sie zu der App.
mkdir doc-intel-app && doc-intel-appmkdir doc-intel-app; cd doc-intel-appFühren Sie den
gradle initBefehl aus Ihrem Arbeitsverzeichnis aus. Mit diesem Befehl werden wichtige Builddateien für Gradle erstellt, einschließlich build.gradle.kts, die zur Laufzeit zum Erstellen und Konfigurieren Ihrer Anwendung verwendet werden.gradle init --type basicWenn Sie aufgefordert werden, ein DSL auszuwählen, wählen Sie Kotlin aus.
Akzeptieren Sie den Standardprojektnamen (doc-intel-app), indem Sie Eingabetaste oder Return drücken.
Erstellen Sie im Konsolenfenster (z. B. cmd, PowerShell oder Bash) ein neues Verzeichnis für Ihre App, die als Formularerkennungs-App bezeichnet wird, und navigieren Sie zu der App.
mkdir form-recognize-app && cd form-recognize-appmkdir form-recognize-app; cd form-recognize-appFühren Sie den
gradle initBefehl aus Ihrem Arbeitsverzeichnis aus. Mit diesem Befehl werden wichtige Builddateien für Gradle erstellt, einschließlich build.gradle.kts, die zur Laufzeit zum Erstellen und Konfigurieren Ihrer Anwendung verwendet werden.gradle init --type basicWenn Sie aufgefordert werden, ein DSL auszuwählen, wählen Sie Kotlin aus.
Akzeptieren Sie den Standardprojektnamen (form-recognize-app), indem Sie Eingabetaste oder Enter drücken.
Installieren der Clientbibliothek
In dieser Schnellstartanleitung wird der Gradle-Abhängigkeits-Manager verwendet. Sie finden die Clientbibliothek und Informationen für andere Abhängigkeitsmanager im Maven Central Repository.
Öffnen Sie die Datei "build.gradle.kts " des Projekts in Ihrer IDE. Copy und fügen Sie den folgenden Code ein, um die Clientbibliothek als implementation-Anweisung zusammen mit den erforderlichen Plugins und Einstellungen einzuschließen.
plugins {
java
application
}
application {
mainClass.set("DocIntelligence")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0'
}
In dieser Schnellstartanleitung wird der Gradle-Abhängigkeits-Manager verwendet. Sie finden die Clientbibliothek und Informationen für andere Abhängigkeitsmanager im Maven Central Repository.
Öffnen Sie die Datei "build.gradle.kts " des Projekts in Ihrer IDE. Kopieren Sie den folgenden Code, um die Clientbibliothek als implementation-Anweisung einzufügen, zusammen mit den erforderlichen Plugins und Einstellungen.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.1.0'
}
In dieser Schnellstartanleitung wird der Gradle-Abhängigkeits-Manager verwendet. Sie finden die Clientbibliothek und Informationen für andere Abhängigkeitsmanager im Maven Central Repository.
Öffnen Sie die Datei "build.gradle.kts " des Projekts in Ihrer IDE. Kopieren Sie den folgenden Code, um die Clientbibliothek als implementation-Anweisung einzuschließen, zusammen mit den erforderlichen Plugins und Einstellungen.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'
}
Erstellen einer Java Anwendung
Um mit dem Dokumentintelligenzdienst zu interagieren, müssen Sie eine Instanz der DocumentIntelligenceClient Klasse erstellen. Dazu erstellen Sie eine AzureKeyCredential mit Ihrem key aus dem Azure-Portal und einer DocumentIntelligenceClient-Instanz mit der AzureKeyCredential und Ihrer Dokumentenintelligenz endpoint.
Um mit dem Dokumentintelligenzdienst zu interagieren, müssen Sie eine Instanz der DocumentAnalysisClient Klasse erstellen. Dazu erstellen Sie eine AzureKeyCredential mit Ihrem key aus dem Azure-Portal und einer DocumentAnalysisClient-Instanz mit der AzureKeyCredential und Ihrer Dokumentenintelligenz endpoint.
Führen Sie im Doc-intel-App-Verzeichnis den folgenden Befehl aus:
mkdir -p src/main/javaSie erstellen die folgende Verzeichnisstruktur:
Navigieren Sie zum
javaVerzeichnis, und erstellen Sie eine Datei mit dem NamenDocIntelligence.java.Tipp
- Sie können eine neue Datei mit PowerShell erstellen.
- Öffnen Sie ein PowerShell-Fenster in Ihrem Projektverzeichnis, indem Sie die UMSCHALTTASTE gedrückt halten und mit der rechten Maustaste auf den Ordner klicken.
- Geben Sie den folgenden Befehl New-Item DocIntelligence.java ein.
Öffnen Sie die
DocIntelligence.javaDatei. Kopieren Sie eines der folgenden Codebeispiele, und fügen Sie sie in Ihre Anwendung ein:
Navigieren Sie zum
javaVerzeichnis, und erstellen Sie eine Datei mit dem NamenFormRecognizer.java.Tipp
- Sie können eine neue Datei mit PowerShell erstellen.
- Öffnen Sie ein PowerShell-Fenster in Ihrem Projektverzeichnis, indem Sie die UMSCHALTTASTE gedrückt halten und mit der rechten Maustaste auf den Ordner klicken.
- Geben Sie den folgenden Befehl New-Item FormRecognizer.java ein.
Öffnen Sie die
FormRecognizer.javaDatei. Kopieren Sie eines der folgenden Codebeispiele, und fügen Sie sie in Ihre Anwendung ein:
Wichtig
Wir empfehlen die Microsoft Entra ID-Authentifizierung mit verwalteten Identitäten für Azure-Ressourcen, um zu vermeiden, dass Anmeldeinformationen in Ihren Anwendungen gespeichert werden, die in der Cloud ausgeführt werden.
Verwenden Sie API-Schlüssel mit Vorsicht. Fügen Sie den API-Schlüssel nicht direkt in Ihren Code ein, und veröffentlichen Sie ihn nie öffentlich. Wenn Sie API-Schlüssel verwenden, speichern Sie sie sicher in Azure Key Vault, drehen Sie die Schlüssel regelmäßig, und beschränken Sie den Zugriff auf Azure Key Vault mithilfe rollenbasierter Zugriffssteuerung und Netzwerkzugriffseinschränkungen. Weitere Informationen zur sicheren Verwendung von API-Schlüsseln in Ihren Apps finden Sie unter API-Schlüssel mit Azure Key Vault.
Weitere Informationen zur Sicherheit von AI-Diensten finden Sie unter Authenticate-Anforderungen an Azure KI Services.
Layoutmodell
Extrahieren Sie Text, Markierungen, Textformatvorlagen, Tabellenstrukturen und Begrenzungsbereichskoordinaten aus Dokumenten.
- In diesem Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Sie können unser sample-Dokument für diese Schnellstartanleitung verwenden.
- Zum Analysieren einer bestimmten Datei bei einem URI verwenden Sie die
beginAnalyzeDocumentMethode und übergebenprebuilt-layoutsie als Modell-ID. Der zurückgegebene Wert ist einAnalyzeResultObjekt, das Daten zum übermittelten Dokument enthält. - Wir haben der Variablen in der
documentUrlHauptmethode den Datei-URI-Wert hinzugefügt.
Fügen Sie der DocIntelligence.java Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz aktualisieren:
import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
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";
AnalyzeDocumentOptions options = new AnalyzeDocumentOptions(documentUrl);
SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeLayoutPoller = client.beginAnalyzeDocument(modelId, options);
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(),
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()));
}
}
Erstellen und Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zum Hauptprojektverzeichnis – doc-intel-app.
Erstellen Sie Ihre Anwendung mit dem
buildBefehl:gradle buildFühren Sie Ihre Anwendung mit dem
runBefehl aus:gradle run
Fügen Sie der FormRecognizer.java Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz aktualisieren:
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.getPolygon().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.getPolygon().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 > Polygon) {
return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Erstellen und Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zum Hauptprojektverzeichnis – Formularerkennungs-App.
Erstellen Sie Ihre Anwendung mit dem
buildBefehl:gradle buildFühren Sie Ihre Anwendung mit dem
runBefehl aus:gradle run
Ausgabe des Layoutmodells
Hier ist ein Ausschnitt der erwarteten Ausgabe:
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.
Um die gesamte Ausgabe anzusehen, besuchen Sie das Azure-Beispiele-Repository auf GitHub, um das Layoutmodell-Output anzusehen.
Fügen Sie der FormRecognizer.java Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz aktualisieren:
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.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.getSelectionMarkState().toString(),
getBoundingCoordinates(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()));
}
/**
* Utility function to get the bounding polygon coordinates.
*/
private static String getBoundingCoordinates(List < Point > Polygon) {
return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Erstellen und Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zum Hauptprojektverzeichnis – Formularerkennungs-App.
Erstellen Sie Ihre Anwendung mit dem
buildBefehl:gradle buildFühren Sie Ihre Anwendung mit dem
runBefehl aus:gradle run
Vorkonfiguriertes Modell
Analysieren und Extrahieren allgemeiner Felder aus bestimmten Dokumenttypen mithilfe eines vordefinierten Modells. In diesem Beispiel analysieren wir eine Rechnung mithilfe des vorkonfigurierten Rechnungsmodells .
Tipp
Sie sind nicht auf Rechnungen beschränkt – es gibt mehrere vordefinierte Modelle, aus denen jeder eine eigene Gruppe unterstützter Felder hat. Das modell, das für den analyze Vorgang verwendet werden soll, hängt vom Typ des zu analysierenden Dokuments ab. Siehe Modelldatenextraktion.
- Analysieren Sie eine Rechnung mithilfe des vorkonfigurierten Rechnungsmodells. Sie können unser sample-Rechnungsdokument für diese Schnellstartanleitung verwenden.
- Wir haben der Variablen oben in der
invoiceUrlDatei den Datei-URL-Wert hinzugefügt. - Zum Analysieren einer bestimmten Datei bei einem URI verwenden Sie die
beginAnalyzeDocumentsMethode und übergebenPrebuiltModels.Invoicesie als Modell-ID. Der zurückgegebene Wert ist einresultObjekt, das Daten zum übermittelten Dokument enthält. - Aus Gründen der Einfachheit werden nicht alle Schlüssel-Wert-Paare angezeigt, die der Dienst zurückgibt. Die Liste aller unterstützten Felder und entsprechenden Typen finden Sie auf unserer Seite " Rechnungskonzept ".
Fügen Sie der DocIntelligence.java Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz aktualisieren:
import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzedDocument;
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.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) {
// create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.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<AnalyzeOperationDetails, AnalyzeResult> analyzeInvoicesPoller =
client.beginAnalyzeDocument(modelId, new AnalyzeDocumentOptions(invoiceUrl));
AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map<String, DocumentField> invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueAsString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueAsString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueAsString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueAsString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueAsString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (invoiceDateField != 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 (invoiceTotalField != 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/documentintelligence/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());
}
}
}));
}
}
}
}
}
Erstellen und Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zum Hauptprojektverzeichnis – doc-intel-app.
Erstellen Sie Ihre Anwendung mit dem
buildBefehl:gradle buildFühren Sie Ihre Anwendung mit dem
runBefehl aus:gradle run
Fügen Sie der FormRecognizer.java Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz aktualisieren:
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());
}
}
}));
}
}
}
}
}
Erstellen und Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zum Hauptprojektverzeichnis – doc-intel-app.
Erstellen Sie Ihre Anwendung mit dem
buildBefehl:gradle buildFühren Sie Ihre Anwendung mit dem
runBefehl aus:gradle run
Vorkonfigurierte Modellausgabe
Hier ist ein Ausschnitt der erwarteten Ausgabe:
----------- 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
Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Azure Samples-Repository auf GitHub, um die Ausgabe des prebuilt-Rechnungsmodells anzusehen.
Fügen Sie der FormRecognizer.java Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz aktualisieren:
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());
}
}
}));
}
}
}
}
}
Erstellen und Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, navigieren Sie zurück zum Hauptprojektverzeichnis – doc-intel-app.
Erstellen Sie Ihre Anwendung mit dem
buildBefehl:gradle buildFühren Sie Ihre Anwendung mit dem
runBefehl aus:gradle run
Verwenden Sie in dieser Schnellstartanleitung die folgenden Features, um Daten und Werte aus Formularen und Dokumenten zu analysieren und zu extrahieren:
Layout – Analysieren und Extrahieren von Tabellen, Linien, Wörtern und Auswahlmarkierungen wie Optionsfeldern und Kontrollkästchen in Dokumenten, ohne dass ein Modell trainiert werden muss.
Vorkonfigurierte Rechnung – Analysieren und Extrahieren allgemeiner Felder aus bestimmten Dokumenttypen mithilfe eines vortrainierten Rechnungsmodells.
Voraussetzungen
Azure-Abonnement – Kostenlos erstellen.
Die neueste Version von Visual Studio Code oder Ihrer bevorzugten IDE. Weitere Informationen seeNode.js in Visual Studio Code.
Die neueste
LTSVersion von Node.js.Eine Foundry Tools- oder Document Intelligence-Ressource. Wenn Sie über Ihr Azure-Abonnement verfügen, erstellen Sie eine single-service oder multi-service Document Intelligence-Ressource im Azure Portal, um Ihren Schlüssel und Endpunkt abzurufen. Sie können das kostenlose Preisniveau (
F0) verwenden, um den Dienst zu testen und später auf eine kostenpflichtige Stufe für die Produktion zu aktualisieren.Tipp
Erstellen Sie eine Microsoft Foundry-Ressource, wenn Sie beabsichtigen, unter einem einzelnen Endpunkt/Schlüssel auf mehrere Foundry-Tools zuzugreifen. Erstellen Sie für den Dokumentintelligenzzugriff nur eine Document Intelligence-Ressource. Sie benötigen eine Einzeldienstressource, wenn Sie Microsoft Entra authentication verwenden möchten.
Nachdem Ihre Ressource bereitgestellt wurde, wählen Sie "Zur Ressource wechseln" aus. Sie benötigen den Schlüssel und endpunkt aus der Ressource, die Sie erstellen, um Ihre Anwendung mit der Document Intelligence-API zu verbinden. Sie fügen Ihren Schlüssel und Endpunkt später in der Schnellstartanleitung in den Code ein:
Einrichten
Erstellen Sie eine neue Node.js Express-Anwendung: Erstellen Sie in einem Konsolenfenster (z. B. cmd, PowerShell oder Bash) ein neues Verzeichnis für Ihre App mit dem Namen
doc-intel-app.mkdir doc-intel-app && cd doc-intel-appFühren Sie den
npm initBefehl aus, um die Anwendung zu initialisieren und das Gerüst für Ihr Projekt zu erstellen.npm initGeben Sie die Attribute Ihres Projekts mithilfe der Anweisungen an, die im Terminal angezeigt werden.
- Die wichtigsten Attribute sind Name, Versionsnummer und Einstiegspunkt.
- Wir empfehlen,
index.jsals Namen des Einstiegspunkts beizubehalten. Die Beschreibung, der Testbefehl, GitHub Repository, Schlüsselwörter, Autor und Lizenzinformationen sind optionale Attribute– sie können für dieses Projekt übersprungen werden. - Akzeptieren Sie die Vorschläge in Klammern, indem Sie "Zurückgeben " oder "Eingabetaste" auswählen.
- Nachdem Sie die Eingabeaufforderungen abgeschlossen haben, wird eine
package.jsonDatei in Ihrem Doc-intel-App-Verzeichnis erstellt.
Installieren Sie die
ai-document-intelligenceClientbibliothek undazure/identitynpm-Pakete:npm i @azure-rest/ai-document-intelligence@1.1.0Die Datei Ihrer App
package.jsonwird mit den Abhängigkeiten aktualisiert.
Installieren Sie die
ai-form-recognizerClientbibliothek undazure/identitynpm-Pakete:npm i @azure/ai-form-recognizer@5.0.0 @azure/identity- Die Datei Ihrer App
package.jsonwird mit den Abhängigkeiten aktualisiert.
- Die Datei Ihrer App
Installieren Sie die
ai-form-recognizerClientbibliothek undazure/identitynpm-Pakete:npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
Erstellen Sie eine Im Anwendungsverzeichnis benannte
index.jsDatei.Tipp
- Sie können eine neue Datei mit PowerShell erstellen.
- Öffnen Sie ein PowerShell-Fenster in Ihrem Projektverzeichnis, indem Sie die UMSCHALTTASTE gedrückt halten und mit der rechten Maustaste auf den Ordner klicken.
- Geben Sie den folgenden Befehl New-Item index.jsein.
Erstellen Ihrer Anwendung
Um mit dem Dokumentintelligenzdienst zu interagieren, müssen Sie eine Instanz der DocumentIntelligenceClient Klasse erstellen. Dazu erstellen Sie eine AzureKeyCredential mit Ihrem key aus dem Azure-Portal und einer DocumentIntelligenceClient-Instanz mit der AzureKeyCredential und Ihrer Dokumentenintelligenz endpoint.
Um mit dem Dokumentintelligenzdienst zu interagieren, müssen Sie eine Instanz der DocumentAnalysisClient Klasse erstellen. Dazu erstellen Sie eine AzureKeyCredential mit Ihrem key aus dem Azure-Portal und eine DocumentAnalysisClient-Instanz mit dem AzureKeyCredential und Ihrem Formularerkennung endpoint.
Öffnen Sie die Datei
index.jsin Visual Studio Code oder Ihrer bevorzugten IDE. Kopieren Sie eines der folgenden Codebeispiele, und fügen Sie sie in Ihre Anwendung ein:
Wichtig
Wir empfehlen die Microsoft Entra ID-Authentifizierung mit verwalteten Identitäten für Azure-Ressourcen, um zu vermeiden, dass Anmeldeinformationen in Ihren Anwendungen gespeichert werden, die in der Cloud ausgeführt werden.
Verwenden Sie API-Schlüssel mit Vorsicht. Fügen Sie den API-Schlüssel nicht direkt in Ihren Code ein, und veröffentlichen Sie ihn nie öffentlich. Wenn Sie API-Schlüssel verwenden, speichern Sie sie sicher in Azure Key Vault, drehen Sie die Schlüssel regelmäßig, und beschränken Sie den Zugriff auf Azure Key Vault mithilfe rollenbasierter Zugriffssteuerung und Netzwerkzugriffseinschränkungen. Weitere Informationen zur sicheren Verwendung von API-Schlüsseln in Ihren Apps finden Sie unter API-Schlüssel mit Azure Key Vault.
Weitere Informationen zur Sicherheit von AI-Diensten finden Sie unter Authenticate-Anforderungen an Azure KI Services.
Layoutmodell
Extrahieren Sie Text, Markierungen, Textformatvorlagen, Tabellenstrukturen und Begrenzungsbereichskoordinaten aus Dokumenten.
- In diesem Beispiel benötigen Sie eine Dokumentdatei aus einer URL. Sie können unser sample-Dokument für diese Schnellstartanleitung verwenden.
- Der Datei-URL-Wert wurde der
formUrlVariablen am oberen Rand der Datei hinzugefügt.- Um eine bestimmte Datei aus einer URL zu analysieren, verwenden Sie die
beginAnalyzeDocumentsMethode und übergeben sieprebuilt-layoutals Modell-ID.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
// 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, { 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 = getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const pages = analyzeResult?.pages;
const tables = analyzeResult?.tables;
if (pages && pages.length > 0) {
console.log("Pages:");
for (const page of pages) {
console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
console.log(` ${page.width}x${page.height}`);
console.log(` ${page.lines?.length || 0} lines, ${page.words?.length || 0} words`);
}
} else {
console.log("No pages were extracted from the document.");
}
if (tables && tables.length > 0) {
console.log("Tables:");
for (const table of tables) {
console.log(
`- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
);
}
} else {
console.log("No tables were extracted from the document.");
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, führen Sie Ihr Programm aus:
Navigieren Sie zu dem Ordner, in dem Ihre Document Intelligence-Anwendung (doc-intel-app) vorhanden ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
node index.js
Fügen Sie der index.js Datei das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz aktualisieren:
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);
});
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, führen Sie Ihr Programm aus:
Navigieren Sie zu dem Ordner, in dem Ihre Document Intelligence-Anwendung (doc-intel-app) vorhanden ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
node index.js
Ausgabe des Layoutmodells
Hier ist ein Ausschnitt der erwarteten Ausgabe:
Pages:
- Page 1 (unit: inch)
8.5x11, angle: 0
69 lines, 425 words
Tables:
- Extracted table: 3 columns, 5 rows (15 cells)
Um die gesamte Ausgabe anzusehen, besuchen Sie das Azure-Beispiele-Repository auf GitHub, um das Layoutmodell-Output anzusehen.
Vorkonfiguriertes Modell
In diesem Beispiel analysieren wir eine Rechnung mithilfe des vorkonfigurierten Rechnungsmodells .
Tipp
Sie sind nicht auf Rechnungen beschränkt – es gibt mehrere vordefinierte Modelle, aus denen jeder eine eigene Gruppe unterstützter Felder hat. Das modell, das für den analyze Vorgang verwendet werden soll, hängt vom Typ des zu analysierenden Dokuments ab. Siehe Modelldatenextraktion.
- Analysieren Sie eine Rechnung mithilfe des vorkonfigurierten Rechnungsmodells. Sie können unser sample-Rechnungsdokument für diese Schnellstartanleitung verwenden.
- Wir haben der Variablen oben in der
invoiceUrlDatei den Datei-URL-Wert hinzugefügt. - Zum Analysieren einer bestimmten Datei bei einem URI verwenden Sie die
beginAnalyzeDocumentsMethode und übergebenPrebuiltModels.Invoicesie als Modell-ID. Der zurückgegebene Wert ist einresultObjekt, das Daten zum übermittelten Dokument enthält. - Aus Gründen der Einfachheit werden nicht alle Schlüssel-Wert-Paare angezeigt, die der Dienst zurückgibt. Die Liste aller unterstützten Felder und entsprechenden Typen finden Sie auf unserer Seite " Rechnungskonzept ".
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
// 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, { key });
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
.post({
contentType: "application/json",
body: {
urlSource: invoiceUrl,
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const invoice = documents && documents[0];
if (!invoice) {
throw new Error("Expected at least one invoice in the result.");
}
console.log(
"Extracted invoice:",
invoice.docType,
`(confidence: ${invoice.confidence || "<undefined>"})`
);
console.log("Fields:", invoice.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, führen Sie Ihr Programm aus:
Navigieren Sie zu dem Ordner, in dem Ihre Document Intelligence-Anwendung (doc-intel-app) vorhanden ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
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);
});
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, führen Sie Ihr Programm aus:
Navigieren Sie zu dem Ordner, in dem Ihre Document Intelligence-Anwendung (doc-intel-app) vorhanden ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
node index.js
Vorkonfigurierte Modellausgabe
Hier ist ein Ausschnitt der erwarteten Ausgabe:
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
Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Azure Samples-Repository auf GitHub, um die Ausgabe des prebuilt-Rechnungsmodells anzusehen.
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);
});
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, führen Sie Ihr Programm aus:
Navigieren Sie zu dem Ordner, in dem Ihre Document Intelligence-Anwendung (doc-intel-app) vorhanden ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
node index.js
Verwenden Sie in dieser Schnellstartanleitung die folgenden Features, um Daten aus Formularen und Dokumenten zu analysieren und zu extrahieren:
Layout – Analysieren und Extrahieren von Tabellen, Linien, Wörtern und Auswahlzeichen wie Optionsfeldern und Kontrollkästchen sowie Tasten-Wert-Paaren, ohne dass ein Modell trainiert werden muss.
Vorkonfigurierte Rechnung – Analysieren und Extrahieren allgemeiner Felder aus bestimmten Dokumenttypen mithilfe eines vortrainierten Modells.
Voraussetzungen
Azure-Abonnement – Kostenlos erstellen.
-
- Ihre Python-Installation sollte pip enthalten. Sie können überprüfen, ob pip installiert ist, indem Sie
pip --versionin der Befehlszeile ausführen. Holen Sie sich pip, indem Sie die neueste Version von Python installieren.
- Ihre Python-Installation sollte pip enthalten. Sie können überprüfen, ob pip installiert ist, indem Sie
Die neueste Version von Visual Studio Code oder Ihrer bevorzugten IDE. Weitere Informationen seeGetting Started with Python in Visual Studio Code.
Eine Foundry Tools- oder Document Intelligence-Ressource. Wenn Sie über Ihr Azure-Abonnement verfügen, erstellen Sie eine single-service oder multi-service Document Intelligence-Ressource im Azure Portal, um Ihren Schlüssel und Endpunkt abzurufen. Sie können das kostenlose Preisniveau (
F0) verwenden, um den Dienst zu testen und später auf eine kostenpflichtige Stufe für die Produktion zu aktualisieren.
Tipp
Erstellen Sie eine Microsoft Foundry-Ressource, wenn Sie beabsichtigen, unter einem einzelnen Endpunkt/Schlüssel auf mehrere Foundry-Tools zuzugreifen. Erstellen Sie für den Dokumentintelligenzzugriff nur eine Document Intelligence-Ressource. Sie benötigen eine Einzeldienstressource, wenn Sie Microsoft Entra authentication verwenden möchten.
Nachdem Ihre Ressource bereitgestellt wurde, wählen Sie "Zur Ressource wechseln" aus. Sie benötigen den Schlüssel und endpunkt aus der Ressource, die Sie erstellen, um Ihre Anwendung mit der Document Intelligence-API zu verbinden. Sie fügen Ihren Schlüssel und Endpunkt später in der Schnellstartanleitung in den Code ein:
Einrichten
Öffnen Sie ein Terminalfenster in Ihrer lokalen Umgebung, und installieren Sie die Azure Document Intelligence in foundry Tools-Clientbibliothek für Python mit Pip:
pip install azure-ai-documentintelligence==1.0.2
pip install azure-ai-formrecognizer==3.3.0
pip install azure-ai-formrecognizer==3.2.0b6
Erstellen Ihrer Python-Anwendung
Um mit dem Dokumentintelligenzdienst zu interagieren, müssen Sie eine Instanz der DocumentIntelligenceClient Klasse erstellen. Dazu erstellen Sie eine AzureKeyCredential mit Ihrem key aus dem Azure-Portal und einer DocumentIntelligenceClient-Instanz mit der AzureKeyCredential und Ihrer Dokumentenintelligenz endpoint.
Erstellen Sie eine neue Python Datei namens doc_intel_quickstart.py in Ihrem bevorzugten Editor oder Ihrer IDE.
Öffnen Sie die doc_intel_quickstart.py Datei, und wählen Sie eines der folgenden Codebeispiele aus, um sie in Ihre Anwendung zu kopieren und einzufügen:
Um mit dem Dokumentintelligenzdienst zu interagieren, müssen Sie eine Instanz der DocumentAnalysisClient Klasse erstellen. Dazu erstellen Sie eine AzureKeyCredential mit Ihrem key aus dem Azure-Portal und einer DocumentAnalysisClient-Instanz mit der AzureKeyCredential und Ihrer Dokumentenintelligenz endpoint.
Erstellen Sie eine neue Python Datei namens form_recognizer_quickstart.py in Ihrem bevorzugten Editor oder ihrer bevorzugten IDE.
Öffnen Sie die form_recognizer_quickstart.py Datei, und wählen Sie eines der folgenden Codebeispiele aus, um sie in Ihre Anwendung zu kopieren und einzufügen:
Wichtig
Wir empfehlen die Microsoft Entra ID-Authentifizierung mit verwalteten Identitäten für Azure-Ressourcen, um zu vermeiden, dass Anmeldeinformationen in Ihren Anwendungen gespeichert werden, die in der Cloud ausgeführt werden.
Verwenden Sie API-Schlüssel mit Vorsicht. Fügen Sie den API-Schlüssel nicht direkt in Ihren Code ein, und veröffentlichen Sie ihn nie öffentlich. Wenn Sie API-Schlüssel verwenden, speichern Sie sie sicher in Azure Key Vault, drehen Sie die Schlüssel regelmäßig, und beschränken Sie den Zugriff auf Azure Key Vault mithilfe rollenbasierter Zugriffssteuerung und Netzwerkzugriffseinschränkungen. Weitere Informationen zur sicheren Verwendung von API-Schlüsseln in Ihren Apps finden Sie unter API-Schlüssel mit Azure Key Vault.
Weitere Informationen zur Sicherheit von AI-Diensten finden Sie unter Authenticate-Anforderungen an Azure KI Services.
Layoutmodell
Extrahieren Sie Text, Markierungen, Textformatvorlagen, Tabellenstrukturen und Begrenzungsbereichskoordinaten aus Dokumenten.
- In diesem Beispiel benötigen Sie eine Dokumentdatei aus einer URL. Sie können unser sample-Dokument für diese Schnellstartanleitung verwenden.
- Wir haben der Variablen in der
formUrlanalyze_layoutFunktion den Datei-URL-Wert hinzugefügt.
Fügen Sie der doc_intel_quickstart.py Anwendung das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz aktualisieren:
# 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()
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:
Navigieren Sie zu dem Ordner, in dem Ihre doc_intel_quickstart.py Datei enthalten ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
python doc_intel_quickstart.py
Verwenden Sie die begin_analyze_document_from_url Methode und übergeben Sie prebuilt-layout als Modell-ID, um eine bestimmte Datei unter einer URL zu analysieren. Der zurückgegebene Wert ist ein result Objekt, das Daten zum übermittelten Dokument enthält.
Fügen Sie der form_recognizer_quickstart.py Anwendung das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrem Azure Portal Formularerkennung Instanz aktualisieren:
# 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()
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:
Navigieren Sie zu dem Ordner, in dem Ihre form_recognizer_quickstart.py Datei enthalten ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
python form_recognizer_quickstart.py
Ausgabe des Layoutmodells
Hier ist ein Ausschnitt der erwarteten Ausgabe:
----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
Um die gesamte Ausgabe anzusehen, besuchen Sie das Azure-Beispiele-Repository auf GitHub, um das Layoutmodell-Output anzusehen.
Fügen Sie der form_recognizer_quickstart.py Anwendung das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrem Azure Portal Formularerkennung Instanz aktualisieren:
# 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()
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:
Navigieren Sie zu dem Ordner, in dem Ihre form_recognizer_quickstart.py Datei enthalten ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
python form_recognizer_quickstart.py
Vorkonfiguriertes Modell
Analysieren und Extrahieren allgemeiner Felder aus bestimmten Dokumenttypen mithilfe eines vordefinierten Modells. In diesem Beispiel analysieren wir eine Rechnung mithilfe des vorkonfigurierten Rechnungsmodells .
Tipp
Sie sind nicht auf Rechnungen beschränkt – es gibt mehrere vordefinierte Modelle, aus denen jeder eine eigene Gruppe unterstützter Felder hat. Das modell, das für den analyze Vorgang verwendet werden soll, hängt vom Typ des zu analysierenden Dokuments ab. Siehe Modelldatenextraktion.
- Analysieren Sie eine Rechnung mithilfe des vorkonfigurierten Rechnungsmodells. Sie können unser sample-Rechnungsdokument für diese Schnellstartanleitung verwenden.
- Wir haben der Variablen oben in der
invoiceUrlDatei den Datei-URL-Wert hinzugefügt. - Aus Gründen der Einfachheit werden nicht alle Schlüssel-Wert-Paare angezeigt, die der Dienst zurückgibt. Die Liste aller unterstützten Felder und entsprechenden Typen finden Sie auf unserer Seite " Rechnungskonzept ".
Fügen Sie der doc_intel_quickstart.py Anwendung das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz aktualisieren:
# 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()
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:
Navigieren Sie zu dem Ordner, in dem Ihre doc_intel_quickstart.py Datei enthalten ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
python doc_intel_quickstart.py
Verwenden Sie die begin_analyze_document_from_url-Methode, und übergeben Sie prebuilt-invoice als Modell-ID, um eine bestimmte Datei an einem URI zu analysieren. Der zurückgegebene Wert ist ein result Objekt, das Daten zum übermittelten Dokument enthält.
Fügen Sie der form_recognizer_quickstart.py Anwendung das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrem Azure Portal Formularerkennung Instanz aktualisieren:
# 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()
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:
Navigieren Sie zu dem Ordner, in dem Ihre form_recognizer_quickstart.py Datei enthalten ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
python form_recognizer_quickstart.py
Vorkonfigurierte Modellausgabe
Hier ist ein Ausschnitt der erwarteten Ausgabe:
--------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
Um die gesamte Ausgabe anzuzeigen, besuchen Sie das Azure Samples-Repository auf GitHub, um die Ausgabe des prebuilt-Rechnungsmodells anzusehen.
Fügen Sie der form_recognizer_quickstart.py Anwendung das folgende Codebeispiel hinzu. Stellen Sie sicher, dass Sie die Schlüssel- und Endpunktvariablen mit Werten aus Ihrem Azure Portal Formularerkennung Instanz aktualisieren:
# 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()
Ausführen der Anwendung
Nachdem Sie Ihrer Anwendung ein Codebeispiel hinzugefügt haben, erstellen Sie Ihr Programm, und führen Sie es aus:
Navigieren Sie zu dem Ordner, in dem Ihre form_recognizer_quickstart.py Datei enthalten ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
python form_recognizer_quickstart.py
In dieser Schnellstartanleitung erfahren Sie, wie Sie die Rest-API für Dokumentintelligenz verwenden, um Daten und Werte aus Dokumenten zu analysieren und zu extrahieren:
Voraussetzungen
Azure-Abonnement – Create one for free
Das
cURLBefehlszeilentool ist installiert.PowerShell Version 7.*+ (oder eine ähnliche Befehlszeilenanwendung.):
Um Ihre PowerShell-Version zu überprüfen, geben Sie den folgenden Befehl relativ zu Ihrem Betriebssystem ein:
- Windows:
Get-Host | Select-Object Version - macOS oder Linux:
$PSVersionTable
- Windows:
Eine Ressource für Document Intelligence (Einzeldienstleistung) oder Foundry Tools (Mehrfachdienstleistungen). Wenn Sie über Ihr Azure-Abonnement verfügen, erstellen Sie eine single-service oder multi-service Document Intelligence-Ressource im Azure Portal, um Ihren Schlüssel und Endpunkt abzurufen. Sie können das kostenlose Preisniveau (
F0) verwenden, um den Dienst zu testen und später auf eine kostenpflichtige Stufe für die Produktion zu aktualisieren.
Tipp
Erstellen Sie eine Microsoft Foundry-Ressource, wenn Sie beabsichtigen, unter einem einzelnen Endpunkt/Schlüssel auf mehrere Foundry-Tools zuzugreifen. Erstellen Sie für den Dokumentintelligenzzugriff nur eine Document Intelligence-Ressource. Sie benötigen eine Einzeldienstressource, wenn Sie Microsoft Entra authentication verwenden möchten.
Nachdem Ihre Ressource bereitgestellt wurde, wählen Sie "Zur Ressource wechseln" aus. Sie benötigen den Schlüssel und endpunkt aus der Ressource, die Sie erstellen, um Ihre Anwendung mit der Document Intelligence-API zu verbinden. Sie fügen Ihren Schlüssel und Endpunkt später in der Schnellstartanleitung in den Code ein:
Analysieren von Dokumenten und Abrufen von Ergebnissen
Eine POST-Anforderung wird verwendet, um Dokumente mit einem vordefinierten oder benutzerdefinierten Modell zu analysieren. Eine GET-Anforderung wird verwendet, um das Ergebnis eines Dokumentanalyseaufrufs abzurufen. Dies modelId wird mit POST- und resultId GET-Vorgängen verwendet.
Dokument analysieren (POST-Anforderung)
Bevor Sie den cURL-Befehl ausführen, nehmen Sie die folgenden Änderungen an der Postanforderung vor:
Ersetzen Sie
{endpoint}durch den Endpunktwert aus Ihrer Azure Portal-Document Intelligence-Instanz.Ersetzen Sie
{key}durch den Schlüsselwert aus Ihrer Azure Portal Document Intelligence-Instanz.Verwenden Sie die folgende Tabelle als Referenz, um
{modelID}und{your-document-url}durch Ihre gewünschten Werte zu ersetzen.Sie benötigen eine Dokumentdatei unter einer URL. Für diese Schnellstartanleitung können Sie die in der folgenden Tabelle bereitgestellten Beispielformulare für jedes Feature verwenden:
Beispieldokumente
| Funktion | {modelID} | {your-document-url} |
|---|---|---|
| Lesen | prebuilt-read |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
| Layout | prebuilt-layout |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
| Krankenversicherungskarte | 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 |
| Rechnung | prebuilt-invoice |
https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
| Beleg | prebuilt-receipt |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
| ID-Dokument | prebuilt-idDocument |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Beispieldokumente
| Funktion | {modelID} | {your-document-url} |
|---|---|---|
| Allgemeines Dokument | prebuilt-document |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf |
| Lesen | prebuilt-read |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
| Layout | prebuilt-layout |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
| Krankenversicherungskarte | 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 |
| Rechnung | prebuilt-invoice |
https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
| Beleg | prebuilt-receipt |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
| ID-Dokument | prebuilt-idDocument |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
| Visitenkarte | prebuilt-businessCard |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg |
Wichtig
Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und veröffentlichen Sie ihn nie öffentlich. Verwenden Sie für die Produktion eine sichere Möglichkeit zum Speichern und Zugreifen auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen finden Sie unterFoundry Tools Security.
POST-Anforderung
curl -v -i -X POST "{endpoint}/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-11-30" -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-Antwort (resultID)
Sie erhalten eine 202 (Success) Antwort, die einen schreibgeschützten "Operation-Location"-Header enthält. Der Wert dieses Headers enthält eine resultID Abfrage, die abgefragt werden kann, um den Status des asynchronen Vorgangs abzurufen und die Ergebnisse mithilfe einer GET-Anforderung mit demselben Ressourcenabonnementschlüssel abzurufen:
Abrufen von Analyseergebnissen (GET-Anforderung)
Rufen Sie nach dem Aufrufen der Analyze document API die Get-Analyse-Ergebnis-API auf, um den Status des Vorgangs und die extrahierten Daten abzurufen. Bevor Sie den Befehl ausführen, nehmen Sie die folgenden Änderungen vor:
Rufen Sie nach dem Aufrufen der Analyze document API die Get-Analyse-Ergebnis-API auf, um den Status des Vorgangs und die extrahierten Daten abzurufen. Bevor Sie den Befehl ausführen, nehmen Sie die folgenden Änderungen vor:
Rufen Sie nach dem Aufrufen der Analyze document API die Get-Analyse-Ergebnis-API auf, um den Status des Vorgangs und die extrahierten Daten abzurufen. Bevor Sie den Befehl ausführen, nehmen Sie die folgenden Änderungen vor:
Ersetzen Sie
{resultID}Operation-Location Kopfzeile aus der POST-Antwort.Ersetzen Sie
{key}durch den Schlüsselwert aus Ihrer Document Intelligence-Instanz im Azure-Portal.
GET-Anforderung
curl -v -X GET "{endpoint}/documentintelligence/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2024-11-30" -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}"
Überprüfen der Antwort
Sie erhalten eine 200 (Success) Antwort mit JSON-Ausgabe. Das erste Feld, "status"gibt den Status des Vorgangs an. Wenn der Vorgang nicht abgeschlossen ist, hat "status" den Wert "running" oder "notStarted", und Sie sollten die API erneut aufrufen, entweder manuell oder über ein Skript. Es wird ein Intervall von einer Sekunde oder mehr zwischen Anrufen empfohlen.
Beispielantwort für vorkonfigurierte Rechnung
{
"status": "succeeded",
"createdDateTime": "2024-03-25T19:31:37Z",
"lastUpdatedDateTime": "2024-03-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2024-11-30",
"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
}
}],
}]
}
}
Unterstützte Dokumentfelder
Die vordefinierten Modelle extrahieren vordefinierte Gruppen von Dokumentfeldern. Siehe Modelldatenextraktion für extrahierte Feldnamen, Typen, Beschreibungen und Beispiele.
Das ist es, herzlichen Glückwunsch!
In dieser Schnellstartanleitung haben Sie ein Dokumentintelligenzmodell verwendet, um verschiedene Formulare und Dokumente zu analysieren. Erkunden Sie als Nächstes das Document Intelligence Studio und sehen Sie sich die Dokumentation an, um ausführliche Informationen zur Document Intelligence API zu erhalten.
Nächste Schritte
Informationen zur v3.1- zu v4.0-Migration finden Sie in den Änderungsprotokollmigrationshandbüchern.
Dieser Inhalt gilt für:
v2.1 | Neueste Version:
v4.0 (GA)
Erste Schritte mit Azure Document Intelligence mithilfe der Programmiersprache Ihrer Wahl oder der REST-API. Document Intelligence ist ein cloudbasierter Foundry Tools-Dienst, der maschinelles Lernen verwendet, um Schlüsselwertpaare, Text und Tabellen aus Ihren Dokumenten zu extrahieren. Es wird empfohlen, den kostenlosen Dienst zu verwenden, wenn Sie die Technologie erlernen. Denken Sie daran, dass die Anzahl der kostenlosen Seiten auf 500 pro Monat begrenzt ist.
Weitere Informationen zu Dokumentintelligenzfeatures und Entwicklungsoptionen finden Sie auf unserer Übersichtsseite .
Referenzdokumentation | Bibliotheksquellcode | Package (NuGet) | Beispiele
In dieser Schnellstartanleitung verwenden Sie die folgenden APIs, um strukturierte Daten aus Formularen und Dokumenten zu extrahieren:
Voraussetzungen
Azure-Abonnement – Kostenlos erstellen.
Die aktuelle Version von Visual Studio-IDE.
Eine Foundry Tools- oder Document Intelligence-Ressource. Nachdem Sie Ihr Azure-Abonnement haben, erstellen Sie eine single-service oder multi-service Document Intelligence-Ressource im Azure Portal, um Ihren Schlüssel und Endpunkt abzurufen. Sie können das kostenlose Preisniveau (
F0) verwenden, um den Dienst zu testen und später auf eine kostenpflichtige Stufe für die Produktion zu aktualisieren.Tipp
Erstellen Sie eine Gießereiressource, wenn Sie beabsichtigen, unter einem einzigen Endpunkt/Schlüssel auf mehrere Foundry-Tools zuzugreifen. Erstellen Sie für den Dokumentintelligenzzugriff nur eine Document Intelligence-Ressource. Beachten Sie, dass Sie eine Single-Service-Ressource benötigen, wenn Sie Microsoft Entra authentication verwenden möchten.
Nachdem Ihre Ressource bereitgestellt wurde, wählen Sie "Zur Ressource wechseln" aus. Sie benötigen den Schlüssel und endpunkt aus der Ressource, die Sie erstellen, um Ihre Anwendung mit der Document Intelligence-API zu verbinden. Sie fügen Ihren Schlüssel und Endpunkt später in der Schnellstartanleitung in den Code ein:
Einrichten
Starten Sie Visual Studio 2019.
Wählen Sie auf der Startseite "Neues Projekt erstellen" aus.
Geben Sie auf der Seite "Neues Projekt erstellen" die Konsole in das Suchfeld ein. Wählen Sie die Vorlage "Konsolenanwendung" und dann "Weiter" aus.
Geben Sie im Dialogfeld "Configure your new project" im Feld "Project Name"
formRecognizer_quickstartein. Wählen Sie dann "Weiter" aus.
Wählen Sie im Dialogfeld Zusätzliche Informationen.NET 5.0 (Current), und dann Erstellen aus.
Installieren der Clientbibliothek mit NuGet
Klicken Sie mit der rechten Maustaste auf Ihr formRecognizer_quickstart Projekt, und wählen Sie "NuGet-Pakete verwalten" aus.
Wählen Sie die Registerkarte "Durchsuchen" aus, und geben Sie Azure.AI.FormRecognizer ein.
Wählen Sie Version 3.1.1 im Dropdownmenü aus, und wählen Sie "Installieren" aus.
Erstellen Ihrer Anwendung
Um mit dem Dokumentintelligenzdienst zu interagieren, müssen Sie eine Instanz der FormRecognizerClient Klasse erstellen. Dazu erstellen Sie einen AzureKeyCredential mit Ihrem Schlüssel und eine FormRecognizerClient Instanz mit der AzureKeyCredential und Ihrer Dokumentintelligenz endpoint.
Hinweis
- Ab .NET 6 generieren neue Projekte mit der Vorlage
consoleeinen neuen Programmstil, der sich von früheren Versionen unterscheidet. - Die neue Ausgabe verwendet aktuelle C#-Features, die den Code vereinfachen, den Sie schreiben müssen.
- Wenn Sie die neuere Version verwenden, müssen Sie nur den Textkörper der
MainMethode schreiben. Sie müssen keine Anweisungen auf oberster Ebene, globale Using-Direktiven oder implizite Using-Direktiven einschließen. - Weitere Informationen finden Sie unter"Neue C#-Vorlagen generieren Anweisungen der obersten Ebene".
Öffnen Sie die datei Program.cs .
Verwenden Sie die folgenden Direktiven:
using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
- Legen Sie Ihre
endpointUndkeyUmgebungsvariablen fest, und erstellen Sie IhreAzureKeyCredentialundFormRecognizerClientInstanz:
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);
Löschen Sie die Zeile,
Console.Writeline("Hallo Welt!");, und fügen Sie eine der Try It Codebeispiele zu Program.csdatei hinzu:
Wählen Sie ein Codebeispiel aus, um es in die Main-Methode Ihrer Anwendung zu kopieren und einzufügen:
Wichtig
Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und veröffentlichen Sie ihn nie öffentlich. Verwenden Sie für die Produktion eine sichere Möglichkeit zum Speichern und Zugreifen auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen finden Sie im Sicherheitsartikel "Foundry Tools".
Probieren Sie es aus: Layoutmodell
Extrahieren Sie Text, Auswahlzeichen, Textformatvorlagen und Tabellenstrukturen sowie deren Begrenzungsbereichskoordinaten aus Dokumenten.
- In diesem Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Sie können unser sample-Dokument für diese Schnellstartanleitung verwenden.
- Wir haben der Variablen den Datei-URI-Wert
formUrihinzugefügt. - Verwenden Sie die
StartRecognizeContentFromUriAsyncMethode, um das Layout aus einer bestimmten Datei bei einem URI zu extrahieren.
Fügen Sie der Layoutanwendung Program.cs Datei den folgenden Code hinzu:
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}'.");
}
}
}
}
}
}
Probieren Sie es aus: Vorgefertigtes Modell
In diesem Beispiel wird veranschaulicht, wie Daten aus bestimmten Arten allgemeiner Dokumente mit vortrainierten Modellen mithilfe einer Rechnung als Beispiel analysiert werden.
- In diesem Beispiel analysieren wir ein Rechnungsdokument mithilfe eines vorgefertigten Modells. Sie können unser sample-Rechnungsdokument für diese Schnellstartanleitung verwenden.
- Wir haben den Datei-URI-Wert der
invoiceUriVariablen oben in der Main-Methode hinzugefügt. - Verwenden Sie die
StartRecognizeInvoicesFromUriAsyncMethode, um eine bestimmte Datei an einem URI zu analysieren. - Aus Gründen der Einfachheit werden nicht alle Felder angezeigt, die der Dienst zurückgibt. Die Liste aller unterstützten Felder und entsprechenden Typen finden Sie auf unserer Seite " Rechnungskonzept ".
Auswählen eines vordefinierten Modells
Sie sind nicht auf Rechnungen beschränkt – es gibt mehrere vordefinierte Modelle, aus denen jeder eine eigene Gruppe unterstützter Felder hat. Das modell, das für den Analysevorgang verwendet werden soll, hängt vom Typ des zu analysierenden Dokuments ab. Hier sind die vorgefertigten Modelle, die derzeit vom Dokumentintelligenzdienst unterstützt werden:
- Rechnung: extrahiert Text, Auswahlzeichen, Tabellen, Felder und wichtige Informationen aus Rechnungen.
- Beleg: extrahiert Text und wichtige Informationen aus Quittungen.
- ID-Dokument: extrahiert Text und wichtige Informationen aus Führerscheinen und internationalen Pässen.
- Visitenkarte: extrahiert Text und wichtige Informationen aus Visitenkarten.
Fügen Sie der vorgefertigten Rechnungsanwendung den folgenden Code zur Program.cs-Datei-Methode hinzu.
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}");
}
}
}
}
}
Ausführen der Anwendung
Wählen Sie die grüne Startschaltfläche neben formRecognizer_quickstart aus, um Ihr Programm zu erstellen und auszuführen, oder drücken Sie F5.
Reference-Dokumentation | Bibliothek-Quellcode | Package (Maven) | Beispiele
In dieser Schnellstartanleitung verwenden Sie die folgenden APIs, um strukturierte Daten aus Formularen und Dokumenten zu extrahieren:
Voraussetzungen
Azure-Abonnement – Kostenlos erstellen.
Ein Java Development Kit (JDK) Version 8 oder höher. Weitere Informationen sieheunterstützte Java-Versionen und Aktualisierungsplan.
Eine Foundry Tools- oder Document Intelligence-Ressource. Nachdem Sie Ihr Azure-Abonnement haben, erstellen Sie eine single-service oder multi-service Document Intelligence-Ressource im Azure Portal, um Ihren Schlüssel und Endpunkt abzurufen. Sie können das kostenlose Preisniveau (
F0) verwenden, um den Dienst zu testen und später auf eine kostenpflichtige Stufe für die Produktion zu aktualisieren.Nachdem Ihre Ressource bereitgestellt wurde, wählen Sie "Zur Ressource wechseln" aus. Sie benötigen den Schlüssel und endpunkt aus der Ressource, die Sie erstellen, um Ihre Anwendung mit der Document Intelligence-API zu verbinden. Sie fügen Ihren Schlüssel und Endpunkt später in der Schnellstartanleitung in den Code ein:
Einrichten
Erstellen eines neuen Gradle-Projekts
Erstellen Sie in einem Konsolenfenster (z. B. cmd, PowerShell oder Bash) ein neues Verzeichnis für Ihre App, die als Formularerkennungs-App bezeichnet wird, und navigieren Sie zu ihr.
mkdir form-recognizer-app && form-recognizer-app
Führen Sie den
gradle initBefehl aus Ihrem Arbeitsverzeichnis aus. Mit diesem Befehl werden wichtige Builddateien für Gradle erstellt, einschließlich build.gradle.kts, die zur Laufzeit zum Erstellen und Konfigurieren Ihrer Anwendung verwendet werden.gradle init --type basicWenn Sie aufgefordert werden, ein DSL auszuwählen, wählen Sie Kotlin aus.
Übernehmen des Standardprojektnamens (Formularerkennungs-App)
Installieren der Clientbibliothek
In dieser Schnellstartanleitung wird der Gradle-Abhängigkeits-Manager verwendet. Sie finden die Clientbibliothek und Informationen für andere Abhängigkeitsmanager im Maven Central Repository.
Fügen Sie in der Datei "build.gradle.kts " ihres Projekts die Clientbibliothek als implementation Anweisung zusammen mit den erforderlichen Plug-Ins und Einstellungen hinzu.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}
Erstellen einer Java Datei
Führen Sie in Ihrem Arbeitsverzeichnis den folgenden Befehl aus:
mkdir -p src/main/java
Sie erstellen die folgende Verzeichnisstruktur:
Navigieren Sie zum verzeichnis Java, und erstellen Sie eine Datei namens FormRecognizer.java. Öffnen Sie ihn in Ihrem bevorzugten Editor oder ihrer IDE, und fügen Sie die folgende Paketdeklaration und import -anweisungen hinzu:
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;
Wählen Sie ein Codebeispiel aus, um die Hauptmethode Ihrer Anwendung zu kopieren und einzufügen:
Wichtig
Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und veröffentlichen Sie ihn nie öffentlich. Verwenden Sie für die Produktion eine sichere Möglichkeit zum Speichern und Zugreifen auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen finden Sie unterFoundry Tools Security.
Probieren Sie es aus: Layoutmodell
Extrahieren Sie Text, Auswahlzeichen, Textformatvorlagen und Tabellenstrukturen sowie deren Begrenzungsbereichskoordinaten aus Dokumenten.
- In diesem Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Sie können unser sample-Dokument für diese Schnellstartanleitung verwenden.
- Zum Analysieren einer bestimmten Datei bei einem URI verwenden Sie die
beginRecognizeContentFromUrlMethode. - Wir haben der Variablen in der
formUrlHauptmethode den Datei-URI-Wert hinzugefügt.
Aktualisieren Sie die FormRecognizerKlasse Ihrer Anwendung mit dem folgenden Code (achten Sie darauf, die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz zu aktualisieren):
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();
});
});
}
Probieren Sie es aus: Vorgefertigtes Modell
In diesem Beispiel wird veranschaulicht, wie Daten aus bestimmten Arten allgemeiner Dokumente mit vortrainierten Modellen mithilfe einer Rechnung als Beispiel analysiert werden.
- In diesem Beispiel analysieren wir ein Rechnungsdokument mithilfe eines vorgefertigten Modells. Sie können unser sample-Rechnungsdokument für diese Schnellstartanleitung verwenden.
- Um eine bestimmte Datei mit einem URI zu analysieren, verwenden Sie die
beginRecognizeInvoicesFromUrl. - Wir haben der Variablen in der
invoiceUrlHauptmethode den Datei-URI-Wert hinzugefügt. - Aus Gründen der Einfachheit werden nicht alle Felder angezeigt, die der Dienst zurückgibt. Die Liste aller unterstützten Felder und entsprechenden Typen finden Sie auf unserer Seite " Rechnungskonzept ".
Auswählen eines vordefinierten Modells
Sie sind nicht auf Rechnungen beschränkt – es gibt mehrere vordefinierte Modelle, aus denen jeder eine eigene Gruppe unterstützter Felder hat. Das modell, das für den analyze Vorgang verwendet werden soll, hängt vom Typ des zu analysierenden Dokuments ab. Hier sind die vorgefertigten Modelle, die derzeit vom Dokumentintelligenzdienst unterstützt werden:
- Rechnung: extrahiert Text, Auswahlzeichen, Tabellen, Felder und wichtige Informationen aus Rechnungen.
- Beleg: extrahiert Text und wichtige Informationen aus Quittungen.
- ID-Dokument: extrahiert Text und wichtige Informationen aus Führerscheinen und internationalen Pässen.
- Visitenkarte: extrahiert Text und wichtige Informationen aus Visitenkarten.
Aktualisieren Sie die FormRecognizerKlasse Ihrer Anwendung mit dem folgenden Code (achten Sie darauf, die Schlüssel- und Endpunktvariablen mit Werten aus Ihrer Azure Portal-Document Intelligence-Instanz zu aktualisieren):
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());
}
}
}
}
Erstellen und Ausführen der Anwendung
Navigieren Sie zurück zum Hauptprojektverzeichnis – Formularerkennungs-App.
- Erstellen Sie Ihre Anwendung mit dem
buildBefehl:
gradle build
- Führen Sie Ihre Anwendung mit dem
runBefehl aus:
gradle run
In dieser Schnellstartanleitung verwenden Sie die folgenden APIs, um strukturierte Daten aus Formularen und Dokumenten zu extrahieren:
Voraussetzungen
Azure-Abonnement – Kostenlos erstellen.
Die neueste Version von Visual Studio Code oder Ihrer bevorzugten IDE.
Die neueste
LTSVersion von Node.jsEine Foundry Tools- oder Document Intelligence-Ressource. Nachdem Sie Ihr Azure-Abonnement haben, erstellen Sie eine single-service oder multi-service Document Intelligence-Ressource im Azure Portal, um Ihren Schlüssel und Endpunkt abzurufen. Sie können das kostenlose Preisniveau (
F0) verwenden, um den Dienst zu testen und später auf eine kostenpflichtige Stufe für die Produktion zu aktualisieren.Tipp
Erstellen Sie eine Gießereiressource, wenn Sie beabsichtigen, unter einem einzigen Endpunkt/Schlüssel auf mehrere Foundry-Tools zuzugreifen. Erstellen Sie für den Dokumentintelligenzzugriff nur eine Document Intelligence-Ressource. Beachten Sie, dass Sie eine Single-Service-Ressource benötigen, wenn Sie Microsoft Entra authentication verwenden möchten.
Nachdem Ihre Ressource bereitgestellt wurde, wählen Sie "Zur Ressource wechseln" aus. Sie benötigen den Schlüssel und endpunkt aus der Ressource, die Sie erstellen, um Ihre Anwendung mit der Document Intelligence-API zu verbinden. Sie fügen Ihren Schlüssel und Endpunkt später in der Schnellstartanleitung in den Code ein:
Einrichten
Erstellen Sie eine neue Node.js Anwendung. Erstellen Sie in einem Konsolenfenster (z. B. cmd, PowerShell oder Bash) ein neues Verzeichnis für Ihre App, und navigieren Sie zu ihr.
mkdir form-recognizer-app && cd form-recognizer-appFühren Sie den
npm initBefehl aus, um eine Knotenanwendung mit einerpackage.jsonDatei zu erstellen.npm initInstallieren Sie das npm-Paket der
ai-form-recognizerClientbibliothek:npm install @azure/ai-form-recognizerDie Datei Ihrer App
package.jsonwird mit den Abhängigkeiten aktualisiert.Erstellen Sie eine Datei mit dem Namen
index.js, öffnen Sie sie, und importieren Sie die folgenden Bibliotheken:const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");Erstellen Sie Variablen für den Azure Endpunkt und schlüssel Ihrer Ressource:
const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE"; const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";Zu diesem Zeitpunkt sollte Ihre JavaScript-Anwendung die folgenden Codezeilen enthalten:
const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer"); const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"; const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
Wählen Sie ein Codebeispiel aus, um es in Ihre Anwendung zu kopieren und einzufügen:
Wichtig
Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und veröffentlichen Sie ihn nie öffentlich. Verwenden Sie für die Produktion eine sichere Möglichkeit zum Speichern und Zugreifen auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen finden Sie unterFoundry Tools Security.
Probieren Sie es aus: Layoutmodell
- In diesem Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Sie können unser sample-Dokument für diese Schnellstartanleitung verwenden.
- Der Datei-URI-Wert wurde der
formUrlVariablen am oberen Rand der Datei hinzugefügt. - Zum Analysieren einer bestimmten Datei bei einem URI verwenden Sie die
beginRecognizeContentMethode.
Fügen Sie der Layoutanwendung in der Zeile unterhalb der key Variablen den folgenden Code hinzu:
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);
});
Probieren Sie es aus: Vorgefertigtes Modell
In diesem Beispiel wird veranschaulicht, wie Daten aus bestimmten Arten allgemeiner Dokumente mit vortrainierten Modellen mithilfe einer Rechnung als Beispiel analysiert werden. Eine vollständige Liste der Rechnungsfelder finden Sie auf unserer vorgefertigten Konzeptseite.
- In diesem Beispiel analysieren wir ein Rechnungsdokument mithilfe eines vorgefertigten Modells. Sie können unser sample-Rechnungsdokument für diese Schnellstartanleitung verwenden.
- Wir haben den Datei-URI-Wert der
invoiceUrlVariablen oben in der Datei hinzugefügt. - Zum Analysieren einer bestimmten Datei bei einem URI verwenden Sie die
beginRecognizeInvoicesMethode. - Aus Gründen der Einfachheit werden nicht alle Felder angezeigt, die der Dienst zurückgibt. Die Liste aller unterstützten Felder und entsprechenden Typen finden Sie auf unserer Seite " Rechnungskonzept ".
Auswählen eines vordefinierten Modells
Sie sind nicht auf Rechnungen beschränkt – es gibt mehrere vordefinierte Modelle, aus denen jeder eine eigene Gruppe unterstützter Felder hat. Das modell, das für den analyze Vorgang verwendet werden soll, hängt vom Typ des zu analysierenden Dokuments ab. Hier sind die vorgefertigten Modelle, die derzeit vom Dokumentintelligenzdienst unterstützt werden:
- Rechnung: extrahiert Text, Auswahlzeichen, Tabellen, Felder und wichtige Informationen aus Rechnungen.
- Beleg: extrahiert Text und wichtige Informationen aus Quittungen.
- ID-Dokument: extrahiert Text und wichtige Informationen aus Führerscheinen und internationalen Pässen.
- Visitenkarte: extrahiert Text und wichtige Informationen aus Visitenkarten.
Fügen Sie der vorkonfigurierten Rechnungsanwendung unter der key Variablen den folgenden Code hinzu.
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);
});
Reference-Dokumentation | Bibliotheksquellcode | Package (PyPi) | Beispiele
In dieser Schnellstartanleitung verwenden Sie die folgenden APIs, um strukturierte Daten aus Formularen und Dokumenten zu extrahieren:
Voraussetzungen
Azure-Abonnement – Create one for free
-
- Ihre Python-Installation sollte pip enthalten. Sie können überprüfen, ob pip installiert ist, indem Sie
pip --versionin der Befehlszeile ausführen. Holen Sie sich pip, indem Sie die neueste Version von Python installieren.
- Ihre Python-Installation sollte pip enthalten. Sie können überprüfen, ob pip installiert ist, indem Sie
Eine Foundry Tools- oder Document Intelligence-Ressource. Nachdem Sie Ihr Azure-Abonnement haben, erstellen Sie eine single-service oder multi-service Document Intelligence-Ressource im Azure Portal, um Ihren Schlüssel und Endpunkt abzurufen. Sie können das kostenlose Preisniveau (
F0) verwenden, um den Dienst zu testen und später auf eine kostenpflichtige Stufe für die Produktion zu aktualisieren.Tipp
Erstellen Sie eine Gießereiressource, wenn Sie beabsichtigen, unter einem einzigen Endpunkt/Schlüssel auf mehrere Foundry-Tools zuzugreifen. Erstellen Sie für den Dokumentintelligenzzugriff nur eine Document Intelligence-Ressource. Beachten Sie, dass Sie eine Single-Service-Ressource benötigen, wenn Sie Microsoft Entra authentication verwenden möchten.
Nachdem Ihre Ressource bereitgestellt wurde, wählen Sie "Zur Ressource wechseln" aus. Sie benötigen den Schlüssel und endpunkt aus der Ressource, die Sie erstellen, um Ihre Anwendung mit der Document Intelligence-API zu verbinden. Sie fügen Ihren Schlüssel und Endpunkt später in der Schnellstartanleitung in den Code ein:
Einrichten
Öffnen Sie ein Terminalfenster in Ihrer lokalen Umgebung, und installieren Sie die Azure Document Intelligence in foundry Tools-Clientbibliothek für Python mit Pip:
pip install azure-ai-formrecognizer
Erstellen einer neuen Python Anwendung
Erstellen Sie eine neue Python Anwendung namens form_recognizer_quickstart.py in Ihrem bevorzugten Editor oder Ihrer IDE. Importieren Sie dann die folgenden Bibliotheken:
import os
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential
Erstellen von Variablen für den Azure Ressourcenendpunkt und Schlüssel
endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"
Zu diesem Zeitpunkt sollte Ihre Python Anwendung die folgenden Codezeilen enthalten:
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"
Wählen Sie ein Codebeispiel aus, um es in Ihre Anwendung zu kopieren und einzufügen:
Wichtig
Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und veröffentlichen Sie ihn nie öffentlich. Verwenden Sie für die Produktion eine sichere Möglichkeit zum Speichern und Zugreifen auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen finden Sie unterFoundry Tools Security.
Probieren Sie es aus: Layoutmodell
- In diesem Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Sie können unser sample-Dokument für diese Schnellstartanleitung verwenden.
- Der Datei-URI-Wert wurde der
formUrlVariablen am oberen Rand der Datei hinzugefügt. - Zum Analysieren einer bestimmten Datei bei einem URI verwenden Sie die
begin_recognize_content_from_urlMethode.
Fügen Sie der Layoutanwendung in der Zeile unterhalb der key Variablen den folgenden Code hinzu:
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()
Probieren Sie es aus: Vorgefertigtes Modell
In diesem Beispiel wird veranschaulicht, wie Daten aus bestimmten Arten allgemeiner Dokumente mit vortrainierten Modellen mithilfe einer Rechnung als Beispiel analysiert werden. Eine vollständige Liste der Rechnungsfelder finden Sie auf unserer vorgefertigten Konzeptseite.
- In diesem Beispiel analysieren wir ein Rechnungsdokument mithilfe eines vorgefertigten Modells. Sie können unser sample-Rechnungsdokument für diese Schnellstartanleitung verwenden.
- Wir haben den Datei-URI-Wert zur Variablen "formUrl" oben in der Datei hinzugefügt.
- Um eine bestimmte Datei an einem URI zu analysieren, verwenden Sie die Methode "begin_recognize_invoices_from_url".
- Aus Gründen der Einfachheit werden nicht alle Felder angezeigt, die der Dienst zurückgibt. Die Liste aller unterstützten Felder und entsprechenden Typen finden Sie auf unserer Seite " Rechnungskonzept ".
Auswählen eines vordefinierten Modells
Sie sind nicht auf Rechnungen beschränkt – es gibt mehrere vordefinierte Modelle, aus denen jeder eine eigene Gruppe unterstützter Felder hat. Das modell, das für den analyze Vorgang verwendet werden soll, hängt vom Typ des zu analysierenden Dokuments ab. Hier sind die vorgefertigten Modelle, die derzeit vom Dokumentintelligenzdienst unterstützt werden:
- Rechnung: extrahiert Text, Auswahlzeichen, Tabellen, Felder und wichtige Informationen aus Rechnungen.
- Beleg: extrahiert Text und wichtige Informationen aus Quittungen.
- ID-Dokument: extrahiert Text und wichtige Informationen aus Führerscheinen und internationalen Pässen.
- Visitenkarte: extrahiert Text und wichtige Informationen aus Visitenkarten.
Fügen Sie der vorkonfigurierten Rechnungsanwendung unter der key Variablen den folgenden Code hinzu.
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()
Ausführen der Anwendung
Navigieren Sie zu dem Ordner, in dem Ihre form_recognizer_quickstart.py Datei enthalten ist.
Geben Sie den folgenden Befehl in Ihr Terminal ein:
python form_recognizer_quickstart.py
REST-API | Document Intelligence | Azure REST-API-Referenz |
In dieser Schnellstartanleitung verwenden Sie die folgenden APIs, um strukturierte Daten aus Formularen und Dokumenten zu extrahieren:
Voraussetzungen
Azure-Abonnement – Create one for free
cURL installiert.
PowerShell, Version 6.0+, oder eine ähnliche Befehlszeilenanwendung.
Eine Foundry Tools- oder Document Intelligence-Ressource. Nachdem Sie Ihr Azure-Abonnement haben, erstellen Sie eine single-service oder multi-service Document Intelligence-Ressource im Azure Portal, um Ihren Schlüssel und Endpunkt abzurufen. Sie können das kostenlose Preisniveau (
F0) verwenden, um den Dienst zu testen und später auf eine kostenpflichtige Stufe für die Produktion zu aktualisieren.Tipp
Erstellen Sie eine Gießereiressource, wenn Sie beabsichtigen, unter einem einzigen Endpunkt/Schlüssel auf mehrere Foundry-Tools zuzugreifen. Erstellen Sie für den Dokumentintelligenzzugriff nur eine Document Intelligence-Ressource. Beachten Sie, dass Sie eine Single-Service-Ressource benötigen, wenn Sie Microsoft Entra authentication verwenden möchten.
Nachdem Ihre Ressource bereitgestellt wurde, wählen Sie "Zur Ressource wechseln" aus. Sie benötigen den Schlüssel und endpunkt aus der Ressource, die Sie erstellen, um Ihre Anwendung mit der Document Intelligence-API zu verbinden. Sie fügen Ihren Schlüssel und Endpunkt später in der Schnellstartanleitung in den Code ein:
Wählen Sie ein Codebeispiel aus, um es in Ihre Anwendung zu kopieren und einzufügen:
Wichtig
Denken Sie daran, den Schlüssel aus Ihrem Code zu entfernen, wenn Sie fertig sind, und veröffentlichen Sie ihn nie öffentlich. Verwenden Sie für die Produktion eine sichere Möglichkeit zum Speichern und Zugreifen auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen finden Sie unterFoundry Tools Security.
Probieren Sie es aus: Layoutmodell
- In diesem Beispiel benötigen Sie eine Dokumentdatei unter einem URI. Sie können unser sample-Dokument für diese Schnellstartanleitung verwenden.
- Ersetzen Sie den
{endpoint}Endpunkt, den Sie mit Ihrem Document Intelligence-Abonnement erhalten haben. - Ersetzen Sie den
{key}Schlüssel, den Sie aus dem vorherigen Schritt kopiert haben. - Ersetzen Sie
\"{your-document-url}mit der URL eines Beispieldokuments.
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Anfrage
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}'}"
Betriebsstandort
Sie erhalten eine 202 (Success) Antwort, die einen Operation-Location-Header enthält. Der Wert dieses Headers enthält eine Ergebnis-ID, mit der Sie den Status des asynchronen Vorgangs abfragen und die Ergebnisse abrufen können:
https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.
Im folgenden Beispiel ist die Zeichenfolge nach analyzeResults/ als Teil der URL die Ergebnis-ID.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Layout-Ergebnisse abrufen
Nachdem Sie die Analyze Layout API aufgerufen haben, rufen Sie die Get Analyze Layout Result API auf, um den Status des Vorgangs und die extrahierten Daten abzurufen. Bevor Sie den Befehl ausführen, nehmen Sie die folgenden Änderungen vor:
- Ersetzen Sie den
{endpoint}Endpunkt, den Sie mit Ihrem Document Intelligence-Abonnement erhalten haben. - Ersetzen Sie den
{key}Schlüssel, den Sie aus dem vorherigen Schritt kopiert haben. - Ersetzen Sie
{resultId}durch die Ergebnis-ID aus dem vorherigen Schritt.
Anfrage
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Untersuchen der Ergebnisse
Sie erhalten eine 200 (success) Antwort mit JSON-Inhalten.
Sehen Sie sich das folgende Rechnungsbild und die entsprechende JSON-Ausgabe an.
- Der
"readResults"-Knoten enthält jede Textzeile mit der entsprechenden Begrenzungsfeldplatzierung auf der Seite. - Der
selectionMarksKnoten zeigt jedes Auswahlzeichen (Kontrollkästchen, Optionsfeld) und ob sein Status istselectedoderunselected. - Der
"pageResults"Abschnitt enthält die extrahierten Tabellen. Für jede Tabelle werden der Text-, Zeilen- und Spaltenindex, das zeilen- und spaltenübergreifende Verhalten, der Begrenzungsrahmen und vieles mehr extrahiert.
Antworttext
Sie können sich die vollständige Beispielausgabe auf GitHub anzeigen lassen.
Probieren Sie es aus: Vorgefertigtes Modell
- In diesem Beispiel analysieren wir ein Rechnungsdokument mithilfe eines vorgefertigten Modells. Sie können unser sample-Rechnungsdokument für diese Schnellstartanleitung verwenden.
Auswählen eines vordefinierten Modells
Sie sind nicht auf Rechnungen beschränkt – es gibt mehrere vordefinierte Modelle, aus denen jeder eine eigene Gruppe unterstützter Felder hat. Das modell, das für den analyze Vorgang verwendet werden soll, hängt vom Typ des zu analysierenden Dokuments ab. Hier sind die vorgefertigten Modelle, die derzeit vom Dokumentintelligenzdienst unterstützt werden:
- Rechnung: extrahiert Text, Auswahlzeichen, Tabellen, Felder und wichtige Informationen aus Rechnungen.
- Beleg: extrahiert Text und wichtige Informationen aus Quittungen.
- ID-Dokument: extrahiert Text und wichtige Informationen aus Führerscheinen und internationalen Pässen.
- Visitenkarte: extrahiert Text und wichtige Informationen aus Visitenkarten.
Bevor Sie den Befehl ausführen, nehmen Sie die folgenden Änderungen vor:
Ersetzen Sie den
{endpoint}Endpunkt, den Sie mit Ihrem Document Intelligence-Abonnement erhalten haben.Ersetzen Sie den
{key}Schlüssel, den Sie aus dem vorherigen Schritt kopiert haben.Ersetzen Sie
\"{your-document-url}durch eine Beispielrechnungs-URL:https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf
Anfrage
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}'}"
Betriebsstandort
Sie erhalten eine 202 (Success) Antwort, die einen Operation-Location-Header enthält. Der Wert dieses Headers enthält eine Ergebnis-ID, mit der Sie den Status des asynchronen Vorgangs abfragen und die Ergebnisse abrufen können:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}
Im folgenden Beispiel ist die Zeichenfolge nach analyzeResults/ in der URL die Ergebnis-ID:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Abrufen von Rechnungsergebnissen
Nachdem Sie die Analyze Invoice API aufgerufen haben, rufen Sie die GET Analyze Invoice Result API auf, um den Status des Vorgangs und die extrahierten Daten abzurufen. Bevor Sie den Befehl ausführen, nehmen Sie die folgenden Änderungen vor:
- Ersetzen Sie den
{endpoint}-Endpunkt, den Sie mit Ihrem Document Intelligence-Schlüssel abgerufen haben. Sie finden sie auf der Registerkarte "Übersicht" der Dokumentintelligenzressourcen. - Ersetzen Sie
{resultId}durch die Ergebnis-ID aus dem vorherigen Schritt. - Ersetzen Sie
{key}durch Ihren Schlüssel.
Anfrage
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Überprüfen der Antwort
Sie erhalten eine 200 (Success) Antwort mit JSON-Ausgabe.
- Das
"readResults"Feld enthält jede Textzeile, die aus der Rechnung extrahiert wurde. - Darin
"pageResults"sind die Tabellen und Auswahlmarkierungen enthalten, die aus der Rechnung extrahiert wurden. - Das
"documentResults"Feld enthält Schlüssel-/Wertinformationen für die relevantesten Teile der Rechnung.
Sehen Sie sich das Dokument Beispielrechnung an.
Antworttext
Sehen Sie sich den vollständigen Beispiel-Output auf GitHub an.
Das ist es, gut gemacht!
Nächste Schritte
Probieren Sie das Document Intelligence Studio aus, um eine verbesserte Erfahrung und erweiterte Modellqualität zu erzielen.
Das Studio unterstützt jedes Modell, das mit v2.1 bezeichneten Daten trainiert wurde.
Die Changelogs enthalten detaillierte Informationen zur Migration von v3.1 zu v4.0.