Začínáme s funkcí Document Intelligence
Důležité
- Služba Azure Cognitive Services Rozpoznávání formulářů je teď azure AI Document Intelligence.
- Některé platformy stále čekají na aktualizaci přejmenování.
- Všechny zmínky o Rozpoznávání formulářů nebo funkci Document Intelligence v naší dokumentaci odkazují na stejnou službu Azure.
Tento obsah se vztahuje na: v4.0 (GA) Starší verze: v3.1 (GA) v3.0 (GA)
- Začínáme s nejnovější stabilní verzí v4.0
2024-11-30
(GA) v Azure AI Document Intelligence
Tento obsah se vztahuje na: v3.1 (GA) Dřívější verze: v3.0 v2.1
- Začínáme s Azure Rozpoznávání formulářů nejnovější verzí GA (
2023-07-31
).
Tento obsah se vztahuje na: v3.0 (GA) Novější verze: v3.1 v2.1
- Začínáme s azure Rozpoznávání formulářů starší verzí GA (
2022-08-31
).
Azure AI Document Intelligence / Rozpoznávání formulářů je cloudová služba Azure AI, která využívá strojové učení k extrakci párů klíč-hodnota, textu, tabulek a klíčových dat z dokumentů.
Modely zpracování dokumentů můžete snadno integrovat do pracovních postupů a aplikací pomocí sady SDK programovacího jazyka nebo voláním rozhraní REST API.
Při učení technologie pro účely tohoto rychlého startu doporučujeme používat bezplatnou službu. Mějte na paměti, že počet bezplatných stránek je omezený na 500 za měsíc.
Další informace o funkcích rozhraní API a možnostech vývoje najdete na naší stránce Přehled .
Referenční referenční | informace k sadě SDK klientské knihovny | – Ukázky referenčních|balíčků| REST API | – Podporovaná verze rozhraní REST API
Referenční referenční balíček rozhraní API | sady SDK | klientské knihovny | (NuGet) | Ukázky | podporované verze rozhraní REST API
Referenční referenční | informace k sadě SDK klientské knihovny | – Ukázky referenčních |balíčků | REST API | – Podporovaná verze rozhraní REST API
V tomto rychlém startu můžete pomocí následujících funkcí analyzovat a extrahovat data a hodnoty z formulářů a dokumentů:
Model rozložení – Analýza a extrahování tabulek, čar, slov a výběrových značek, jako jsou přepínače a zaškrtávací políčka v dokumentech, aniž byste museli model trénovat.
Předem připravený model – Analýza a extrahování běžných polí z konkrétních typů dokumentů pomocí předem připraveného modelu
Požadavky
Předplatné Azure – Vytvořte si ho zdarma.
Aktuální verze integrovaného vývojového prostředí sady Visual Studio.
Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek s jednou službou nebo více službami Azure AI, abyste získali klíč a koncový bod.
K vyzkoušení služby můžete použít cenovou úroveň
F0
Free a později upgradovat na placenou úroveň pro produkční prostředí.
Tip
Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.
Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:
Služby Azure AI nebo prostředek Rozpoznávání formulářů Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek s jednou službou nebo více službami Azure AI, abyste získali klíč a koncový bod.
K vyzkoušení služby můžete použít cenovou úroveň
F0
Free a později upgradovat na placenou úroveň pro produkční prostředí.
Tip
Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro Rozpoznávání formulářů přístup vytvořte prostředek Rozpoznávání formulářů. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.
Po nasazení prostředku vyberte Přejít k prostředku. K připojení aplikace k rozhraní API Rozpoznávání formulářů potřebujete klíč a koncový bod z prostředku, který vytvoříte. Klíč a koncový bod vložíte do kódu později v rychlém startu:
Nastavení
Spusťte Visual Studio.
Na úvodní stránce zvolte Vytvořit nový projekt.
Na stránce Vytvořit nový projekt zadejte konzolu do vyhledávacího pole. Zvolte šablonu konzolové aplikace a pak zvolte Další.
- V dialogovém okně Konfigurovat nový projekt zadejte
doc_intel_quickstart
do pole Název projektu. Pak zvolte Další.
- V dialogovém okně Konfigurovat nový projekt zadejte
form_recognizer_quickstart
do pole Název projektu. Pak zvolte Další.
V dialogovém okně Další informace vyberte .NET 8.0 (dlouhodobá podpora) a pak vyberte Vytvořit.
Instalace klientské knihovny pomocí NuGetu
Klikněte pravým tlačítkem na projekt doc_intel_quickstart a vyberte Spravovat balíčky NuGet... .
Vyberte kartu Procházet a zadejte Azure.AI.DocumentIntelligence.
Zaškrtněte
Include prerelease
políčko.V rozevírací nabídce zvolte verzi a nainstalujte balíček do projektu.
Klikněte pravým tlačítkem na projekt form_recognizer_quickstart a vyberte Spravovat balíčky NuGet... .
Vyberte kartu Procházet a zadejte Azure.AI.FormRecognizer. V rozevírací nabídce vyberte verzi 4.1.0.
Klikněte pravým tlačítkem na projekt form_recognizer_quickstart a vyberte Spravovat balíčky NuGet... .
Vyberte kartu Procházet a zadejte Azure.AI.FormRecognizer. V rozevírací nabídce vyberte verzi 4.0.0.
Sestavení aplikace
Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentIntelligenceClient
třídy. Uděláte to tak, že vytvoříte na key
webu Azure Portal DocumentIntelligenceClient
a AzureKeyCredential
instanci s AzureKeyCredential
funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint
.
Pokud chcete pracovat se službou Rozpoznávání formulářů, musíte vytvořit instanci DocumentAnalysisClient
třídy. Uděláte to tak, že vytvoříte na webu Azure Portal DocumentAnalysisClient
a AzureKeyCredential
key
instanci s AzureKeyCredential
Rozpoznávání formulářů endpoint
.
Poznámka:
- Od .NET 6 vygenerují nové projekty používající
console
šablonu nový styl programu, který se liší od předchozích verzí. - Nový výstup používá nedávné funkce jazyka C#, které zjednodušují psaní kódu.
- Pokud používáte novější verzi, stačí napsat pouze tělo
Main
metody. Nemusíte zahrnovat příkazy nejvyšší úrovně, globální direktivy using ani implicitní direktivy using. - Další informace najdete v tématu Nové šablony jazyka C#, které generují příkazy nejvyšší úrovně.
Otevřete soubor Program.cs.
Odstraňte existující kód, včetně řádku
Console.Writeline("Hello World!")
, a vyberte jednu z následujících ukázek kódu, které zkopírujete a vložíte do souboru Program.cs vaší aplikace:
Důležité
Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.
Model rozložení
Extrahujte text, značky výběru, styly textu, struktury tabulky a souřadnice ohraničující oblasti z dokumentů.
- V tomto příkladu budete potřebovat soubor dokumentu z identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
- Do proměnné v horní části skriptu jsme přidali hodnotu
Uri fileUri
identifikátoru URI souboru. - Pokud chcete extrahovat rozložení z daného souboru na identifikátor URI, použijte metodu
StartAnalyzeDocumentFromUri
a předejteprebuilt-layout
ji jako ID modelu. VrácenáAnalyzeResult
hodnota je objekt obsahující data z odeslaného dokumentu.
Do souboru Program.cs přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:
using Azure;
using Azure.AI.DocumentIntelligence;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
UrlSource= fileUri
};
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", content);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s)," +
$" and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i}:");
Console.WriteLine($" Content: '{line.Content}'");
Console.Write(" Bounding polygon, with points ordered clockwise:");
for (int j = 0; j < line.Polygon.Count; j += 2)
{
Console.Write($" ({line.Polygon[j]}, {line.Polygon[j + 1]})");
}
Console.WriteLine();
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" State: {selectionMark.State}");
Console.Write(" Bounding polygon, with points ordered clockwise:");
for (int j = 0; j < selectionMark.Polygon.Count; j++)
{
Console.Write($" ({selectionMark.Polygon[j]}, {selectionMark.Polygon[j + 1]})");
}
Console.WriteLine();
}
}
for (int i = 0; i < result.Paragraphs.Count; i++)
{
DocumentParagraph paragraph = result.Paragraphs[i];
Console.WriteLine($"Paragraph {i}:");
Console.WriteLine($" Content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
var handwrittenContent = result.Content.Substring(span.Offset, span.Length);
Console.WriteLine($" {handwrittenContent}");
}
}
}
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) is a '{cell.Kind}' with content: {cell.Content}");
}
}
Spuštění aplikace
Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.
Do souboru Program.cs přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding box is:");
Console.WriteLine($" Upper left => X: {line.BoundingPolygon[0].X}, Y= {line.BoundingPolygon[0].Y}");
Console.WriteLine($" Upper right => X: {line.BoundingPolygon[1].X}, Y= {line.BoundingPolygon[1].Y}");
Console.WriteLine($" Lower right => X: {line.BoundingPolygon[2].X}, Y= {line.BoundingPolygon[2].Y}");
Console.WriteLine($" Lower left => X: {line.BoundingPolygon[3].X}, Y= {line.BoundingPolygon[3].Y}");
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding box is:");
Console.WriteLine($" Upper left => X: {selectionMark.BoundingPolygon[0].X}, Y= {selectionMark.BoundingPolygon[0].Y}");
Console.WriteLine($" Upper right => X: {selectionMark.BoundingPolygon[1].X}, Y= {selectionMark.BoundingPolygon[1].Y}");
Console.WriteLine($" Lower right => X: {selectionMark.BoundingPolygon[2].X}, Y= {selectionMark.BoundingPolygon[2].Y}");
Console.WriteLine($" Lower left => X: {selectionMark.BoundingPolygon[3].X}, Y= {selectionMark.BoundingPolygon[3].Y}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Spuštění aplikace
Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.
Výstup modelu rozložení
Tady je fragment očekávaného výstupu:
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
Pokud chcete zobrazit celý výstup, přejděte do úložiště ukázek Azure na GitHubu a zobrazte výstup modelu rozložení.
Do souboru Program.cs přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < line.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.BoundingPolygon[j].X}, Y: {line.BoundingPolygon[j].Y}");
}
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < selectionMark.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.BoundingPolygon[j].X}, Y: {selectionMark.BoundingPolygon[j].Y}");
}
}
}
Console.WriteLine("Paragraphs:");
foreach (DocumentParagraph paragraph in result.Paragraphs)
{
Console.WriteLine($" Paragraph content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Extract the layout of a document from a file stream
To extract the layout from a given file at a file stream, use the AnalyzeDocument method and pass prebuilt-layout as the model ID. The returned value is an AnalyzeResult object containing data about the submitted document.
string filePath = "<filePath>";
using var stream = new FileStream(filePath, FileMode.Open);
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", stream);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < line.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.BoundingPolygon[j].X}, Y: {line.BoundingPolygon[j].Y}");
}
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < selectionMark.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.BoundingPolygon[j].X}, Y: {selectionMark.BoundingPolygon[j].Y}");
}
}
}
Console.WriteLine("Paragraphs:");
foreach (DocumentParagraph paragraph in result.Paragraphs)
{
Console.WriteLine($" Paragraph content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Spuštění aplikace
Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.
Předem připravený model
Analyzujte a extrahujte běžná pole z konkrétních typů dokumentů pomocí předem vytvořeného modelu. V tomto příkladu analyzujeme fakturu pomocí předem připraveného modelu faktury .
Tip
Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze
operaci, závisí na typu dokumentu, který se má analyzovat. Viz extrakce dat modelu.
- Analýza faktury pomocí předem vytvořeného modelu faktury Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
- Do proměnné v horní části souboru Program.cs jsme přidali hodnotu
Uri invoiceUri
identifikátoru URI souboru. - Pokud chcete analyzovat daný soubor pomocí identifikátoru URI, použijte metodu
StartAnalyzeDocumentFromUri
a předejteprebuilt-invoice
ji jako ID modelu. VrácenáAnalyzeResult
hodnota je objekt obsahující data z odeslaného dokumentu. - Pro zjednodušení se zde nezobrazují všechny páry klíč-hodnota, které služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .
Do souboru Program.cs přidejte následující ukázku kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:
using Azure;
using Azure.AI.DocumentIntelligence;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
//sample invoice document
Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");
AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
UrlSource = invoiceUri
};
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", content);
AnalyzeResult result = operation.Value;
for (int i = 0; i < result.Documents.Count; i++)
{
Console.WriteLine($"Document {i}:");
AnalyzedDocument document = result.Documents[i];
if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField)
&& vendorNameField.Type == DocumentFieldType.String)
{
string vendorName = vendorNameField.ValueString;
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField)
&& customerNameField.Type == DocumentFieldType.String)
{
string customerName = customerNameField.ValueString;
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
&& itemsField.Type == DocumentFieldType.Array)
{
foreach (DocumentField itemField in itemsField.ValueArray)
{
Console.WriteLine("Item:");
if (itemField.Type == DocumentFieldType.Object)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueObject;
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField)
&& itemDescriptionField.Type == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.ValueString;
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField)
&& itemAmountField.Type == DocumentFieldType.Currency)
{
CurrencyValue itemAmount = itemAmountField.ValueCurrency;
Console.WriteLine($" Amount: '{itemAmount.CurrencySymbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
}
}
}
}
if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField)
&& subTotalField.Type == DocumentFieldType.Currency)
{
CurrencyValue subTotal = subTotalField.ValueCurrency;
Console.WriteLine($"Sub Total: '{subTotal.CurrencySymbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
}
if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField)
&& totalTaxField.Type == DocumentFieldType.Currency)
{
CurrencyValue totalTax = totalTaxField.ValueCurrency;
Console.WriteLine($"Total Tax: '{totalTax.CurrencySymbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
}
if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField)
&& invoiceTotalField.Type == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
Console.WriteLine($"Invoice Total: '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
}
}
Spuštění aplikace
Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.
Do souboru Program.cs přidejte následující ukázku kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:
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}");
}
}
}
Spuštění aplikace
Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.
Předem připravený výstup modelu
Tady je fragment očekávaného výstupu:
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
Pokud chcete zobrazit celý výstup, navštivte úložiště ukázek Azure na GitHubu a podívejte se na předem připravený výstup modelu faktury.
Do souboru Program.cs přidejte následující ukázku kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:
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}");
}
}
}
Spuštění aplikace
Po přidání ukázky kódu do aplikace zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.
Referenční | referenční balíček rozhraní REST API | sady SDK klientské knihovny | (Maven) | – ukázky |podporované verze rozhraní REST API
Referenční | referenční balíček rozhraní REST API | sady SDK klientské knihovny | (Maven) | – ukázky| podporované verze rozhraní REST API
Referenční | referenční balíček rozhraní REST API | sady SDK klientské knihovny | (Maven) | – ukázky|podporované verze rozhraní REST API
V tomto rychlém startu můžete pomocí následujících funkcí analyzovat a extrahovat data a hodnoty z formulářů a dokumentů:
Rozložení – Analýza a extrahování tabulek, řádků, slov a výběrových značek, jako jsou přepínače a zaškrtávací políčka v dokumentech, bez nutnosti trénovat model.
Předem připravená faktura – Analýza a extrakce běžných polí z konkrétních typů dokumentů pomocí předem natrénovaného modelu
Požadavky
Předplatné Azure – Vytvořte si ho zdarma.
Nejnovější verze editoru Visual Studio Code nebo preferované integrované vývojové prostředí (IDE) Viz Java v editoru Visual Studio Code.
Tip
- Visual Studio Code nabízí balíček kódování pro Javu pro Windows a macOS.Balíček kódování je sada VS Code, sady Java Development Kit (JDK) a kolekce navrhovaných rozšíření od Microsoftu. Kódovací balíček lze také použít k opravě existujícího vývojového prostředí.
- Pokud používáte VS Code a kódovací balíček pro Javu, nainstalujte rozšíření Gradle for Java .
Pokud visual Studio Code nepoužíváte, ujistěte se, že máte ve vývojovém prostředí nainstalované následující:
Sada Java Development Kit (JDK) verze 8 nebo novější. Další informace naleznete v tématu Microsoft Build of OpenJDK.
Gradle verze 6.8 nebo novější
Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveň
F0
Free a později upgradovat na placenou úroveň pro produkční prostředí.Tip
Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.
Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Později do kódu vložíte klíč a koncový bod:
Nastavení
Vytvoření nového projektu Gradle
V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte nový adresář pro vaši aplikaci s názvem doc-intel-app a přejděte na ni.
mkdir doc-intel-app && doc-intel-app
mkdir doc-intel-app; cd doc-intel-app
gradle init
Spusťte příkaz z pracovního adresáře. Tento příkaz vytvoří základní soubory sestavení pro Gradle, včetně build.gradle.kts, které se používají za běhu k vytvoření a konfiguraci aplikace.gradle init --type basic
Po zobrazení výzvy k výběru DSL vyberte Kotlin.
Výběrem klávesy Return nebo Enter přijměte výchozí název projektu (doc-intel-app).
V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte pro aplikaci nový adresář s názvem form-recognize-app a přejděte na ni.
mkdir form-recognize-app && form-recognize-app
mkdir form-recognize-app; cd form-recognize-app
gradle init
Spusťte příkaz z pracovního adresáře. Tento příkaz vytvoří základní soubory sestavení pro Gradle, včetně build.gradle.kts, které se používají za běhu k vytvoření a konfiguraci aplikace.gradle init --type basic
Po zobrazení výzvy k výběru DSL vyberte Kotlin.
Výběrem možnosti Return nebo Enter přijměte výchozí název projektu (form-recognize-app).
Instalace klientské knihovny
V tomto rychlém startu se používá správce závislostí Gradle. Klientskou knihovnu a informace pro další správce závislostí najdete v centrálním úložišti Maven.
Otevřete soubor build.gradle.kts projektu v integrovaném vývojovém prostředí (IDE). Spoluplatte a vložte následující kód, který zahrne klientskou knihovnu implementation
jako příkaz spolu s požadovanými moduly plug-in a nastavením.
plugins {
java
application
}
application {
mainClass.set("DocIntelligence")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0-beta.4'
}
V tomto rychlém startu se používá správce závislostí Gradle. Klientskou knihovnu a informace pro další správce závislostí najdete v centrálním úložišti Maven.
Otevřete soubor build.gradle.kts projektu v integrovaném vývojovém prostředí (IDE). Spoluplatte a vložte následující kód, který zahrne klientskou knihovnu implementation
jako příkaz spolu s požadovanými moduly plug-in a nastavením.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.1.0'
}
V tomto rychlém startu se používá správce závislostí Gradle. Klientskou knihovnu a informace pro další správce závislostí najdete v centrálním úložišti Maven.
Otevřete soubor build.gradle.kts projektu v integrovaném vývojovém prostředí (IDE). Spoluplatte a vložte následující kód, který zahrne klientskou knihovnu implementation
jako příkaz spolu s požadovanými moduly plug-in a nastavením.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'
}
Vytvoření aplikace Java
Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentIntelligenceClient
třídy. Uděláte to tak, že vytvoříte na key
webu Azure Portal DocumentIntelligenceClient
a AzureKeyCredential
instanci s AzureKeyCredential
funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint
.
Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentAnalysisClient
třídy. Uděláte to tak, že vytvoříte na key
webu Azure Portal DocumentAnalysisClient
a AzureKeyCredential
instanci s AzureKeyCredential
funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint
.
V adresáři doc-intel-app spusťte následující příkaz:
mkdir -p src/main/java
Vytvoříte následující adresářovou strukturu:
Přejděte do
java
adresáře a vytvořte soubor s názvemDocIntelligence.java
.Tip
- Nový soubor můžete vytvořit pomocí PowerShellu.
- Otevřete okno PowerShellu v adresáři projektu tak, že podržíte klávesu Shift a kliknete pravým tlačítkem na složku.
- Zadejte následující příkaz New-Item DocIntelligence.java.
Otevřete soubor
DocIntelligence.java
. Zkopírujte a vložte do aplikace jednu z následujících ukázek kódu:
Přejděte do
java
adresáře a vytvořte soubor s názvemFormRecognizer.java
.Tip
- Nový soubor můžete vytvořit pomocí PowerShellu.
- Otevřete okno PowerShellu v adresáři projektu tak, že podržíte klávesu Shift a kliknete pravým tlačítkem na složku.
- Zadejte následující příkaz New-Item FormRecognizer.java.
Otevřete soubor
FormRecognizer.java
. Zkopírujte a vložte do aplikace jednu z následujících ukázek kódu:
Důležité
Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.
Model rozložení
Extrahujte text, značky výběru, styly textu, struktury tabulky a souřadnice ohraničující oblasti z dokumentů.
- V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
- K analýze daného souboru na identifikátoru URI použijete metodu a předáte
prebuilt-layout
hobeginAnalyzeDocumentFromUrl
jako ID modelu. VrácenáAnalyzeResult
hodnota je objekt obsahující data o odeslaném dokumentu. - Do proměnné v hlavní metodě jsme přidali hodnotu
documentUrl
identifikátoru URI souboru.
Do souboru přidejte následující ukázku DocIntelligence.java
kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:
import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
import com.azure.ai.documentintelligence.models.DocumentTable;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.util.List;
public class DocIntelligence {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-layout";
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
SyncPoller <AnalyzeResultOperation, AnalyzeResultOperation> analyzeLayoutPoller =
client.beginAnalyzeDocument(modelId,
null,
null,
null,
null,
null,
null,
new AnalyzeDocumentRequest().setUrlSource(documentUrl));
AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult().getAnalyzeResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line '%s' is within a bounding polygon %s.%n",
documentLine.getContent(),
documentLine.getPolygon()));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f.%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getState().toString(),
documentSelectionMark.getPolygon(),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
// styles
analyzeLayoutResult.getStyles().forEach(documentStyle -
> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
}
}
Sestavení a spuštění aplikace
Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – doc-intel-app.
Sestavte aplikaci pomocí
build
příkazu:gradle build
Spusťte aplikaci pomocí
run
příkazu:gradle run
Do souboru přidejte následující ukázku FormRecognizer.java
kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:
import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-layout";
SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);
AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line %s is within a bounding polygon %s.%n",
documentLine.getContent(),
documentLine.getBoundingPolygon().toString()));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is %s and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getState().toString(),
documentSelectionMark.getBoundingPolygon().toString(),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
}
// Utility function to get the bounding polygon coordinates
private static String getBoundingCoordinates(List < Point > boundingPolygon) {
return boundingPolygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Sestavení a spuštění aplikace
Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – form-recognize-app.
Sestavte aplikaci pomocí
build
příkazu:gradle build
Spusťte aplikaci pomocí
run
příkazu:gradle run
Výstup modelu rozložení
Tady je fragment očekávaného výstupu:
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.
Pokud chcete zobrazit celý výstup, přejděte do úložiště ukázek Azure na GitHubu a zobrazte výstup modelu rozložení.
Do souboru přidejte následující ukázku FormRecognizer.java
kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentTable;
import com.azure.ai.formrecognizer.documentanalysis.models.Point;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.util.List;
import java.util.stream.Collectors;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-layout";
SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutPoller =
client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);
AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line '%s' is within a bounding polygon %s.%n",
documentLine.getContent(),
getBoundingCoordinates(documentLine.getBoundingPolygon())));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f.%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getSelectionMarkState().toString(),
getBoundingCoordinates(documentSelectionMark.getBoundingPolygon()),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
// styles
analyzeLayoutResult.getStyles().forEach(documentStyle -
> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
}
/**
* Utility function to get the bounding polygon coordinates.
*/
private static String getBoundingCoordinates(List < Point > boundingPolygon) {
return boundingPolygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Sestavení a spuštění aplikace
Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – form-recognize-app.
Sestavte aplikaci pomocí
build
příkazu:gradle build
Spusťte aplikaci pomocí
run
příkazu:gradle run
Předem připravený model
Analyzujte a extrahujte běžná pole z konkrétních typů dokumentů pomocí předem vytvořeného modelu. V tomto příkladu analyzujeme fakturu pomocí předem připraveného modelu faktury .
Tip
Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze
operaci, závisí na typu dokumentu, který se má analyzovat. Viz extrakce dat modelu.
- Analýza faktury pomocí předem vytvořeného modelu faktury Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
- Do proměnné v horní části souboru jsme přidali hodnotu
invoiceUrl
ADRESY URL souboru. - K analýze daného souboru na identifikátoru URI použijete metodu a předáte
PrebuiltModels.Invoice
hobeginAnalyzeDocuments
jako ID modelu. Vrácenáresult
hodnota je objekt obsahující data o odeslaném dokumentu. - Pro zjednodušení se zde nezobrazují všechny páry klíč-hodnota, které služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .
Do souboru přidejte následující ukázku DocIntelligence.java
kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:
import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
import com.azure.ai.documentintelligence.models.Document;
import com.azure.ai.documentintelligence.models.DocumentField;
import com.azure.ai.documentintelligence.models.DocumentFieldType;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
public class DocIntelligence {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// sample document
String modelId = "prebuilt-invoice";
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
public static void main(final String[] args) throws IOException {
// Instantiate a client that will be used to call the service.
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
SyncPoller<AnalyzeResultOperation, AnalyzeResultOperation > analyzeInvoicesPoller =
client.beginAnalyzeDocument(modelId,
null,
null,
null,
null,
null,
null,
new AnalyzeDocumentRequest().setUrlSource(invoiceUrl));
AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult().getAnalyzeResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
Document analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (customerNameField != null) {
if (DocumentFieldType.DATE == invoiceDateField.getType()) {
LocalDate invoiceDate = invoiceDateField.getValueDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.NUMBER == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueNumber();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
invoiceTotal, invoiceTotalField.getConfidence());
}
}
DocumentField invoiceItemsField = invoiceFields.get("Items");
if (invoiceItemsField != null) {
System.out.printf("Invoice Items: %n");
if (DocumentFieldType.ARRAY == invoiceItemsField.getType()) {
List < DocumentField > invoiceItems = invoiceItemsField.getValueArray();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.OBJECT == invoiceItem.getType())
.map(documentField -> documentField.getValueObject())
.forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
// See a full list of fields found on an invoice here:
// https://aka.ms/documentintelligence/invoicefields
if ("Description".equals(key)) {
if (DocumentFieldType.STRING == documentField.getType()) {
String name = documentField.getValueString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double quantity = documentField.getValueNumber();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double unitPrice = documentField.getValueNumber();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double productCode = documentField.getValueNumber();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
}
Sestavení a spuštění aplikace
Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – doc-intel-app.
Sestavte aplikaci pomocí
build
příkazu:gradle build
Spusťte aplikaci pomocí
run
příkazu:gradle run
Do souboru přidejte následující ukázku FormRecognizer.java
kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:
import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(final String[] args) throws IOException {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-invoice";
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);
AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueAsString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueAsString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueAsString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueAsString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueAsString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (customerNameField != null) {
if (DocumentFieldType.DATE == invoiceDateField.getType()) {
LocalDate invoiceDate = invoiceDateField.getValueAsDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueAsDouble();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
invoiceTotal, invoiceTotalField.getConfidence());
}
}
DocumentField invoiceItemsField = invoiceFields.get("Items");
if (invoiceItemsField != null) {
System.out.printf("Invoice Items: %n");
if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
.map(documentField -> documentField.getValueAsMap())
.forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
// See a full list of fields found on an invoice here:
// https://aka.ms/formrecognizer/invoicefields
if ("Description".equals(key)) {
if (DocumentFieldType.STRING == documentField.getType()) {
String name = documentField.getValueAsString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double quantity = documentField.getValueAsDouble();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double unitPrice = documentField.getValueAsDouble();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double productCode = documentField.getValueAsDouble();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
Sestavení a spuštění aplikace
Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – doc-intel-app.
Sestavte aplikaci pomocí
build
příkazu:gradle build
Spusťte aplikaci pomocí
run
příkazu:gradle run
Předem připravený výstup modelu
Tady je fragment očekávaného výstupu:
----------- 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
Pokud chcete zobrazit celý výstup, navštivte úložiště ukázek Azure na GitHubu a podívejte se na předem připravený výstup modelu faktury.
Do souboru přidejte následující ukázku FormRecognizer.java
kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzedDocument;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentField;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentFieldType;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-invoice";
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);
AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueAsString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueAsString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueAsString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueAsString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueAsString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (customerNameField != null) {
if (DocumentFieldType.DATE == invoiceDateField.getType()) {
LocalDate invoiceDate = invoiceDateField.getValueAsDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueAsDouble();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
invoiceTotal, invoiceTotalField.getConfidence());
}
}
DocumentField invoiceItemsField = invoiceFields.get("Items");
if (invoiceItemsField != null) {
System.out.printf("Invoice Items: %n");
if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
.map(documentField -> documentField.getValueAsMap())
.forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
// See a full list of fields found on an invoice here:
// https://aka.ms/formrecognizer/invoicefields
if ("Description".equals(key)) {
if (DocumentFieldType.STRING == documentField.getType()) {
String name = documentField.getValueAsString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double quantity = documentField.getValueAsDouble();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double unitPrice = documentField.getValueAsDouble();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double productCode = documentField.getValueAsDouble();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
Sestavení a spuštění aplikace
Po přidání ukázky kódu do aplikace přejděte zpět do hlavního adresáře projektu – doc-intel-app.
Sestavte aplikaci pomocí
build
příkazu:gradle build
Spusťte aplikaci pomocí
run
příkazu:gradle run
Referenční | balíček rozhraní REST API klientské knihovny | (npm) | Ukázky |podporované verze rozhraní REST API
Referenční | referenční balíček rozhraní REST API | sady SDK klientské knihovny | (npm) | Ukázky |podporované verze rozhraní REST API
Referenční | referenční balíček rozhraní REST API | sady SDK klientské knihovny | (npm) | Ukázky |podporované verze rozhraní REST API
V tomto rychlém startu můžete pomocí následujících funkcí analyzovat a extrahovat data a hodnoty z formulářů a dokumentů:
Rozložení – Analýza a extrahování tabulek, řádků, slov a výběrových značek, jako jsou přepínače a zaškrtávací políčka v dokumentech, bez nutnosti trénovat model.
Předem připravená faktura – Analýza a extrahování běžných polí z konkrétních typů dokumentů pomocí předem natrénovaného modelu faktury
Požadavky
Předplatné Azure – Vytvořte si ho zdarma.
Nejnovější verze editoru Visual Studio Code nebo preferované integrované vývojové prostředí (IDE) Další informace najdete v tématu Node.js v nástroji Visual Studio Code.
Nejnovější
LTS
verze Node.js.Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveň
F0
Free a později upgradovat na placenou úroveň pro produkční prostředí.Tip
Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.
Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:
Nastavení
Vytvořte novou aplikaci Node.js Express: V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte a přejděte do nového adresáře aplikace s názvem
doc-intel-app
.mkdir doc-intel-app && cd doc-intel-app
Spuštěním
npm init
příkazu inicializujete aplikaci a vygenerujte projekt.npm init
Pomocí výzev zobrazených v terminálu zadejte atributy projektu.
- Nejdůležitějšími atributy jsou název, číslo verze a vstupní bod.
- Doporučujeme zachovat
index.js
název vstupního bodu. Popis, testovací příkaz, úložiště GitHub, klíčová slova, autor a informace o licencích jsou volitelné atributy – je možné je přeskočit pro tento projekt. - Návrhy v závorkách přijměte tak, že vyberete Return nebo Enter.
- Po dokončení výzev
package.json
se v adresáři doc-intel-app vytvoří soubor.
Nainstalujte klientskou knihovnu
ai-document-intelligence
aazure/identity
balíčky npm:npm i @azure-rest/ai-document-intelligence@1.0.0-beta.3 @azure/core-auth
Soubor vaší aplikace
package.json
se aktualizuje o závislosti.
Nainstalujte klientskou knihovnu
ai-form-recognizer
aazure/identity
balíčky npm:npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
- Soubor vaší aplikace
package.json
se aktualizuje o závislosti.
- Soubor vaší aplikace
Nainstalujte klientskou knihovnu
ai-form-recognizer
aazure/identity
balíčky npm:npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
Vytvořte soubor s názvem
index.js
v adresáři aplikace.Tip
- Nový soubor můžete vytvořit pomocí PowerShellu.
- Otevřete okno PowerShellu v adresáři projektu tak, že podržíte klávesu Shift a kliknete pravým tlačítkem na složku.
- Zadejte následující příkaz New-Item index.js.
Sestavení aplikace
Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentIntelligenceClient
třídy. Uděláte to tak, že vytvoříte na key
webu Azure Portal DocumentIntelligenceClient
a AzureKeyCredential
instanci s AzureKeyCredential
funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint
.
Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentAnalysisClient
třídy. Uděláte to tak, že vytvoříte na webu Azure Portal DocumentAnalysisClient
a AzureKeyCredential
key
instanci s AzureKeyCredential
Rozpoznávání formulářů endpoint
.
Otevřete soubor v editoru Visual Studio Code nebo v oblíbeném integrovaném
index.js
vývojovém prostředí (IDE). Zkopírujte a vložte do aplikace jednu z následujících ukázek kódu:
Důležité
Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.
Model rozložení
Extrahujte text, značky výběru, styly textu, struktury tabulky a souřadnice ohraničující oblasti z dokumentů.
- V tomto příkladu budete potřebovat soubor dokumentu z adresy URL. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
- Do proměnné v horní části souboru jsme přidali hodnotu
formUrl
adresy URL souboru.- K analýze daného souboru z adresy URL použijete metodu
beginAnalyzeDocuments
a předáteprebuilt-layout
ji jako ID modelu.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
const { AzureKeyCredential } = require("@azure/core-auth");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
async function main() {
const client = DocumentIntelligence(endpoint, new AzureKeyCredential(key));
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-layout")
.post({
contentType: "application/json",
body: {
urlSource: formUrl
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = await getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const document = documents && documents[0];
if (!document) {
throw new Error("Expected at least one document in the result.");
}
console.log(
"Extracted document:",
document.docType,
`(confidence: ${document.confidence || "<undefined>"})`,
);
console.log("Fields:", document.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Spuštění aplikace
Po přidání ukázky kódu do aplikace spusťte program:
Přejděte do složky, ve které máte aplikaci Document Intelligence (doc-intel-app).
Do terminálu zadejte následující příkaz:
node index.js
Do souboru přidejte následující ukázku index.js
kódu. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:
const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
async function main() {
const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-layout", formUrl);
const {
pages,
tables
} = await poller.pollUntilDone();
if (pages.length <= 0) {
console.log("No pages were extracted from the document.");
} else {
console.log("Pages:");
for (const page of pages) {
console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
console.log(` ${page.width}x${page.height}, angle: ${page.angle}`);
console.log(` ${page.lines.length} lines, ${page.words.length} words`);
}
}
if (tables.length <= 0) {
console.log("No tables were extracted from the document.");
} else {
console.log("Tables:");
for (const table of tables) {
console.log(
`- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
);
}
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Spuštění aplikace
Po přidání ukázky kódu do aplikace spusťte program:
Přejděte do složky, ve které máte aplikaci Document Intelligence (doc-intel-app).
Do terminálu zadejte následující příkaz:
node index.js
Výstup modelu rozložení
Tady je fragment očekávaného výstupu:
Pages:
- Page 1 (unit: inch)
8.5x11, angle: 0
69 lines, 425 words
Tables:
- Extracted table: 3 columns, 5 rows (15 cells)
Pokud chcete zobrazit celý výstup, přejděte do úložiště ukázek Azure na GitHubu a zobrazte výstup modelu rozložení.
Předem připravený model
V tomto příkladu analyzujeme fakturu pomocí předem připraveného modelu faktury .
Tip
Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze
operaci, závisí na typu dokumentu, který se má analyzovat. Viz extrakce dat modelu.
- Analýza faktury pomocí předem vytvořeného modelu faktury Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
- Do proměnné v horní části souboru jsme přidali hodnotu
invoiceUrl
ADRESY URL souboru. - K analýze daného souboru na identifikátoru URI použijete metodu a předáte
PrebuiltModels.Invoice
hobeginAnalyzeDocuments
jako ID modelu. Vrácenáresult
hodnota je objekt obsahující data o odeslaném dokumentu. - Pro zjednodušení se zde nezobrazují všechny páry klíč-hodnota, které služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
const { AzureKeyCredential } = require("@azure/core-auth");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
async function main() {
const client = DocumentIntelligence(endpoint, new AzureKeyCredential(key));
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
.post({
contentType: "application/json",
body: {
// The Document Intelligence service will access the URL to the invoice image and extract data from it
urlSource: invoiceUrl,
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = await getLongRunningPoller(client, initialResponse);
poller.onProgress((state) => console.log("Operation:", state.result, state.status));
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const result = documents && documents[0];
if (result) {
console.log(result.fields);
} else {
throw new Error("Expected at least one invoice in the result.");
}
console.log(
"Extracted invoice:",
document.docType,
`(confidence: ${document.confidence || "<undefined>"})`,
);
console.log("Fields:", document.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Spuštění aplikace
Po přidání ukázky kódu do aplikace spusťte program:
Přejděte do složky, ve které máte aplikaci Document Intelligence (doc-intel-app).
Do terminálu zadejte následující příkaz:
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);
});
Spuštění aplikace
Po přidání ukázky kódu do aplikace spusťte program:
Přejděte do složky, ve které máte aplikaci Document Intelligence (doc-intel-app).
Do terminálu zadejte následující příkaz:
node index.js
Předem připravený výstup modelu
Tady je fragment očekávaného výstupu:
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
Pokud chcete zobrazit celý výstup, navštivte úložiště ukázek Azure na GitHubu a podívejte se na předem připravený výstup modelu faktury.
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);
});
Spuštění aplikace
Po přidání ukázky kódu do aplikace spusťte program:
Přejděte do složky, ve které máte aplikaci Document Intelligence (doc-intel-app).
Do terminálu zadejte následující příkaz:
node index.js
Referenční | referenční balíček rozhraní REST API | sady SDK klientské knihovny |(PyPi) | Ukázky | podporované verze rozhraní REST API
Referenční | referenční balíček rozhraní REST API | sady SDK klientské knihovny |(PyPi) | Ukázky | podporované verze rozhraní REST API
Referenční | referenční balíček rozhraní REST API | sady SDK klientské knihovny | (PyPi) | Ukázky | podporované verze rozhraní REST API
V tomto rychlém startu můžete pomocí následujících funkcí analyzovat a extrahovat data z formulářů a dokumentů:
Rozložení – Analýza a extrahování tabulek, řádků, slov a výběrových značek, jako jsou přepínače a zaškrtávací políčka a páry klíč-hodnota, bez nutnosti trénovat model.
Předem připravená faktura – Analýza a extrakce běžných polí z konkrétních typů dokumentů pomocí předem natrénovaného modelu
Požadavky
Předplatné Azure – Vytvořte si ho zdarma.
-
- Vaše instalace Pythonu by měla obsahovat pip. Spuštěním na příkazovém
pip --version
řádku můžete zkontrolovat, jestli máte nainstalovaný pip. Získejte pip instalací nejnovější verze Pythonu.
- Vaše instalace Pythonu by měla obsahovat pip. Spuštěním na příkazovém
Nejnovější verze editoru Visual Studio Code nebo preferované integrované vývojové prostředí (IDE) Další informace najdete v tématu Začínáme s Pythonem v editoru Visual Studio Code.
Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveň
F0
Free a později upgradovat na placenou úroveň pro produkční prostředí.
Tip
Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.
Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:
Nastavení
Otevřete okno terminálu v místním prostředí a nainstalujte klientskou knihovnu Azure AI Document Intelligence pro Python s pip:
pip install azure-ai-documentintelligence==1.0.0b4
pip install azure-ai-formrecognizer==3.3.0
pip install azure-ai-formrecognizer==3.2.0b6
Vytvoření aplikace v Pythonu
Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentIntelligenceClient
třídy. Uděláte to tak, že vytvoříte na key
webu Azure Portal DocumentIntelligenceClient
a AzureKeyCredential
instanci s AzureKeyCredential
funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint
.
V preferovaném editoru nebo integrovaném vývojovém prostředí (IDE) vytvořte nový soubor Pythonu s názvem doc_intel_quickstart.py .
Otevřete soubor doc_intel_quickstart.py a vyberte jednu z následujících ukázek kódu, které chcete zkopírovat a vložit do aplikace:
Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci DocumentAnalysisClient
třídy. Uděláte to tak, že vytvoříte na key
webu Azure Portal DocumentAnalysisClient
a AzureKeyCredential
instanci s AzureKeyCredential
funkcí Document Intelligence a vaší funkcí Document Intelligenceendpoint
.
V preferovaném editoru nebo integrovaném vývojovém prostředí (IDE) vytvořte nový soubor Pythonu s názvem form_recognizer_quickstart.py .
Otevřete soubor form_recognizer_quickstart.py a vyberte jednu z následujících ukázek kódu, které chcete zkopírovat a vložit do aplikace:
Důležité
Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.
Model rozložení
Extrahujte text, značky výběru, styly textu, struktury tabulky a souřadnice ohraničující oblasti z dokumentů.
- V tomto příkladu budete potřebovat soubor dokumentu z adresy URL. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
- Do proměnné ve
analyze_layout
funkci jsme přidali hodnotuformUrl
adresy URL souboru.
Do aplikace doc_intel_quickstart.py přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:
# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
# helper functions
def get_words(page, line):
result = []
for word in page.words:
if _in_span(word, line.spans):
result.append(word)
return result
def _in_span(word, spans):
for span in spans:
if word.span.offset >= span.offset and (
word.span.offset + word.span.length
) <= (span.offset + span.length):
return True
return False
def analyze_layout():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
document_intelligence_client = DocumentIntelligenceClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_intelligence_client.begin_analyze_document(
"prebuilt-layout", AnalyzeDocumentRequest(url_source=formUrl
))
result: AnalyzeResult = poller.result()
if result.styles and any([style.is_handwritten for style in result.styles]):
print("Document contains handwritten content")
else:
print("Document does not contain handwritten content")
for page in result.pages:
print(f"----Analyzing layout from page #{page.page_number}----")
print(
f"Page has width: {page.width} and height: {page.height}, measured with unit: {page.unit}"
)
if page.lines:
for line_idx, line in enumerate(page.lines):
words = get_words(page, line)
print(
f"...Line # {line_idx} has word count {len(words)} and text '{line.content}' "
f"within bounding polygon '{line.polygon}'"
)
for word in words:
print(
f"......Word '{word.content}' has a confidence of {word.confidence}"
)
if page.selection_marks:
for selection_mark in page.selection_marks:
print(
f"Selection mark is '{selection_mark.state}' within bounding polygon "
f"'{selection_mark.polygon}' and has a confidence of {selection_mark.confidence}"
)
if result.tables:
for table_idx, table in enumerate(result.tables):
print(
f"Table # {table_idx} has {table.row_count} rows and "
f"{table.column_count} columns"
)
if table.bounding_regions:
for region in table.bounding_regions:
print(
f"Table # {table_idx} location on page: {region.page_number} is {region.polygon}"
)
for cell in table.cells:
print(
f"...Cell[{cell.row_index}][{cell.column_index}] has text '{cell.content}'"
)
if cell.bounding_regions:
for region in cell.bounding_regions:
print(
f"...content on page {region.page_number} is within bounding polygon '{region.polygon}'"
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_layout()
Spuštění aplikace
Po přidání ukázky kódu do aplikace sestavte a spusťte program:
Přejděte do složky, ve které máte soubor doc_intel_quickstart.py .
Do terminálu zadejte následující příkaz:
python doc_intel_quickstart.py
Pokud chcete analyzovat daný soubor na adrese URL, použijte metodu begin_analyze_document_from_url
a předejte prebuilt-layout
ji jako ID modelu. Vrácená result
hodnota je objekt obsahující data o odeslaném dokumentu.
Do form_recognizer_quickstart.py aplikace přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:
# 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()
Spuštění aplikace
Po přidání ukázky kódu do aplikace sestavte a spusťte program:
Přejděte do složky, ve které máte soubor form_recognizer_quickstart.py .
Do terminálu zadejte následující příkaz:
python form_recognizer_quickstart.py
Výstup modelu rozložení
Tady je fragment očekávaného výstupu:
----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
Pokud chcete zobrazit celý výstup, přejděte do úložiště ukázek Azure na GitHubu a zobrazte výstup modelu rozložení.
Do form_recognizer_quickstart.py aplikace přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:
# 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()
Spuštění aplikace
Po přidání ukázky kódu do aplikace sestavte a spusťte program:
Přejděte do složky, ve které máte soubor form_recognizer_quickstart.py .
Do terminálu zadejte následující příkaz:
python form_recognizer_quickstart.py
Předem připravený model
Analyzujte a extrahujte běžná pole z konkrétních typů dokumentů pomocí předem vytvořeného modelu. V tomto příkladu analyzujeme fakturu pomocí předem připraveného modelu faktury .
Tip
Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze
operaci, závisí na typu dokumentu, který se má analyzovat. Viz extrakce dat modelu.
- Analýza faktury pomocí předem vytvořeného modelu faktury Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
- Do proměnné v horní části souboru jsme přidali hodnotu
invoiceUrl
ADRESY URL souboru. - Pro zjednodušení se zde nezobrazují všechny páry klíč-hodnota, které služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .
Do aplikace doc_intel_quickstart.py přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal:
# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
def analyze_invoice():
# sample document
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
document_intelligence_client = DocumentIntelligenceClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_intelligence_client.begin_analyze_document(
"prebuilt-invoice", AnalyzeDocumentRequest(url_source=invoiceUrl)
)
invoices = poller.result()
if invoices.documents:
for idx, invoice in enumerate(invoices.documents):
print(f"--------Analyzing invoice #{idx + 1}--------")
vendor_name = invoice.fields.get("VendorName")
if vendor_name:
print(
f"Vendor Name: {vendor_name.get('content')} has confidence: {vendor_name.get('confidence')}"
)
vendor_address = invoice.fields.get("VendorAddress")
if vendor_address:
print(
f"Vendor Address: {vendor_address.get('content')} has confidence: {vendor_address.get('confidence')}"
)
vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
if vendor_address_recipient:
print(
f"Vendor Address Recipient: {vendor_address_recipient.get('content')} has confidence: {vendor_address_recipient.get('confidence')}"
)
customer_name = invoice.fields.get("CustomerName")
if customer_name:
print(
f"Customer Name: {customer_name.get('content')} has confidence: {customer_name.get('confidence')}"
)
customer_id = invoice.fields.get("CustomerId")
if customer_id:
print(
f"Customer Id: {customer_id.get('content')} has confidence: {customer_id.get('confidence')}"
)
customer_address = invoice.fields.get("CustomerAddress")
if customer_address:
print(
f"Customer Address: {customer_address.get('content')} has confidence: {customer_address.get('confidence')}"
)
customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
if customer_address_recipient:
print(
f"Customer Address Recipient: {customer_address_recipient.get('content')} has confidence: {customer_address_recipient.get('confidence')}"
)
invoice_id = invoice.fields.get("InvoiceId")
if invoice_id:
print(
f"Invoice Id: {invoice_id.get('content')} has confidence: {invoice_id.get('confidence')}"
)
invoice_date = invoice.fields.get("InvoiceDate")
if invoice_date:
print(
f"Invoice Date: {invoice_date.get('content')} has confidence: {invoice_date.get('confidence')}"
)
invoice_total = invoice.fields.get("InvoiceTotal")
if invoice_total:
print(
f"Invoice Total: {invoice_total.get('content')} has confidence: {invoice_total.get('confidence')}"
)
due_date = invoice.fields.get("DueDate")
if due_date:
print(
f"Due Date: {due_date.get('content')} has confidence: {due_date.get('confidence')}"
)
purchase_order = invoice.fields.get("PurchaseOrder")
if purchase_order:
print(
f"Purchase Order: {purchase_order.get('content')} has confidence: {purchase_order.get('confidence')}"
)
billing_address = invoice.fields.get("BillingAddress")
if billing_address:
print(
f"Billing Address: {billing_address.get('content')} has confidence: {billing_address.get('confidence')}"
)
billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
if billing_address_recipient:
print(
f"Billing Address Recipient: {billing_address_recipient.get('content')} has confidence: {billing_address_recipient.get('confidence')}"
)
shipping_address = invoice.fields.get("ShippingAddress")
if shipping_address:
print(
f"Shipping Address: {shipping_address.get('content')} has confidence: {shipping_address.get('confidence')}"
)
shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
if shipping_address_recipient:
print(
f"Shipping Address Recipient: {shipping_address_recipient.get('content')} has confidence: {shipping_address_recipient.get('confidence')}"
)
print("Invoice items:")
for idx, item in enumerate(invoice.fields.get("Items").get("valueArray")):
print(f"...Item #{idx + 1}")
item_description = item.get("valueObject").get("Description")
if item_description:
print(
f"......Description: {item_description.get('content')} has confidence: {item_description.get('confidence')}"
)
item_quantity = item.get("valueObject").get("Quantity")
if item_quantity:
print(
f"......Quantity: {item_quantity.get('content')} has confidence: {item_quantity.get('confidence')}"
)
unit = item.get("valueObject").get("Unit")
if unit:
print(
f"......Unit: {unit.get('content')} has confidence: {unit.get('confidence')}"
)
unit_price = item.get("valueObject").get("UnitPrice")
if unit_price:
unit_price_code = (
unit_price.get("valueCurrency").get("currencyCode")
if unit_price.get("valueCurrency").get("currencyCode")
else ""
)
print(
f"......Unit Price: {unit_price.get('content')}{unit_price_code} has confidence: {unit_price.get('confidence')}"
)
product_code = item.get("valueObject").get("ProductCode")
if product_code:
print(
f"......Product Code: {product_code.get('content')} has confidence: {product_code.get('confidence')}"
)
item_date = item.get("valueObject").get("Date")
if item_date:
print(
f"......Date: {item_date.get('content')} has confidence: {item_date.get('confidence')}"
)
tax = item.get("valueObject").get("Tax")
if tax:
print(
f"......Tax: {tax.get('content')} has confidence: {tax.get('confidence')}"
)
amount = item.get("valueObject").get("Amount")
if amount:
print(
f"......Amount: {amount.get('content')} has confidence: {amount.get('confidence')}"
)
subtotal = invoice.fields.get("SubTotal")
if subtotal:
print(
f"Subtotal: {subtotal.get('content')} has confidence: {subtotal.get('confidence')}"
)
total_tax = invoice.fields.get("TotalTax")
if total_tax:
print(
f"Total Tax: {total_tax.get('content')} has confidence: {total_tax.get('confidence')}"
)
previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
if previous_unpaid_balance:
print(
f"Previous Unpaid Balance: {previous_unpaid_balance.get('content')} has confidence: {previous_unpaid_balance.get('confidence')}"
)
amount_due = invoice.fields.get("AmountDue")
if amount_due:
print(
f"Amount Due: {amount_due.get('content')} has confidence: {amount_due.get('confidence')}"
)
service_start_date = invoice.fields.get("ServiceStartDate")
if service_start_date:
print(
f"Service Start Date: {service_start_date.get('content')} has confidence: {service_start_date.get('confidence')}"
)
service_end_date = invoice.fields.get("ServiceEndDate")
if service_end_date:
print(
f"Service End Date: {service_end_date.get('content')} has confidence: {service_end_date.get('confidence')}"
)
service_address = invoice.fields.get("ServiceAddress")
if service_address:
print(
f"Service Address: {service_address.get('content')} has confidence: {service_address.get('confidence')}"
)
service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
if service_address_recipient:
print(
f"Service Address Recipient: {service_address_recipient.get('content')} has confidence: {service_address_recipient.get('confidence')}"
)
remittance_address = invoice.fields.get("RemittanceAddress")
if remittance_address:
print(
f"Remittance Address: {remittance_address.get('content')} has confidence: {remittance_address.get('confidence')}"
)
remittance_address_recipient = invoice.fields.get(
"RemittanceAddressRecipient"
)
if remittance_address_recipient:
print(
f"Remittance Address Recipient: {remittance_address_recipient.get('content')} has confidence: {remittance_address_recipient.get('confidence')}"
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_invoice()
Spuštění aplikace
Po přidání ukázky kódu do aplikace sestavte a spusťte program:
Přejděte do složky, ve které máte soubor doc_intel_quickstart.py .
Do terminálu zadejte následující příkaz:
python doc_intel_quickstart.py
Pokud chcete analyzovat daný soubor pomocí identifikátoru URI, použijte metodu begin_analyze_document_from_url
a předejte prebuilt-invoice
ji jako ID modelu. Vrácená result
hodnota je objekt obsahující data o odeslaném dokumentu.
Do form_recognizer_quickstart.py aplikace přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:
# 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()
Spuštění aplikace
Po přidání ukázky kódu do aplikace sestavte a spusťte program:
Přejděte do složky, ve které máte soubor form_recognizer_quickstart.py .
Do terminálu zadejte následující příkaz:
python form_recognizer_quickstart.py
Předem připravený výstup modelu
Tady je fragment očekávaného výstupu:
--------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
Pokud chcete zobrazit celý výstup, navštivte úložiště ukázek Azure na GitHubu a podívejte se na předem připravený výstup modelu faktury.
Do form_recognizer_quickstart.py aplikace přidejte následující vzorový kód. Nezapomeňte aktualizovat proměnné klíče a koncového bodu hodnotami z webu Azure Portal Rozpoznávání formulářů instanci:
# 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()
Spuštění aplikace
Po přidání ukázky kódu do aplikace sestavte a spusťte program:
Přejděte do složky, ve které máte soubor form_recognizer_quickstart.py .
Do terminálu zadejte následující příkaz:
python form_recognizer_quickstart.py
V tomto rychlém startu se naučíte používat rozhraní REST API document intelligence k analýze a extrahování dat a hodnot z dokumentů:
Požadavky
Předplatné Azure: Můžete si ho vytvořit zdarma.
Nainstalovaný nástroj příkazového řádku curl.
PowerShell verze 7.*+ (nebo podobná aplikace příkazového řádku):):
Pokud chcete zkontrolovat verzi PowerShellu, zadejte následující příkaz vzhledem k vašemu operačnímu systému:
- Windows:
Get-Host | Select-Object Version
- macOS nebo Linux:
$PSVersionTable
- Windows:
Prostředek Document Intelligence (jednoúčelová služba) nebo služby Azure AI (více služeb). Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveň
F0
Free a později upgradovat na placenou úroveň pro produkční prostředí.
Tip
Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.
Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:
Analýza dokumentů a získání výsledků
Požadavek POST slouží k analýze dokumentů s předem připraveným nebo vlastním modelem. Požadavek GET se používá k načtení výsledku volání analýzy dokumentu. Používá modelId
se s post a resultId
s operacemi GET.
Analýza dokumentu (požadavek POST)
Před spuštěním příkazu cURL proveďte následující změny požadavku post:
Nahraďte
{endpoint}
hodnotou koncového bodu z instance Document Intelligence na webu Azure Portal.Nahraďte
{key}
hodnotou klíče z instance Document Intelligence na webu Azure Portal.Jako odkaz použijte
{modelID}
následující tabulku a{your-document-url}
nahraďte požadované hodnoty.Potřebujete soubor dokumentu na adrese URL. Pro účely tohoto rychlého startu můžete pro každou funkci použít ukázkové formuláře uvedené v následující tabulce:
Ukázkové dokumenty
Funkce | {modelID} | {your-document-url} |
---|---|---|
Přečíst | předem připravená čtení | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
Rozložení | předem připravené rozložení | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
Zdravotní pojištění | prebuilt-healthInsuranceCard.us | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png |
Daňové přiznání | prebuilt-tax.us.w2 | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png |
Faktura | předem připravená faktura | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Paragon | předem připravená potvrzení | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Průkaz totožnosti | prebuilt-idDocument | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Ukázkové dokumenty
Funkce | {modelID} | {your-document-url} |
---|---|---|
Obecný dokument | předem připravený dokument | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf |
Přečíst | předem připravená čtení | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
Rozložení | předem připravené rozložení | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
Zdravotní pojištění | prebuilt-healthInsuranceCard.us | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png |
Daňové přiznání | prebuilt-tax.us.w2 | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png |
Faktura | předem připravená faktura | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Paragon | předem připravená potvrzení | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Průkaz totožnosti | prebuilt-idDocument | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Vizitka | předem připravená vizitka | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg |
Důležité
Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.
Požadavek POST
curl -v -i 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}'}"
Odpověď POST (resultID)
Obdržíte 202 (Success)
odpověď, která obsahuje hlavičku Operation-Location určenou jen pro čtení. Hodnota této hlavičky obsahuje resultID
dotaz, který umožňuje získat stav asynchronní operace a načíst výsledky pomocí požadavku GET se stejným klíčem předplatného prostředku:
Získání výsledků analýzy (požadavek GET)
Po volání Analyze document
rozhraní API &preserve-view=true&tabs=HTTP) zavolejte rozhraní API Get analyze result&preserve-view=true&tabs=HTTP), abyste získali stav operace a extrahovaná data. Před spuštěním příkazu proveďte tyto změny:
Po volání Analyze document
rozhraní API zavolejte rozhraní API pro analýzu výsledků , abyste získali stav operace a extrahovaná data. Před spuštěním příkazu proveďte tyto změny:
Po volání Analyze document
rozhraní API zavolejte rozhraní API pro analýzu výsledků , abyste získali stav operace a extrahovaná data. Před spuštěním příkazu proveďte tyto změny:
Nahraďte
{resultID}
hlavičku Umístění operace z odpovědi POST.Nahraďte
{key}
hodnotou klíče z instance Document Intelligence na webu Azure Portal.
Požadavek GET
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}"
Prozkoumání odpovědi
Obdržíte odpověď s výstupem 200 (Success)
JSON. První pole "status"
označuje stav operace. Pokud operace není dokončená, hodnota "status"
je "running"
nebo "notStarted"
a měli byste rozhraní API volat znovu, a to buď ručně, nebo prostřednictvím skriptu. Doporučujeme interval jedné sekundy nebo více mezi voláními.
Ukázková odpověď pro předem připravenou fakturu
{
"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
}
}],
}]
}
}
Podporovaná pole dokumentů
Předem připravené modely extrahuje předdefinované sady polí dokumentu. Viz Extrakce dat modelu pro extrahované názvy polí, typy, popisy a příklady.
To je to, blahopřejeme!
V tomto rychlém startu jste použili model document Intelligence k analýze různých formulářů a dokumentů. V dalším kroku prozkoumejte sadu Document Intelligence Studio a referenční dokumentaci, kde najdete podrobné informace o rozhraní Document Intelligence API.
Další kroky
Pro vylepšené prostředí a pokročilou kvalitu modelu vyzkoušejte Document Intelligence Studio.
Informace o migraci verze 3.1 na verzi 4.0 najdete v průvodcích migrací protokolu změn.
Tento obsah se vztahuje na: v2.1 | Nejnovější verze: v4.0 (GA)
Začínáme s azure AI Document Intelligence s využitím programovacího jazyka podle vašeho výběru nebo rozhraní REST API. Document Intelligence je cloudová služba Azure AI, která pomocí strojového učení extrahuje páry klíč-hodnota, text a tabulky z dokumentů. Při učení technologie doporučujeme používat bezplatnou službu. Mějte na paměti, že počet bezplatných stránek je omezený na 500 za měsíc.
Další informace o funkcích Document Intelligence a možnostech vývoje najdete na naší stránce Přehled .
Referenční dokumentace | – ukázky balíčku zdrojového kódu | knihovny (NuGet) |
V tomto rychlém startu použijete následující rozhraní API k extrakci strukturovaných dat z formulářů a dokumentů:
Požadavky
Předplatné Azure – Vytvořte si ho zdarma.
Aktuální verze integrovaného vývojového prostředí sady Visual Studio.
Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveň
F0
Free a později upgradovat na placenou úroveň pro produkční prostředí.Tip
Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.
Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:
Nastavení
Spusťte Visual Studio 2019.
Na úvodní stránce zvolte Vytvořit nový projekt.
Na stránce Vytvořit nový projekt zadejte konzolu do vyhledávacího pole. Zvolte šablonu konzolové aplikace a pak zvolte Další.
V dialogovém okně Konfigurovat nový projekt zadejte
formRecognizer_quickstart
do pole Název projektu. Pak zvolte Další.V dialogovém okně Další informace vyberte .NET 5.0 (Aktuální) a pak vyberte Vytvořit.
Instalace klientské knihovny pomocí NuGetu
Klikněte pravým tlačítkem na projekt formRecognizer_quickstart a vyberte Spravovat balíčky NuGet... .
Vyberte kartu Procházet a zadejte Azure.AI.FormRecognizer.
V rozevírací nabídce vyberte verzi 3.1.1 a vyberte Nainstalovat.
Sestavení aplikace
Pokud chcete pracovat se službou Document Intelligence, musíte vytvořit instanci FormRecognizerClient
třídy. Uděláte to tak, že vytvoříte klíč AzureKeyCredential
a instanci s AzureKeyCredential
funkcí Document Intelligence endpoint
FormRecognizerClient
.
Poznámka:
- Od .NET 6 vygenerují nové projekty používající
console
šablonu nový styl programu, který se liší od předchozích verzí. - Nový výstup používá nedávné funkce jazyka C#, které zjednodušují psaní kódu.
- Pokud používáte novější verzi, stačí napsat pouze tělo
Main
metody. Nemusíte zahrnovat příkazy nejvyšší úrovně, globální direktivy using ani implicitní direktivy using. - Další informace najdete v tématu Nové šablony jazyka C#, které generují příkazy nejvyšší úrovně.
Otevřete soubor Program.cs.
Zahrňte následující direktivy using:
using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
- Nastavte proměnné prostředí
endpoint
akey
vytvořte instanciAzureKeyCredential
FormRecognizerClient
:
private static readonly string endpoint = "your-form-recognizer-endpoint";
private static readonly string key = "your-api-key";
private static readonly AzureKeyCredential credential = new AzureKeyCredential(key);
Odstraňte řádek
Console.Writeline("Hello World!");
a přidejte jeden z ukázek kódu Try It do Program.cs souboru:Vyberte vzorový kód, který chcete zkopírovat a vložit do metody Main vaší aplikace:
Důležité
Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v článku zabezpečení služeb Azure AI.
Vyzkoušejte si to: Model rozložení
Extrahujte text, značky výběru, styly textu a struktury tabulky spolu s souřadnicemi ohraničující oblasti z dokumentů.
- V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
- Do proměnné jsme přidali hodnotu identifikátoru
formUri
URI souboru. - Pokud chcete extrahovat rozložení z daného souboru na identifikátor URI, použijte metodu
StartRecognizeContentFromUriAsync
.
Do souboru Program.cs aplikace rozložení přidejte následující kód:
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}'.");
}
}
}
}
}
}
Vyzkoušejte si to: Předem připravený model
Tato ukázka ukazuje, jak analyzovat data z určitých typů běžných dokumentů s předem natrénovanými modely pomocí faktury jako příkladu.
- V tomto příkladu analyzujeme dokument faktury pomocí předem vytvořeného modelu. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
- Do proměnné jsme přidali hodnotu
invoiceUri
identifikátoru URI souboru v horní části metody Main. - K analýze daného souboru na identifikátoru URI použijte metodu
StartRecognizeInvoicesFromUriAsync
. - Pro zjednodušení se zde nezobrazují všechna pole, která služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .
Volba předem vytvořeného modelu
Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro operaci analýzy, závisí na typu dokumentu, který se má analyzovat. Tady jsou předem připravené modely, které služba Document Intelligence aktuálně podporuje:
- Faktura: extrahuje text, značky výběru, tabulky, pole a klíčové informace z faktur.
- Potvrzení: extrahuje z účtenek text a klíčové informace.
- Dokument s ID: extrahuje text a klíčové informace z řidičských licencí a mezinárodních pasů.
- Vizitka: extrahuje text a klíčové informace z vizitek.
Do předem vytvořené aplikace faktury přidejte následující kód Program.cs metody souboru.
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}");
}
}
}
}
}
Spusťte aplikaci
Zvolte zelené tlačítko Start vedle formRecognizer_quickstart a sestavte a spusťte program, nebo stiskněte klávesu F5.
Referenční dokumentace | – ukázky balíčku zdrojového kódu | knihovny (Maven) |
V tomto rychlém startu použijete následující rozhraní API k extrakci strukturovaných dat z formulářů a dokumentů:
Požadavky
Předplatné Azure – Vytvořte si ho zdarma.
Sada Java Development Kit (JDK) verze 8 nebo novější. Další informace najdete v podporovaných verzích Javy a plánu aktualizací.
Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveň
F0
Free a později upgradovat na placenou úroveň pro produkční prostředí.Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:
Nastavení
Vytvoření nového projektu Gradle
V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte pro aplikaci nový adresář s názvem form-recognizer-app a přejděte na něj.
mkdir form-recognizer-app && form-recognizer-app
gradle init
Spusťte příkaz z pracovního adresáře. Tento příkaz vytvoří základní soubory sestavení pro Gradle, včetně build.gradle.kts, které se používají za běhu k vytvoření a konfiguraci aplikace.gradle init --type basic
Po zobrazení výzvy k výběru DSL vyberte Kotlin.
Přijměte výchozí název projektu (form-recognizer-app).
Instalace klientské knihovny
V tomto rychlém startu se používá správce závislostí Gradle. Klientskou knihovnu a informace pro další správce závislostí najdete v centrálním úložišti Maven.
Do souboru build.gradle.kts projektu zahrňte klientskou knihovnu implementation
jako příkaz spolu s požadovanými moduly plug-in a nastavením.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}
Vytvoření souboru Java
Z pracovního adresáře spusťte následující příkaz:
mkdir -p src/main/java
Vytvoříte následující adresářovou strukturu:
Přejděte do adresáře Java a vytvořte soubor s názvem FormRecognizer.java. Otevřete ho v preferovaném editoru nebo integrovaném vývojovém prostředí a přidejte následující deklarace a import
příkazy balíčku:
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;
Vyberte vzorový kód, který chcete zkopírovat a vložit do hlavní metody vaší aplikace:
Důležité
Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.
Vyzkoušejte si to: Model rozložení
Extrahujte text, značky výběru, styly textu a struktury tabulky spolu s souřadnicemi ohraničující oblasti z dokumentů.
- V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
- K analýze daného souboru pomocí identifikátoru URI použijete metodu
beginRecognizeContentFromUrl
. - Do proměnné v hlavní metodě jsme přidali hodnotu
formUrl
identifikátoru URI souboru.
Aktualizujte třídu FormRecognizer vaší aplikace pomocí následujícího kódu (nezapomeňte aktualizovat klíč a proměnné koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal):
static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
public static void main(String[] args) {FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder()
.credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();
String formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
System.out.println("Get form content...");
GetContent(recognizerClient, formUrl);
}
private static void GetContent(FormRecognizerClient recognizerClient, String invoiceUri) {
String analyzeFilePath = invoiceUri;
SyncPoller<FormRecognizerOperationResult, List<FormPage>> recognizeContentPoller = recognizerClient
.beginRecognizeContentFromUrl(analyzeFilePath);
List<FormPage> contentResult = recognizeContentPoller.getFinalResult();
// </snippet_getcontent_call>
// <snippet_getcontent_print>
contentResult.forEach(formPage -> {
// Table information
System.out.println("----Recognizing content ----");
System.out.printf("Has width: %f and height: %f, measured with unit: %s.%n", formPage.getWidth(),
formPage.getHeight(), formPage.getUnit());
formPage.getTables().forEach(formTable -> {
System.out.printf("Table has %d rows and %d columns.%n", formTable.getRowCount(),
formTable.getColumnCount());
formTable.getCells().forEach(formTableCell -> {
System.out.printf("Cell has text %s.%n", formTableCell.getText());
});
System.out.println();
});
});
}
Vyzkoušejte si to: Předem připravený model
Tato ukázka ukazuje, jak analyzovat data z určitých typů běžných dokumentů s předem natrénovanými modely pomocí faktury jako příkladu.
- V tomto příkladu analyzujeme dokument faktury pomocí předem vytvořeného modelu. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
- K analýze daného souboru pomocí identifikátoru
beginRecognizeInvoicesFromUrl
URI použijete . - Do proměnné v hlavní metodě jsme přidali hodnotu
invoiceUrl
identifikátoru URI souboru. - Pro zjednodušení se zde nezobrazují všechna pole, která služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .
Volba předem vytvořeného modelu
Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze
operaci, závisí na typu dokumentu, který se má analyzovat. Tady jsou předem připravené modely, které služba Document Intelligence aktuálně podporuje:
- Faktura: extrahuje text, značky výběru, tabulky, pole a klíčové informace z faktur.
- Potvrzení: extrahuje z účtenek text a klíčové informace.
- Dokument s ID: extrahuje text a klíčové informace z řidičských licencí a mezinárodních pasů.
- Vizitka: extrahuje text a klíčové informace z vizitek.
Aktualizujte třídu FormRecognizer vaší aplikace pomocí následujícího kódu (nezapomeňte aktualizovat klíč a proměnné koncového bodu hodnotami z instance Document Intelligence na webu Azure Portal):
static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
public static void main(String[] args) {
FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder().credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
System.out.println("Analyze invoice...");
AnalyzeInvoice(recognizerClient, invoiceUrl);
}
private static void AnalyzeInvoice(FormRecognizerClient recognizerClient, String invoiceUrl) {
SyncPoller < FormRecognizerOperationResult,
List < RecognizedForm >> recognizeInvoicesPoller = recognizerClient.beginRecognizeInvoicesFromUrl(invoiceUrl);
List < RecognizedForm > recognizedInvoices = recognizeInvoicesPoller.getFinalResult();
for (int i = 0; i < recognizedInvoices.size(); i++) {
RecognizedForm recognizedInvoice = recognizedInvoices.get(i);
Map < String,
FormField > recognizedFields = recognizedInvoice.getFields();
System.out.printf("----------- Recognized invoice info for page %d -----------%n", i);
FormField vendorNameField = recognizedFields.get("VendorName");
if (vendorNameField != null) {
if (FieldValueType.STRING == vendorNameField.getValue().getValueType()) {
String merchantName = vendorNameField.getValue().asString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n", merchantName, vendorNameField.getConfidence());
}
}
FormField vendorAddressField = recognizedFields.get("VendorAddress");
if (vendorAddressField != null) {
if (FieldValueType.STRING == vendorAddressField.getValue().getValueType()) {
String merchantAddress = vendorAddressField.getValue().asString();
System.out.printf("Vendor address: %s, confidence: %.2f%n", merchantAddress, vendorAddressField.getConfidence());
}
}
FormField customerNameField = recognizedFields.get("CustomerName");
if (customerNameField != null) {
if (FieldValueType.STRING == customerNameField.getValue().getValueType()) {
String merchantAddress = customerNameField.getValue().asString();
System.out.printf("Customer Name: %s, confidence: %.2f%n", merchantAddress, customerNameField.getConfidence());
}
}
FormField customerAddressRecipientField = recognizedFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (FieldValueType.STRING == customerAddressRecipientField.getValue().getValueType()) {
String customerAddr = customerAddressRecipientField.getValue().asString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n", customerAddr, customerAddressRecipientField.getConfidence());
}
}
FormField invoiceIdField = recognizedFields.get("InvoiceId");
if (invoiceIdField != null) {
if (FieldValueType.STRING == invoiceIdField.getValue().getValueType()) {
String invoiceId = invoiceIdField.getValue().asString();
System.out.printf("Invoice Id: %s, confidence: %.2f%n", invoiceId, invoiceIdField.getConfidence());
}
}
FormField invoiceDateField = recognizedFields.get("InvoiceDate");
if (customerNameField != null) {
if (FieldValueType.DATE == invoiceDateField.getValue().getValueType()) {
LocalDate invoiceDate = invoiceDateField.getValue().asDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n", invoiceDate, invoiceDateField.getConfidence());
}
}
FormField invoiceTotalField = recognizedFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (FieldValueType.FLOAT == invoiceTotalField.getValue().getValueType()) {
Float invoiceTotal = invoiceTotalField.getValue().asFloat();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n", invoiceTotal, invoiceTotalField.getConfidence());
}
}
}
}
Sestavení a spuštění aplikace
Vraťte se do hlavního adresáře projektu – form-recognizer-app.
- Sestavte aplikaci pomocí
build
příkazu:
gradle build
- Spusťte aplikaci pomocí
run
příkazu:
gradle run
Referenční dokumentace | – ukázky balíčku zdrojového kódu | knihovny (npm) |
V tomto rychlém startu použijete následující rozhraní API k extrakci strukturovaných dat z formulářů a dokumentů:
Požadavky
Předplatné Azure – Vytvořte si ho zdarma.
Nejnovější verze editoru Visual Studio Code nebo preferované integrované vývojové prostředí (IDE)
Nejnovější
LTS
verze Node.jsSlužby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveň
F0
Free a později upgradovat na placenou úroveň pro produkční prostředí.Tip
Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.
Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:
Nastavení
Vytvořte novou aplikaci Node.js. V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte pro vaši aplikaci nový adresář a přejděte do něj.
mkdir form-recognizer-app && cd form-recognizer-app
Spuštěním příkazu
npm init
vytvoříte aplikaci uzlu se souborempackage.json
.npm init
ai-form-recognizer
Nainstalujte balíček npm klientské knihovny:npm install @azure/ai-form-recognizer
Soubor vaší aplikace
package.json
se aktualizuje o závislosti.Vytvořte soubor s názvem
index.js
, otevřete ho a naimportujte následující knihovny:const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
Vytvořte proměnné pro koncový bod a klíč Azure vašeho prostředku:
const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE"; const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
V tuto chvíli by vaše aplikace v JavaScriptu měla obsahovat následující řádky kódu:
const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer"); const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"; const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
Vyberte vzorový kód, který chcete zkopírovat a vložit do aplikace:
Důležité
Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.
Vyzkoušejte si to: Model rozložení
- V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
- Do proměnné v horní části souboru jsme přidali hodnotu
formUrl
identifikátoru URI souboru. - K analýze daného souboru pomocí identifikátoru URI použijete metodu
beginRecognizeContent
.
Do aplikace rozložení přidejte následující kód na řádku pod proměnnou key
.
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
async function recognizeContent() {
const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginRecognizeContentFromUrl(formUrl);
const pages = await poller.pollUntilDone();
if (!pages || pages.length === 0) {
throw new Error("Expecting non-empty list of pages!");
}
for (const page of pages) {
console.log(
`Page ${page.pageNumber}: width ${page.width} and height ${page.height} with unit ${page.unit}`
);
for (const table of page.tables) {
for (const cell of table.cells) {
console.log(`cell [${cell.rowIndex},${cell.columnIndex}] has text ${cell.text}`);
}
}
}
}
recognizeContent().catch((err) => {
console.error("The sample encountered an error:", err);
});
Vyzkoušejte si to: Předem připravený model
Tato ukázka ukazuje, jak analyzovat data z určitých typů běžných dokumentů s předem natrénovanými modely pomocí faktury jako příkladu. Kompletní seznam polí faktury najdete na naší předem připravené stránce konceptů .
- V tomto příkladu analyzujeme dokument faktury pomocí předem vytvořeného modelu. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
- Do proměnné v horní části souboru jsme přidali hodnotu
invoiceUrl
identifikátoru URI souboru. - K analýze daného souboru pomocí identifikátoru URI použijete metodu
beginRecognizeInvoices
. - Pro zjednodušení se zde nezobrazují všechna pole, která služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .
Volba předem vytvořeného modelu
Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze
operaci, závisí na typu dokumentu, který se má analyzovat. Tady jsou předem připravené modely, které služba Document Intelligence aktuálně podporuje:
- Faktura: extrahuje text, značky výběru, tabulky, pole a klíčové informace z faktur.
- Potvrzení: extrahuje z účtenek text a klíčové informace.
- Dokument s ID: extrahuje text a klíčové informace z řidičských licencí a mezinárodních pasů.
- Vizitka: extrahuje text a klíčové informace z vizitek.
Pod proměnnou přidejte následující kód do předem připravené aplikace key
faktury.
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);
});
Referenční dokumentace | – ukázky balíčku zdrojového kódu | knihovny (PyPi) |
V tomto rychlém startu použijete následující rozhraní API k extrakci strukturovaných dat z formulářů a dokumentů:
Požadavky
Předplatné Azure: Můžete si ho vytvořit zdarma.
-
- Vaše instalace Pythonu by měla obsahovat pip. Spuštěním na příkazovém
pip --version
řádku můžete zkontrolovat, jestli máte nainstalovaný pip. Získejte pip instalací nejnovější verze Pythonu.
- Vaše instalace Pythonu by měla obsahovat pip. Spuštěním na příkazovém
Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveň
F0
Free a později upgradovat na placenou úroveň pro produkční prostředí.Tip
Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.
Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:
Nastavení
Otevřete okno terminálu v místním prostředí a nainstalujte klientskou knihovnu Azure AI Document Intelligence pro Python s pip:
pip install azure-ai-formrecognizer
Vytvoření nové aplikace v Pythonu
V preferovaném editoru nebo integrovaném vývojovém prostředí (IDE) vytvořte novou aplikaci Pythonu s názvem form_recognizer_quickstart.py . Pak naimportujte následující knihovny:
import os
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential
Vytvoření proměnných pro koncový bod prostředku Azure a klíč
endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"
V tuto chvíli by vaše aplikace v Pythonu měla obsahovat následující řádky kódu:
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"
Vyberte vzorový kód, který chcete zkopírovat a vložit do aplikace:
Důležité
Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.
Vyzkoušejte si to: Model rozložení
- V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
- Do proměnné v horní části souboru jsme přidali hodnotu
formUrl
identifikátoru URI souboru. - K analýze daného souboru pomocí identifikátoru URI použijete metodu
begin_recognize_content_from_url
.
Do aplikace rozložení přidejte následující kód na řádku pod proměnnou key
.
def format_bounding_box(bounding_box):
if not bounding_box:
return "N/A"
return ", ".join(["[{}, {}]".format(p.x, p.y) for p in bounding_box])
def recognize_content():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = form_recognizer_client.begin_recognize_content_from_url(formUrl)
form_pages = poller.result()
for idx, content in enumerate(form_pages):
print(
"Page has width: {} and height: {}, measured with unit: {}".format(
content.width, content.height, content.unit
)
)
for table_idx, table in enumerate(content.tables):
print(
"Table # {} has {} rows and {} columns".format(
table_idx, table.row_count, table.column_count
)
)
print(
"Table # {} location on page: {}".format(
table_idx, format_bounding_box(table.bounding_box)
)
)
for cell in table.cells:
print(
"...Cell[{}][{}] has text '{}' within bounding box '{}'".format(
cell.row_index,
cell.column_index,
cell.text,
format_bounding_box(cell.bounding_box),
)
)
for line_idx, line in enumerate(content.lines):
print(
"Line # {} has word count '{}' and text '{}' within bounding box '{}'".format(
line_idx,
len(line.words),
line.text,
format_bounding_box(line.bounding_box),
)
)
if line.appearance:
if (
line.appearance.style_name == "handwriting"
and line.appearance.style_confidence > 0.8
):
print(
"Text line '{}' is handwritten and might be a signature.".format(
line.text
)
)
for word in line.words:
print(
"...Word '{}' has a confidence of {}".format(
word.text, word.confidence
)
)
for selection_mark in content.selection_marks:
print(
"Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
selection_mark.state,
format_bounding_box(selection_mark.bounding_box),
selection_mark.confidence,
)
)
print("----------------------------------------")
if __name__ == "__main__":
recognize_content()
Vyzkoušejte si to: Předem připravený model
Tato ukázka ukazuje, jak analyzovat data z určitých typů běžných dokumentů s předem natrénovanými modely pomocí faktury jako příkladu. Kompletní seznam polí faktury najdete na naší předem připravené stránce konceptů .
- V tomto příkladu analyzujeme dokument faktury pomocí předem vytvořeného modelu. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
- Do proměnné formUrl v horní části souboru jsme přidali hodnotu identifikátoru URI souboru.
- K analýze daného souboru pomocí identifikátoru URI použijete metodu "begin_recognize_invoices_from_url".
- Pro zjednodušení se zde nezobrazují všechna pole, která služba vrací. Seznam všech podporovaných polí a odpovídajících typů najdete na naší stránce konceptů faktury .
Volba předem vytvořeného modelu
Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze
operaci, závisí na typu dokumentu, který se má analyzovat. Tady jsou předem připravené modely, které služba Document Intelligence aktuálně podporuje:
- Faktura: extrahuje text, značky výběru, tabulky, pole a klíčové informace z faktur.
- Potvrzení: extrahuje z účtenek text a klíčové informace.
- Dokument s ID: extrahuje text a klíčové informace z řidičských licencí a mezinárodních pasů.
- Vizitka: extrahuje text a klíčové informace z vizitek.
Pod proměnnou přidejte následující kód do předem připravené aplikace key
faktury.
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()
Spusťte aplikaci
Přejděte do složky, ve které máte soubor form_recognizer_quickstart.py .
Do terminálu zadejte následující příkaz:
python form_recognizer_quickstart.py
| Referenční informace k rozhraní REST API | služby Document Intelligence v Azure REST API |
V tomto rychlém startu použijete následující rozhraní API k extrakci strukturovaných dat z formulářů a dokumentů:
Požadavky
Předplatné Azure: Můžete si ho vytvořit zdarma.
PowerShell verze 6.0 nebo podobná aplikace příkazového řádku
Služby Azure AI nebo prostředek Document Intelligence Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Document Intelligence s jednou službou nebo více službami, abyste získali klíč a koncový bod. K vyzkoušení služby můžete použít cenovou úroveň
F0
Free a později upgradovat na placenou úroveň pro produkční prostředí.Tip
Pokud plánujete přístup k více službám Azure AI v rámci jednoho koncového bodu nebo klíče, vytvořte prostředek služeb Azure AI. Pouze pro přístup k funkci Document Intelligence vytvořte prostředek Document Intelligence. Upozorňujeme, že pokud máte v úmyslu používat ověřování Microsoft Entra, budete potřebovat prostředek s jednou službou.
Po nasazení prostředku vyberte Přejít k prostředku. Klíč a koncový bod z prostředku, který vytvoříte, potřebujete k připojení aplikace k rozhraní DOCUMENT Intelligence API. Klíč a koncový bod vložíte do kódu později v rychlém startu:
Vyberte vzorový kód, který chcete zkopírovat a vložit do aplikace:
Důležité
Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v tématu Zabezpečení služeb Azure AI.
Vyzkoušejte si to: Model rozložení
- V tomto příkladu budete potřebovat soubor dokumentu na identifikátoru URI. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument .
- Nahraďte
{endpoint}
koncovým bodem, který jste získali v předplatném Document Intelligence. - Nahraďte
{key}
klíčem, který jste zkopírovali z předchozího kroku. - Nahraďte
\"{your-document-url}
ukázkovou adresou URL dokumentu:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Žádost
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}'}"
Umístění operace
Obdržíte 202 (Success)
odpověď, která obsahuje hlavičku Operation-Location . Hodnota této hlavičky obsahuje ID výsledku, které můžete použít k dotazování na stav asynchronní operace a získání výsledků:
https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.
V následujícím příkladu jako součást adresy URL je řetězec za analyzeResults/
ID výsledku.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Získání výsledků rozložení
Po volání Analyze Layout
rozhraní API zavoláte rozhraní API pro analýzu výsledků rozložení, abyste získali stav operace a extrahovaná data. Před spuštěním příkazu proveďte tyto změny:
- Nahraďte
{endpoint}
koncovým bodem, který jste získali v předplatném Document Intelligence. - Nahraďte
{key}
klíčem, který jste zkopírovali z předchozího kroku. - Nahraďte
{resultId}
ID výsledku z předchozího kroku.
Žádost
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Prozkoumání výsledků
Obdržíte 200 (success)
odpověď s obsahem JSON.
Podívejte se na následující obrázek faktury a odpovídající výstup JSON.
- Uzel
"readResults"
obsahuje každý řádek textu s příslušným umístěním ohraničujícího rámečku na stránce. - Uzel
selectionMarks
zobrazuje každou značku výběru (zaškrtávací políčko, značku rádia) a informace o tom, jestli jeselected
unselected
nebo . - Oddíl
"pageResults"
obsahuje extrahované tabulky. Pro každou tabulku se extrahují text, řádek a index sloupců, řádky a sloupce, které pokrývají, ohraničující pole a další.
Text odpovědi
Úplný ukázkový výstup můžete zobrazit na GitHubu.
Vyzkoušejte si to: Předem připravený model
- V tomto příkladu analyzujeme dokument faktury pomocí předem vytvořeného modelu. Pro účely tohoto rychlého startu můžete použít náš ukázkový dokument faktury.
Volba předem vytvořeného modelu
Nejste omezeni na faktury – můžete si vybrat z několika předem připravených modelů, z nichž každá má svou vlastní sadu podporovaných polí. Model, který se má použít pro analyze
operaci, závisí na typu dokumentu, který se má analyzovat. Tady jsou předem připravené modely, které služba Document Intelligence aktuálně podporuje:
- Faktura: extrahuje text, značky výběru, tabulky, pole a klíčové informace z faktur.
- Potvrzení: extrahuje z účtenek text a klíčové informace.
- Dokument s ID: extrahuje text a klíčové informace z řidičských licencí a mezinárodních pasů.
- Vizitka: extrahuje text a klíčové informace z vizitek.
Před spuštěním příkazu proveďte tyto změny:
Nahraďte
{endpoint}
koncovým bodem, který jste získali v předplatném Document Intelligence.Nahraďte
{key}
klíčem, který jste zkopírovali z předchozího kroku.Nahraďte
\"{your-document-url}
ukázkovou adresou URL faktury:https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf
Žádost
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}'}"
Umístění operace
Obdržíte 202 (Success)
odpověď, která obsahuje hlavičku Operation-Location . Hodnota této hlavičky obsahuje ID výsledku, které můžete použít k dotazování na stav asynchronní operace a získání výsledků:
https:// cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}
V následujícím příkladu jako součást adresy URL je řetězec za analyzeResults/
ID výsledku:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Získání výsledků faktury
Po volání Analyze Invoice
rozhraní API zavoláte rozhraní API pro analýzu výsledku faktury, abyste získali stav operace a extrahovaná data. Před spuštěním příkazu proveďte tyto změny:
- Nahraďte
{endpoint}
koncovým bodem, který jste získali klíčem Document Intelligence. Najdete ho na kartě Přehled prostředku Document Intelligence. - Nahraďte
{resultId}
ID výsledku z předchozího kroku. {key}
nahraďte tímto klíčem.
Žádost
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Prozkoumání odpovědi
Obdržíte odpověď s výstupem 200 (Success)
JSON.
- Pole
"readResults"
obsahuje každý řádek textu extrahovaný z faktury. - Zahrnuje
"pageResults"
tabulky a značky výběru extrahované z faktury. - Pole
"documentResults"
obsahuje informace o klíči a hodnotě pro nejrelevavantnější části faktury.
Podívejte se na ukázkový dokument faktury .
Text odpovědi
Podívejte se na úplný ukázkový výstup na GitHubu.
To je to, dobře hotovo!
Další kroky
Pokud chcete vylepšit prostředí a pokročilou kvalitu modelu, vyzkoušejte Sadu Document Intelligence Studio.
Studio podporuje jakýkoli model natrénovaný s daty označenými v2.1.
Protokoly změn poskytují podrobné informace o migraci z verze 3.1 na verzi 4.0.