A dokumentumintelligencia használatának első lépései
Fontos
- Az Azure Cognitive Services Form Recognizer mostantól Azure AI-dokumentumintelligencia.
- Egyes platformok továbbra is az átnevezési frissítésre várnak.
- A Dokumentációnkban a Form Recognizer vagy a Document Intelligence minden említése ugyanarra az Azure-szolgáltatásra vonatkozik.
Ez a tartalom a következőre vonatkozik: v4.0 (előzetes verzió) Korábbi verziók: v3.1 (GA) v3.0 (GA)
- Ismerkedés az Azure AI Document Intelligence legújabb előzetes verziójával (2024-07-31-preview).
Ez a tartalom a következőre vonatkozik: v3.1 (GA) Korábbi verziók: v3.0 v2.1
- Ismerkedés az Azure Form Recognizer legújabb GA-verziójával (
2023-07-31
).
Ez a tartalom a következőre vonatkozik: v3.0 (GA) Újabb verzió: v3.1 v2.1
- Ismerkedés az Azure Form Recognizer örökölt GA-verziójával (
2022-08-31
).
Az Azure AI Document Intelligence /Form Recognizer egy felhőalapú Azure AI-szolgáltatás, amely gépi tanulással kinyeri a kulcs-érték párokat, szövegeket, táblákat és kulcsadatokat a dokumentumokból.
A dokumentumfeldolgozó modelleket egyszerűen integrálhatja munkafolyamataiba és alkalmazásaiba egy programozási nyelvű SDK használatával vagy a REST API meghívásával.
Ebben a rövid útmutatóban azt javasoljuk, hogy a technológia elsajátítása során használja az ingyenes szolgáltatást. Ne feledje, hogy az ingyenes oldalak száma havonta legfeljebb 500 lehet.
Ha többet szeretne megtudni az API-funkciókról és a fejlesztési lehetőségekről, látogasson el az Áttekintés oldalra.
Ügyfélkódtár SDK-referencia | REST API-referenciacsomagminták| | | támogatott REST API-verziója |
Ügyfélkódtár SDK referencia | API-referenciacsomagja | (NuGet) | Minták | támogatott REST API-verzió |
Ügyfélkódtár SDK-referencia | REST API-referenciacsomagminták | | | támogatott REST API-verziója |
Ebben a rövid útmutatóban az alábbi funkciókkal elemezheti és kinyerheti az adatokat és értékeket űrlapokból és dokumentumokból:
Elrendezési modell – Táblázatok, vonalak, szavak és kijelölési jelek, például választógombok és jelölőnégyzetek elemzése és kinyerése a dokumentumokban, modell betanítása nélkül.
Előre összeállított modell – Általános mezők elemzése és kinyerése adott dokumentumtípusokból előre összeállított modell használatával.
Előfeltételek
Azure-előfizetés – Hozzon létre egyet ingyenesen.
A Visual Studio IDE aktuális verziója.
Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos Azure AI-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez.
Az ingyenes tarifacsomag (
F0
) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.
Tipp.
Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.
Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:
Azure AI-szolgáltatások vagy Űrlap-felismerő erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos Azure AI-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez.
Az ingyenes tarifacsomag (
F0
) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.
Tipp.
Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak űrlap-felismerői hozzáférés esetén hozzon létre egy Űrlap-felismerő erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.
Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás form Recognizer API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:
Beállítás
Indítsa el a Visual Studiót.
A kezdőlapon válassza az Új projekt létrehozása lehetőséget.
Az Új projekt létrehozása lapon adja meg a konzolt a keresőmezőbe. Válassza ki a konzolalkalmazás-sablont, majd válassza a Tovább gombot.
- Az új projekt konfigurálása párbeszédpanelen írja be
doc_intel_quickstart
a Projekt neve mezőbe. Ezután válassza a Tovább gombot.
- Az új projekt konfigurálása párbeszédpanelen írja be
form_recognizer_quickstart
a Projekt neve mezőbe. Ezután válassza a Tovább gombot.
A További információ párbeszédpanelen válassza a .NET 8.0 (Hosszú távú támogatás) lehetőséget, majd válassza a Létrehozás lehetőséget.
Az ügyfélkódtár telepítése a NuGettel
Kattintson a jobb gombbal a doc_intel_quickstart projektre, és válassza a NuGet-csomagok kezelése... lehetőséget.
Válassza a Tallózás lapot, és írja be az Azure.AI.DocumentIntelligence parancsot.
Jelölje be a
Include prerelease
jelölőnégyzetet.Válasszon egy verziót a legördülő menüből, és telepítse a csomagot a projektbe.
Kattintson a jobb gombbal a form_recognizer_quickstart projektre, és válassza a NuGet-csomagok kezelése... lehetőséget.
Válassza a Tallózás lapot, és írja be az Azure.AI.FormRecognizer parancsot. Válassza ki a 4.1.0-s verziót a legördülő menüből
Kattintson a jobb gombbal a form_recognizer_quickstart projektre, és válassza a NuGet-csomagok kezelése... lehetőséget.
Válassza a Tallózás lapot, és írja be az Azure.AI.FormRecognizer parancsot. Válassza ki a 4.0.0-s verziót a legördülő menüből
Az alkalmazás összeállítása
A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentIntelligenceClient
. Ehhez létre kell hoznia egy példányt AzureKeyCredential
key
az Azure Portalról, valamint egy DocumentIntelligenceClient
példányt a dokumentumintelligencia és a AzureKeyCredential
dokumentumintelligencia használatával endpoint
.
A Form Recognizer szolgáltatás használatához létre kell hoznia egy osztálypéldányt DocumentAnalysisClient
. Ehhez létre kell hoznia egy AzureKeyCredential
key
példányt az Azure Portalról, valamint egy példányt DocumentAnalysisClient
a AzureKeyCredential
Form Recognizerrel endpoint
.
Feljegyzés
- A .NET 6-tól kezdve a
console
sablont használó új projektek új programstílust hoznak létre, amely eltér a korábbi verzióktól. - Az új kimenet a legutóbbi C#-funkciókat használja, amelyek leegyszerűsítik az írandó kódot.
- Az újabb verzió használatakor csak a metódus törzsét
Main
kell megírnia. Nem kell felső szintű utasításokat, globális irányelveket vagy implicit irányelveket használnia. - További információ: Új C#-sablonok legfelső szintű utasítások létrehozása.
Nyissa meg a Program.cs fájlt.
Törölje a már meglévő kódot, beleértve a sort
Console.Writeline("Hello World!")
is, és válassza ki az alábbi kódminták egyikét az alkalmazás Program.cs fájljába való másoláshoz és beillesztéshez:
Fontos
Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.
Elrendezési modell
Szöveg, kijelölési jelek, szövegstílusok, táblázatstruktúrák és határolórégió koordinátáinak kinyerése dokumentumokból.
- Ebben a példában egy URI-ból származó dokumentumfájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
- Hozzáadtuk a fájl URI-értékét a
Uri fileUri
szkript tetején található változóhoz. - Ha ki szeretné nyerni az elrendezést egy adott fájlból egy URI-n, használja a
StartAnalyzeDocumentFromUri
metódust, és adja átprebuilt-layout
a modellazonosítót. A visszaadott érték egyAnalyzeResult
olyan objektum, amely az elküldött dokumentumból származó adatokat tartalmazza.
Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:
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}");
}
}
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.
Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:
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}'.");
}
}
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.
Elrendezési modell kimenete
Íme egy kódrészlet a várt kimenetről:
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
A teljes kimenet megtekintéséhez látogasson el az Azure-minták adattárába a GitHubon az elrendezési modell kimenetének megtekintéséhez.
Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:
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}'.");
}
}
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.
Előre összeállított modell
Egy előre összeállított modell használatával elemezheti és kinyerheti a gyakori mezőket adott dokumentumtípusokból. Ebben a példában egy számlát elemezünk az előre összeállított számlamodell használatával.
Tipp.
Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. A művelethez analyze
használandó modell az elemezni kívánt dokumentum típusától függ. Lásd: modelladatok kinyerése.
- Számla elemzése az előre összeállított számlamodell használatával. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
- Hozzáadtuk a fájl URI-értékét a
Uri invoiceUri
Program.cs fájl tetején lévő változóhoz. - Ha egy adott fájlt egy URI-n szeretne elemezni, használja a
StartAnalyzeDocumentFromUri
metódust, és adja átprebuilt-invoice
a modellazonosítót. A visszaadott érték egyAnalyzeResult
olyan objektum, amely az elküldött dokumentumból származó adatokat tartalmazza. - Az egyszerűség kedvéért a szolgáltatás által visszaadott kulcs-érték párok nem jelennek meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.
Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:
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}");
}
}
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.
Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:
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}");
}
}
}
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.
Előre összeállított modell kimenete
Íme egy kódrészlet a várt kimenetről:
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
A teljes kimenet megtekintéséhez látogasson el a GitHub Azure-mintaadattárába az előre összeállított számlamodell kimenetének megtekintéséhez.
Adja hozzá a következő kódmintát a Program.cs fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:
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}");
}
}
}
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, válassza a zöld Start gombot a formRecognizer_quickstart mellett a program létrehozásához és futtatásához, vagy nyomja le az F5 billentyűt.
Ügyfélkódtár SDK-referencia | REST API-referenciacsomag | (Maven) | Minták |támogatott REST API-verzió |
Ügyfélkódtár SDK-referencia | REST API-referenciacsomag | (Maven) | Minták| támogatott REST API-verzió |
Ügyfélkódtár SDK-referencia | REST API-referenciacsomag | (Maven) | Minták|támogatott REST API-verzió |
Ebben a rövid útmutatóban az alábbi funkciókkal elemezheti és kinyerheti az adatokat és értékeket űrlapokból és dokumentumokból:
Elrendezés – Táblázatok, vonalak, szavak és kijelölési jelek, például választógombok és jelölőnégyzetek elemzése és kinyerése a dokumentumokban, modell betanítása nélkül.
Előre összeállított számla – Általános mezők elemzése és kinyerése adott dokumentumtípusokból egy előre betanított modell használatával.
Előfeltételek
Azure-előfizetés – Hozzon létre egyet ingyenesen.
A Visual Studio Code legújabb verziója vagy az ön által előnyben részesített IDE. Lásd a Java-t a Visual Studio Code-ban.
Tipp.
- A Visual Studio Code a Java kódolási csomagját kínálja Windowshoz és macOS-hez. A kódolási csomag a VS Code, a Java Fejlesztői Készlet (JDK) és a Microsoft által javasolt bővítmények gyűjteménye. A kódolási csomag egy meglévő fejlesztési környezet javításához is használható.
- Ha a VS Code-ot és a Java kódolási csomagját használja, telepítse a Gradle for Java bővítményt.
Ha nem a Visual Studio Code-ot használja, győződjön meg arról, hogy telepítve van a következő a fejlesztői környezetben:
A Java Development Kit (JDK) 8-es vagy újabb verziója. További információ: Microsoft Build of OpenJDK.
Gradle, 6.8-es vagy újabb verzió.
Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egy vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (
F0
) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.Tipp.
Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.
Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. Később illessze be a kulcsot és a végpontot a kódba:
Beállítás
Új Gradle-projekt létrehozása
A konzolablakban (például parancsmag, PowerShell vagy Bash) hozzon létre egy új könyvtárat az alkalmazáshoz doc-intel-app néven, és navigáljon hozzá.
mkdir doc-intel-app && doc-intel-app
mkdir doc-intel-app; cd doc-intel-app
Futtassa a
gradle init
parancsot a munkakönyvtárból. Ez a parancs alapvető buildfájlokat hoz létre a Gradle számára, beleértve a build.gradle.kts fájlt is, amelyet futásidőben használnak az alkalmazás létrehozásához és konfigurálásához.gradle init --type basic
Amikor a rendszer kéri, hogy válasszon egy DSL-t, válassza a Kotlin lehetőséget.
Fogadja el az alapértelmezett projektnevet (doc-intel-app) a Return vagy az Enter billentyűkombinációval.
A konzolablakban (például parancsmag, PowerShell vagy Bash) hozzon létre egy új könyvtárat az alkalmazáshoz, az úgynevezett form-recognize-apphoz, és navigáljon hozzá.
mkdir form-recognize-app && form-recognize-app
mkdir form-recognize-app; cd form-recognize-app
Futtassa a
gradle init
parancsot a munkakönyvtárból. Ez a parancs alapvető buildfájlokat hoz létre a Gradle számára, beleértve a build.gradle.kts fájlt is, amelyet futásidőben használnak az alkalmazás létrehozásához és konfigurálásához.gradle init --type basic
Amikor a rendszer kéri, hogy válasszon egy DSL-t, válassza a Kotlin lehetőséget.
Fogadja el az alapértelmezett projektnevet (form-recognize-app) a Return vagy az Enter billentyűkombinációval.
Telepítse az ügyfélkódtárat
Ez a rövid útmutató a Gradle függőségkezelőt használja. A Maven Central-adattárban megtalálhatja a többi függőségkezelő ügyfélkódtárát és információit.
Nyissa meg a projekt build.gradle.kts fájlját az IDE-ben. A következő kódot fizetve adja meg az ügyfélkódtárat utasításként implementation
, valamint a szükséges beépülő modulokat és beállításokat.
plugins {
java
application
}
application {
mainClass.set("DocIntelligence")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0-beta.4'
}
Ez a rövid útmutató a Gradle függőségkezelőt használja. A Maven Central-adattárban megtalálhatja a többi függőségkezelő ügyfélkódtárát és információit.
Nyissa meg a projekt build.gradle.kts fájlját az IDE-ben. A következő kódot fizetve adja meg az ügyfélkódtárat utasításként implementation
, valamint a szükséges beépülő modulokat és beállításokat.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.1.0'
}
Ez a rövid útmutató a Gradle függőségkezelőt használja. A Maven Central-adattárban megtalálhatja a többi függőségkezelő ügyfélkódtárát és információit.
Nyissa meg a projekt build.gradle.kts fájlját az IDE-ben. A következő kódot fizetve adja meg az ügyfélkódtárat utasításként implementation
, valamint a szükséges beépülő modulokat és beállításokat.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'
}
Java-alkalmazás létrehozása
A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentIntelligenceClient
. Ehhez létre kell hoznia egy példányt AzureKeyCredential
key
az Azure Portalról, valamint egy DocumentIntelligenceClient
példányt a dokumentumintelligencia és a AzureKeyCredential
dokumentumintelligencia használatával endpoint
.
A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient
. Ehhez létre kell hoznia egy példányt AzureKeyCredential
key
az Azure Portalról, valamint egy DocumentAnalysisClient
példányt a dokumentumintelligencia és a AzureKeyCredential
dokumentumintelligencia használatával endpoint
.
A doc-intel-app könyvtárban futtassa a következő parancsot:
mkdir -p src/main/java
A következő könyvtárstruktúrát hozza létre:
Lépjen a
java
könyvtárra, és hozzon létre egy fájlt.DocIntelligence.java
Tipp.
- Új fájlt a PowerShell használatával hozhat létre.
- Nyisson meg egy PowerShell-ablakot a projektkönyvtárban a Shift billentyűt lenyomva tartva kattintson a jobb gombbal a mappára.
- Írja be a következő parancsot : New-Item DocIntelligence.java.
Nyissa meg a(z)
DocIntelligence.java
fájlt. Másolja és illessze be az alábbi kódminták egyikét az alkalmazásba:
Lépjen a
java
könyvtárra, és hozzon létre egy fájlt.FormRecognizer.java
Tipp.
- Új fájlt a PowerShell használatával hozhat létre.
- Nyisson meg egy PowerShell-ablakot a projektkönyvtárban a Shift billentyűt lenyomva tartva kattintson a jobb gombbal a mappára.
- Írja be a következő parancsot : New-Item FormRecognizer.java.
Nyissa meg a(z)
FormRecognizer.java
fájlt. Másolja és illessze be az alábbi kódminták egyikét az alkalmazásba:
Fontos
Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.
Elrendezési modell
Szöveg, kijelölési jelek, szövegstílusok, táblázatstruktúrák és határolórégió koordinátáinak kinyerése dokumentumokból.
- Ebben a példában egy URI-fájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
- Ha egy adott fájlt egy URI-n szeretne elemezni, használja a
beginAnalyzeDocumentFromUrl
metódust, és adja átprebuilt-layout
a modellazonosítót. A visszaadott érték egyAnalyzeResult
olyan objektum, amely adatokat tartalmaz az elküldött dokumentumról. - Hozzáadtuk a fájl URI-értékét a
documentUrl
fő metódus változóhoz.
Adja hozzá a következő kódmintát a DocIntelligence.java
fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:
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()));
}
}
Az alkalmazás létrehozása és futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz – a doc-intel-apphoz.
Az alkalmazás létrehozása a
build
következő paranccsal:gradle build
Futtassa az alkalmazást a
run
következő paranccsal:gradle run
Adja hozzá a következő kódmintát a FormRecognizer.java
fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:
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(", "));
}
}
Az alkalmazás létrehozása és futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz , a form-recognize-apphoz.
Az alkalmazás létrehozása a
build
következő paranccsal:gradle build
Futtassa az alkalmazást a
run
következő paranccsal:gradle run
Elrendezési modell kimenete
Íme egy kódrészlet a várt kimenetről:
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.
A teljes kimenet megtekintéséhez látogasson el az Azure-minták adattárába a GitHubon az elrendezési modell kimenetének megtekintéséhez.
Adja hozzá a következő kódmintát a FormRecognizer.java
fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:
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(", "));
}
}
Az alkalmazás létrehozása és futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz , a form-recognize-apphoz.
Az alkalmazás létrehozása a
build
következő paranccsal:gradle build
Futtassa az alkalmazást a
run
következő paranccsal:gradle run
Előre összeállított modell
Egy előre összeállított modell használatával elemezheti és kinyerheti a gyakori mezőket adott dokumentumtípusokból. Ebben a példában egy számlát elemezünk az előre összeállított számlamodell használatával.
Tipp.
Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. A művelethez analyze
használandó modell az elemezni kívánt dokumentum típusától függ. Lásd: modelladatok kinyerése.
- Számla elemzése az előre összeállított számlamodell használatával. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
- Hozzáadtuk a fájl URL-címét a
invoiceUrl
fájl tetején lévő változóhoz. - Ha egy adott fájlt egy URI-n szeretne elemezni, használja a
beginAnalyzeDocuments
metódust, és adja átPrebuiltModels.Invoice
a modellazonosítót. A visszaadott érték egyresult
olyan objektum, amely adatokat tartalmaz az elküldött dokumentumról. - Az egyszerűség kedvéért a szolgáltatás által visszaadott kulcs-érték párok nem jelennek meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.
Adja hozzá a következő kódmintát a DocIntelligence.java
fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:
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());
}
}
}));
}
}
}
}
}
}
Az alkalmazás létrehozása és futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz – a doc-intel-apphoz.
Az alkalmazás létrehozása a
build
következő paranccsal:gradle build
Futtassa az alkalmazást a
run
következő paranccsal:gradle run
Adja hozzá a következő kódmintát a FormRecognizer.java
fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:
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());
}
}
}));
}
}
}
}
}
Az alkalmazás létrehozása és futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz – a doc-intel-apphoz.
Az alkalmazás létrehozása a
build
következő paranccsal:gradle build
Futtassa az alkalmazást a
run
következő paranccsal:gradle run
Előre összeállított modell kimenete
Íme egy kódrészlet a várt kimenetről:
----------- 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
A teljes kimenet megtekintéséhez látogasson el a GitHub Azure-mintaadattárába az előre összeállított számlamodell kimenetének megtekintéséhez.
Adja hozzá a következő kódmintát a FormRecognizer.java
fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:
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());
}
}
}));
}
}
}
}
}
Az alkalmazás létrehozása és futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, lépjen vissza a fő projektkönyvtárhoz – a doc-intel-apphoz.
Az alkalmazás létrehozása a
build
következő paranccsal:gradle build
Futtassa az alkalmazást a
run
következő paranccsal:gradle run
Ügyfélkódtár SDK-referencia | REST API-referenciacsomag | (npm) | Minták |támogatott REST API-verzió |
Ügyfélkódtár SDK-referencia | REST API-referenciacsomag | (npm) | Minták |támogatott REST API-verzió |
Ebben a rövid útmutatóban az alábbi funkciókkal elemezheti és kinyerheti az adatokat és értékeket űrlapokból és dokumentumokból:
Elrendezés – Táblázatok, vonalak, szavak és kijelölési jelek, például választógombok és jelölőnégyzetek elemzése és kinyerése a dokumentumokban, modell betanítása nélkül.
Előre összeállított számla – Általános mezők elemzése és kinyerése adott dokumentumtípusokból egy előre betanított számlamodell használatával.
Előfeltételek
Azure-előfizetés – Hozzon létre egyet ingyenesen.
A Visual Studio Code legújabb verziója vagy az ön által előnyben részesített IDE. További információ: Node.js a Visual Studio Code-ban.
A Node.js legújabb
LTS
verziója.Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egy vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (
F0
) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.Tipp.
Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.
Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:
Beállítás
Új Node.js Express-alkalmazás létrehozása: Egy konzolablakban (például parancsmag, PowerShell vagy Bash) hozzon létre egy új könyvtárat, és keresse meg az alkalmazás nevét
doc-intel-app
.mkdir doc-intel-app && cd doc-intel-app
Futtassa a
npm init
parancsot az alkalmazás inicializálásához és a projekt létrehozásához.npm init
Adja meg a projekt attribútumait a terminálban megjelenő parancssorok használatával.
- A legfontosabb attribútumok a név, a verziószám és a belépési pont.
- Javasoljuk, hogy tartsa meg
index.js
a belépési pont nevét. A leírás, a tesztparancs, a GitHub-adattár, a kulcsszavak, a szerző és a licencadatok opcionális attribútumok– ezek kihagyhatók ehhez a projekthez. - Fogadja el a javaslatokat zárójelben a Return vagy az Enter billentyűkombinációval.
- A kérések elvégzése után létrejön egy
package.json
fájl a doc-intel-app könyvtárban.
Telepítse az ügyfélkódtárat és
azure/identity
azai-document-intelligence
npm-csomagokat:npm i @azure-rest/ai-document-intelligence@1.0.0-beta.3 @azure/core-auth
Az alkalmazás fájlja
package.json
frissül a függőségekkel.
Telepítse az ügyfélkódtárat és
azure/identity
azai-form-recognizer
npm-csomagokat:npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
- Az alkalmazás fájlja
package.json
frissül a függőségekkel.
- Az alkalmazás fájlja
Telepítse az ügyfélkódtárat és
azure/identity
azai-form-recognizer
npm-csomagokat:npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
Hozzon létre egy fájlt
index.js
az alkalmazáskönyvtárban.Tipp.
- Új fájlt a PowerShell használatával hozhat létre.
- Nyisson meg egy PowerShell-ablakot a projektkönyvtárban a Shift billentyűt lenyomva tartva kattintson a jobb gombbal a mappára.
- Írja be a következő parancsot : New-Item index.js.
Az alkalmazás összeállítása
A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentIntelligenceClient
. Ehhez létre kell hoznia egy példányt AzureKeyCredential
key
az Azure Portalról, valamint egy DocumentIntelligenceClient
példányt a dokumentumintelligencia és a AzureKeyCredential
dokumentumintelligencia használatával endpoint
.
A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient
. Ehhez létre kell hoznia egy AzureKeyCredential
key
példányt az Azure Portalról, valamint egy példányt DocumentAnalysisClient
a AzureKeyCredential
Form Recognizerrel endpoint
.
Nyissa meg a fájlt a
index.js
Visual Studio Code-ban vagy a kedvenc IDE-ben. Másolja és illessze be az alábbi kódminták egyikét az alkalmazásba:
Fontos
Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.
Elrendezési modell
Szöveg, kijelölési jelek, szövegstílusok, táblázatstruktúrák és határolórégió koordinátáinak kinyerése dokumentumokból.
- Ebben a példában egy URL-címről származó dokumentumfájlra lesz szüksége. Ehhez a rövid útmutatóhoz használhatja a mintadokumentumunkat.
- Hozzáadtuk a fájl URL-címét a
formUrl
fájl tetején található változóhoz.- Ha egy adott fájlt egy URL-címből szeretne elemezni, a
beginAnalyzeDocuments
metódust fogja használni, és modellazonosítóként adja átprebuilt-layout
.
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);
});
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, futtassa a programot:
Lépjen arra a mappára, ahol a Dokumentumintelligencia-alkalmazás (doc-intel-app) található.
Írja be a következő parancsot a terminálba:
node index.js
Adja hozzá a következő kódmintát a index.js
fájlhoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:
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);
});
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, futtassa a programot:
Lépjen arra a mappára, ahol a Dokumentumintelligencia-alkalmazás (doc-intel-app) található.
Írja be a következő parancsot a terminálba:
node index.js
Elrendezési modell kimenete
Íme egy kódrészlet a várt kimenetről:
Pages:
- Page 1 (unit: inch)
8.5x11, angle: 0
69 lines, 425 words
Tables:
- Extracted table: 3 columns, 5 rows (15 cells)
A teljes kimenet megtekintéséhez látogasson el az Azure-minták adattárába a GitHubon az elrendezési modell kimenetének megtekintéséhez.
Előre összeállított modell
Ebben a példában egy számlát elemezünk az előre összeállított számlamodell használatával.
Tipp.
Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. A művelethez analyze
használandó modell az elemezni kívánt dokumentum típusától függ. Lásd: modelladatok kinyerése.
- Számla elemzése az előre összeállított számlamodell használatával. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
- Hozzáadtuk a fájl URL-címét a
invoiceUrl
fájl tetején lévő változóhoz. - Ha egy adott fájlt egy URI-n szeretne elemezni, használja a
beginAnalyzeDocuments
metódust, és adja átPrebuiltModels.Invoice
a modellazonosítót. A visszaadott érték egyresult
olyan objektum, amely adatokat tartalmaz az elküldött dokumentumról. - Az egyszerűség kedvéért a szolgáltatás által visszaadott kulcs-érték párok nem jelennek meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.
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);
});
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, futtassa a programot:
Lépjen arra a mappára, ahol a Dokumentumintelligencia-alkalmazás (doc-intel-app) található.
Írja be a következő parancsot a terminálba:
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);
});
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, futtassa a programot:
Lépjen arra a mappára, ahol a Dokumentumintelligencia-alkalmazás (doc-intel-app) található.
Írja be a következő parancsot a terminálba:
node index.js
Előre összeállított modell kimenete
Íme egy kódrészlet a várt kimenetről:
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
A teljes kimenet megtekintéséhez látogasson el a GitHub Azure-mintaadattárába az előre összeállított számlamodell kimenetének megtekintéséhez.
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);
});
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, futtassa a programot:
Lépjen arra a mappára, ahol a Dokumentumintelligencia-alkalmazás (doc-intel-app) található.
Írja be a következő parancsot a terminálba:
node index.js
Ügyfélkódtár SDK-referencia | REST API-referenciacsomag | (PyPi) | Minták | támogatott REST API-verzió |
Ügyfélkódtár SDK-referencia | REST API-referenciacsomag | (PyPi) | Minták | támogatott REST API-verzió |
Ügyfélkódtár SDK-referencia | REST API-referenciacsomag | (PyPi) | Minták | támogatott REST API-verzió |
Ebben a rövid útmutatóban az alábbi funkciókkal elemezheti és kinyerheti az adatokat űrlapokból és dokumentumokból:
Elrendezés – Táblázatok, vonalak, szavak és kijelölési jelek, például választógombok, jelölőnégyzetek és kulcs-érték párok elemzése és kinyerése anélkül, hogy be kellene tanítani egy modellt.
Előre összeállított számla – Általános mezők elemzése és kinyerése adott dokumentumtípusokból egy előre betanított modell használatával.
Előfeltételek
Azure-előfizetés – Hozzon létre egyet ingyenesen.
A Visual Studio Code legújabb verziója vagy az ön által előnyben részesített IDE. További információ: A Python használatának első lépései a Visual Studio Code-ban.
Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egy vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (
F0
) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.
Tipp.
Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.
Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:
Beállítás
Nyisson meg egy terminálablakot a helyi környezetben, és telepítse a Pythonhoz készült Azure AI Document Intelligence ügyféloldali kódtárat pip használatával:
pip install azure-ai-documentintelligence==1.0.0b4
pip install azure-ai-formrecognizer==3.3.0
pip install azure-ai-formrecognizer==3.2.0b6
Python-alkalmazás létrehozása
A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentIntelligenceClient
. Ehhez létre kell hoznia egy példányt AzureKeyCredential
key
az Azure Portalról, valamint egy DocumentIntelligenceClient
példányt a dokumentumintelligencia és a AzureKeyCredential
dokumentumintelligencia használatával endpoint
.
Hozzon létre egy doc_intel_quickstart.py nevű új Python-fájlt az előnyben részesített szerkesztőben vagy IDE-ben.
Nyissa meg a doc_intel_quickstart.py fájlt, és válassza ki az alábbi kódminták egyikét az alkalmazásba való másoláshoz és beillesztéshez:
A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát DocumentAnalysisClient
. Ehhez létre kell hoznia egy példányt AzureKeyCredential
key
az Azure Portalról, valamint egy DocumentAnalysisClient
példányt a dokumentumintelligencia és a AzureKeyCredential
dokumentumintelligencia használatával endpoint
.
Hozzon létre egy form_recognizer_quickstart.py nevű új Python-fájlt az előnyben részesített szerkesztőben vagy IDE-ben.
Nyissa meg a form_recognizer_quickstart.py fájlt, és válassza ki az alábbi kódminták egyikét az alkalmazásba való másoláshoz és beillesztéshez:
Fontos
Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.
Elrendezési modell
Szöveg, kijelölési jelek, szövegstílusok, táblázatstruktúrák és határolórégió koordinátáinak kinyerése dokumentumokból.
Adja hozzá a következő kódmintát a doc_intel_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:
# 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()
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:
Lépjen arra a mappára, ahol a doc_intel_quickstart.py fájl található.
Írja be a következő parancsot a terminálba:
python doc_intel_quickstart.py
Ha egy adott fájlt egy URL-címen szeretne elemezni, használja a begin_analyze_document_from_url
metódust, és adja meg prebuilt-layout
a modellazonosítót. A visszaadott érték egy result
olyan objektum, amely adatokat tartalmaz az elküldött dokumentumról.
Adja hozzá a következő kódmintát a form_recognizer_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:
# 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()
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:
Lépjen arra a mappára, ahol a form_recognizer_quickstart.py fájl található.
Írja be a következő parancsot a terminálba:
python form_recognizer_quickstart.py
Elrendezési modell kimenete
Íme egy kódrészlet a várt kimenetről:
----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
A teljes kimenet megtekintéséhez látogasson el az Azure-minták adattárába a GitHubon az elrendezési modell kimenetének megtekintéséhez.
Adja hozzá a következő kódmintát a form_recognizer_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:
# 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()
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:
Lépjen arra a mappára, ahol a form_recognizer_quickstart.py fájl található.
Írja be a következő parancsot a terminálba:
python form_recognizer_quickstart.py
Előre összeállított modell
Egy előre összeállított modell használatával elemezheti és kinyerheti a gyakori mezőket adott dokumentumtípusokból. Ebben a példában egy számlát elemezünk az előre összeállított számlamodell használatával.
Tipp.
Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. A művelethez analyze
használandó modell az elemezni kívánt dokumentum típusától függ. Lásd: modelladatok kinyerése.
- Számla elemzése az előre összeállított számlamodell használatával. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
- Hozzáadtuk a fájl URL-címét a
invoiceUrl
fájl tetején lévő változóhoz. - Az egyszerűség kedvéért a szolgáltatás által visszaadott kulcs-érték párok nem jelennek meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.
Adja hozzá a következő kódmintát a doc_intel_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Document Intelligence-példány értékeivel:
# 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()
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:
Lépjen arra a mappára, ahol a doc_intel_quickstart.py fájl található.
Írja be a következő parancsot a terminálba:
python doc_intel_quickstart.py
Ha egy adott fájlt egy URI-n szeretne elemezni, használja a begin_analyze_document_from_url
metódust, és adja át prebuilt-invoice
a modellazonosítót. A visszaadott érték egy result
olyan objektum, amely adatokat tartalmaz az elküldött dokumentumról.
Adja hozzá a következő kódmintát a form_recognizer_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:
# 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()
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:
Lépjen arra a mappára, ahol a form_recognizer_quickstart.py fájl található.
Írja be a következő parancsot a terminálba:
python form_recognizer_quickstart.py
Előre összeállított modell kimenete
Íme egy kódrészlet a várt kimenetről:
--------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
A teljes kimenet megtekintéséhez látogasson el a GitHub Azure-mintaadattárába az előre összeállított számlamodell kimenetének megtekintéséhez.
Adja hozzá a következő kódmintát a form_recognizer_quickstart.py alkalmazáshoz. Győződjön meg arról, hogy frissíti a kulcs- és végpontváltozókat az Azure Portal Form Recognizer-példány értékeivel:
# 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()
Az alkalmazás futtatása
Miután hozzáadott egy kódmintát az alkalmazáshoz, hozza létre és futtassa a programot:
Lépjen arra a mappára, ahol a form_recognizer_quickstart.py fájl található.
Írja be a következő parancsot a terminálba:
python form_recognizer_quickstart.py
Ebben a rövid útmutatóban megtudhatja, hogy a Document Intelligence REST API használatával elemezheti és kinyerheti az adatokat és az értékeket a dokumentumokból:
Előfeltételek
Azure-előfizetés – Ingyenes létrehozás
curl parancssori eszköz telepítve.
A PowerShell 7.*+ verziója (vagy egy hasonló parancssori alkalmazás):
A PowerShell-verzió ellenőrzéséhez írja be az alábbi parancsot az operációs rendszerhez képest:
- Windows:
Get-Host | Select-Object Version
- macOS vagy Linux:
$PSVersionTable
- Windows:
Dokumentumintelligencia-(egyszolgáltatásos) vagy Azure AI-szolgáltatások (többszolgáltatásos) erőforrás. Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy egy vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (
F0
) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.
Tipp.
Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.
Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:
Dokumentumok elemzése és eredmények lekérése
A POST-kérések egy előre összeállított vagy egyéni modellel rendelkező dokumentumok elemzésére szolgálnak. A GET kérés egy dokumentumelemzési hívás eredményének lekérésére szolgál. A modelId
POST és resultId
a GET műveletek esetén használatos.
Dokumentum elemzése (POST-kérelem)
A cURL parancs futtatása előtt végezze el a következő módosításokat a post requestben:
Cserélje le
{endpoint}
az Azure Portal Dokumentumintelligencia-példányának végpontértékére.Cserélje le
{key}
az Azure Portal Dokumentumintelligencia-példányának kulcsértékére.Az alábbi táblázatot hivatkozásként használva cserélje le és
{your-document-url}
írja be{modelID}
a kívánt értékeket.Egy URL-címen található dokumentumfájlra van szüksége. Ebben a rövid útmutatóban az alábbi táblázatban szereplő mintaűrlapokat használhatja az egyes funkciókhoz:
Mintadokumentumok
Szolgáltatás | {modelID} | {your-document-url} |
---|---|---|
Olvasás | előre összeállított olvasás | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
Elrendezés | előre összeállított elrendezés | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
Egészségbiztosítási kártya | prebuilt-healthInsuranceCard.us | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png |
W-2-nyomtatványok | prebuilt-tax.us.w2 | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png |
Számla | előre összeállított számla | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Nyugta | előre összeállított nyugta | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Személyazonosító okmányok | előre összeállított-idDocument | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Mintadokumentumok
Szolgáltatás | {modelID} | {your-document-url} |
---|---|---|
Általános dokumentum | előre összeállított dokumentum | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf |
Olvasás | előre összeállított olvasás | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
Elrendezés | előre összeállított elrendezés | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
Egészségbiztosítási kártya | prebuilt-healthInsuranceCard.us | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png |
W-2-nyomtatványok | prebuilt-tax.us.w2 | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png |
Számla | előre összeállított számla | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Nyugta | előre összeállított nyugta | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Személyazonosító okmányok | előre összeállított-idDocument | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Névjegykártya | előre összeállított-businessCard | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg |
Fontos
Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.
POST kérés
curl -v -i POST "{endpoint}/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-07-31-preview" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelID}:analyze?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelId}:analyze?api-version=2022-08-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
POST-válasz (resultID)
Olyan választ kap 202 (Success)
, amely egy írásvédett műveleti hely fejlécet tartalmaz. Ennek az élőfejnek az értéke olyan resultID
lekérdezést tartalmaz, amely lekérdezhető az aszinkron művelet állapotának lekéréséhez és az eredmények lekéréséhez egy GET kéréssel ugyanazzal az erőforrás-előfizetési kulccsal:
Elemzési eredmények lekérése (GET-kérelem)
Az API meghívása Analyze document
után hívja meg az Elemzés eredménye API-t a művelet állapotának és a kinyert adatok lekéréséhez. A parancs futtatása előtt végezze el a következő módosításokat:
Az API meghívása Analyze document
után hívja meg az Elemzés eredménye API-t a művelet állapotának és a kinyert adatok lekéréséhez. A parancs futtatása előtt végezze el a következő módosításokat:
Az API meghívása Analyze document
után hívja meg az Elemzés eredménye API-t a művelet állapotának és a kinyert adatok lekéréséhez. A parancs futtatása előtt végezze el a következő módosításokat:
Cserélje le
{resultID}
az Operation-Location fejlécet a POST válaszból.Cserélje le
{key}
a Dokumentumintelligencia-példány kulcsértékére az Azure Portalon.
GET kérés
curl -v -X GET "{endpoint}/documentintelligence/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2024-07-31-preview" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2023-07-31" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2022-08-31" -H "Ocp-Apim-Subscription-Key: {key}"
A válasz vizsgálata
JSON-kimenettel rendelkező választ kap 200 (Success)
. Az első mező "status"
a művelet állapotát jelzi. Ha a művelet nem fejeződött be, a művelet értéke "status"
vagy "running"
"notStarted"
, és újra meg kell hívnia az API-t manuálisan vagy egy szkripten keresztül. Javasoljuk, hogy a hívások között legalább egy másodperces időközt válasszon.
Mintaválasz előre összeállított számlához
{
"status": "succeeded",
"createdDateTime": "2024-03-25T19:31:37Z",
"lastUpdatedDateTime": "2024-03-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2024-07-31-preview",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
{
"status": "succeeded",
"createdDateTime": "2023-08-25T19:31:37Z",
"lastUpdatedDateTime": "2023-08-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2023-07-31",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
{
"status": "succeeded",
"createdDateTime": "2022-09-25T19:31:37Z",
"lastUpdatedDateTime": "2022-09-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2022-08-31",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
Támogatott dokumentummezők
Az előre összeállított modellek előre definiált dokumentummezőket nyernek ki. A kinyert mezőnevekről, típusokról, leírásokról és példákról lásd a modell adatkinyerés című témakört.
Ennyi, gratulálok!
Ebben a rövid útmutatóban egy dokumentumintelligencia-modellt használt a különböző űrlapok és dokumentumok elemzéséhez. Ezután ismerkedjen meg a Document Intelligence Studióval, és referenciadokumentációt a Document Intelligence API részletes megismeréséhez.
Következő lépések
A továbbfejlesztett felhasználói élmény és a fejlett modellminőség érdekében próbálja ki a Document Intelligence Studiót
A 3.1-ről a 4.0-s verzióra történő migrálásról a Changelog Migration útmutatóiban olvashat.
Ez a tartalom a következőre vonatkozik: v2.1 | Legújabb verzió: 4.0-s verzió (előzetes verzió)
Az Azure AI Document Intelligence használatának első lépései a választott programozási nyelv vagy a REST API használatával. A Dokumentumintelligencia egy felhőalapú Azure AI-szolgáltatás, amely gépi tanulással kinyeri a kulcs-érték párokat, a szöveget és a táblázatokat a dokumentumokból. Javasoljuk, hogy a technológia elsajátításakor használja az ingyenes szolgáltatást. Ne feledje, hogy az ingyenes oldalak száma havonta legfeljebb 500 lehet.
A Dokumentumintelligencia funkcióiról és a fejlesztési lehetőségekről az Áttekintés oldalon olvashat bővebben.
Referenciadokumentáció Kódtár forráskódcsomagja | (NuGet) | -minták |
Ebben a rövid útmutatóban a következő API-k segítségével nyerhet ki strukturált adatokat űrlapokból és dokumentumokból:
Előfeltételek
Azure-előfizetés – Hozzon létre egyet ingyenesen.
A Visual Studio IDE aktuális verziója.
Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Miután megkapta az Azure-előfizetését, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (
F0
) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.Tipp.
Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.
Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:
Beállítás
Indítsa el a Visual Studio 2019-et.
A kezdőlapon válassza az Új projekt létrehozása lehetőséget.
Az Új projekt létrehozása lapon adja meg a konzolt a keresőmezőbe. Válassza ki a konzolalkalmazás-sablont, majd válassza a Tovább gombot.
Az új projekt konfigurálása párbeszédpanelen írja be
formRecognizer_quickstart
a Projekt neve mezőbe. Ezután válassza a Tovább gombot.A További információ párbeszédpanelen válassza a .NET 5.0 (Aktuális), majd a Létrehozás lehetőséget.
Az ügyfélkódtár telepítése a NuGettel
Kattintson a jobb gombbal a formRecognizer_quickstart projektre, és válassza a NuGet-csomagok kezelése... lehetőséget.
Válassza a Tallózás lapot, és írja be az Azure.AI.FormRecognizer parancsot.
Válassza ki a 3.1.1-es verziót a legördülő menüből, és válassza a Telepítés lehetőséget.
Az alkalmazás összeállítása
A Dokumentumintelligencia szolgáltatás használatához létre kell hoznia az osztály egy példányát FormRecognizerClient
. Ehhez létre kell hoznia egy AzureKeyCredential
kulcsot és egy példányt FormRecognizerClient
a dokumentumintelligencia és a AzureKeyCredential
dokumentumintelligencia endpoint
használatával.
Feljegyzés
- A .NET 6-tól kezdve a
console
sablont használó új projektek új programstílust hoznak létre, amely eltér a korábbi verzióktól. - Az új kimenet a legutóbbi C#-funkciókat használja, amelyek leegyszerűsítik az írandó kódot.
- Az újabb verzió használatakor csak a metódus törzsét
Main
kell megírnia. Nem kell felső szintű utasításokat, globális irányelveket vagy implicit irányelveket használnia. - További információ: Új C#-sablonok legfelső szintű utasítások létrehozása.
Nyissa meg a Program.cs fájlt.
Adja meg az alábbi irányelveket:
using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
- Állítsa be a környezeti és a
endpoint
környezeti változókat, és hozza létre a saját ésFormRecognizerClient
a példányátAzureKeyCredential
:key
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);
Törölje a sort,
Console.Writeline("Hello World!");
és adja hozzá a Try It kódmintákat Program.cs fájlhoz:Válasszon ki egy kódmintát az alkalmazás fő metódusába való másoláshoz és beillesztéshez:
Fontos
Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információkért tekintse meg az Azure AI-szolgáltatások biztonsági cikkét.
Próbálja ki: Elrendezési modell
Szöveg, kijelölési jelek, szövegstílusok és táblázatstruktúrák kinyerése a dokumentumokból a határolórégió koordinátáival együtt.
Adja hozzá a következő kódot az elrendezési alkalmazáshoz Program.cs fájlhoz:
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}'.");
}
}
}
}
}
}
Próbálja ki: Előre összeállított modell
Ez a minta bemutatja, hogyan elemezhet adatokat bizonyos típusú gyakori dokumentumokból előre betanított modellekkel, például számla használatával.
- Ebben a példában egy előre összeállított modellel elemezünk egy számladokumentumot. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
- Hozzáadtuk a fájl URI-értékét a
invoiceUri
Fő metódus tetején található változóhoz. - Ha egy adott fájlt egy URI-n szeretne elemezni, használja a metódust
StartRecognizeInvoicesFromUriAsync
. - Az egyszerűség kedvéért a szolgáltatás által visszaadott összes mező nem jelenik meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.
Előre összeállított modell kiválasztása
Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. Az elemzési művelethez használandó modell az elemezni kívánt dokumentum típusától függ. A Document Intelligence szolgáltatás jelenleg az alábbi előre összeállított modelleket támogatja:
- Számla: a számlákból kinyeri a szöveget, a kijelölési jeleket, a táblákat, a mezőket és a kulcsadatokat.
- Nyugta: szöveges és kulcsinformációkat nyer ki a nyugtákból.
- Személyazonosító okmány: a vezetői engedélyekből és a nemzetközi útlevelekből kinyeri a szöveget és a kulcsadatokat.
- Névjegykártya: kinyeri a névjegykártyák szövegét és kulcsadatait.
Adja hozzá az alábbi kódot az előre összeállított számlaalkalmazáshoz Program.cs fájlmetódushoz
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}");
}
}
}
}
}
Az alkalmazás futtatása
A program létrehozásához és futtatásához válassza a zöld Start gombot a formRecognizer_quickstart mellett, vagy nyomja le az F5 billentyűt.
Referenciadokumentáció Kódtár forráskódcsomagja | (Maven)Minták | |
Ebben a rövid útmutatóban a következő API-k segítségével nyerhet ki strukturált adatokat űrlapokból és dokumentumokból:
Előfeltételek
Azure-előfizetés – Hozzon létre egyet ingyenesen.
A Java Development Kit (JDK) 8-es vagy újabb verziója. További információ: támogatott Java-verziók és frissítési ütemezés.
Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Miután megkapta az Azure-előfizetését, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (
F0
) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:
Beállítás
Új Gradle-projekt létrehozása
Egy konzolablakban (például parancsmag, PowerShell vagy Bash) hozzon létre egy új könyvtárat az alkalmazáshoz, az úgynevezett form-recognizer-apphoz, és navigáljon hozzá.
mkdir form-recognizer-app && form-recognizer-app
Futtassa a
gradle init
parancsot a munkakönyvtárból. Ez a parancs alapvető buildfájlokat hoz létre a Gradle számára, beleértve a build.gradle.kts fájlt is, amelyet futásidőben használnak az alkalmazás létrehozásához és konfigurálásához.gradle init --type basic
Amikor a rendszer kéri, hogy válasszon egy DSL-t, válassza a Kotlin lehetőséget.
Fogadja el az alapértelmezett projektnevet (form-recognizer-app)
Telepítse az ügyfélkódtárat
Ez a rövid útmutató a Gradle függőségkezelőt használja. A Maven Central-adattárban megtalálhatja a többi függőségkezelő ügyfélkódtárát és információit.
A projekt build.gradle.kts fájljában adja meg az ügyfélkódtárat utasításkéntimplementation
, valamint a szükséges beépülő modulokat és beállításokat.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}
Java-fájl létrehozása
Futtassa a következő parancsot a munkakönyvtárban:
mkdir -p src/main/java
A következő könyvtárstruktúrát hozza létre:
Lépjen a Java könyvtárba, és hozzon létre egy FormRecognizer.java nevű fájlt. Nyissa meg az előnyben részesített szerkesztőben vagy IDE-ben, és adja hozzá a következő csomagdeklarációt és import
-utasításokat:
import com.azure.ai.formrecognizer.*;
import com.azure.ai.formrecognizer.models.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.Context;
import com.azure.core.util.polling.SyncPoller;
Válasszon ki egy kódmintát az alkalmazás fő módszerének másolásához és beillesztéséhez:
Fontos
Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.
Próbálja ki: Elrendezési modell
Szöveg, kijelölési jelek, szövegstílusok és táblázatstruktúrák kinyerése a dokumentumokból a határolórégió koordinátáival együtt.
Frissítse az alkalmazás FormRecognizer osztályát a következő kóddal (ügyeljen arra, hogy az Azure Portal Document Intelligence-példány értékeivel frissítse a kulcs- és végpontváltozókat):
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();
});
});
}
Próbálja ki: Előre összeállított modell
Ez a minta bemutatja, hogyan elemezhet adatokat bizonyos típusú gyakori dokumentumokból előre betanított modellekkel, például számla használatával.
- Ebben a példában egy előre összeállított modellel elemezünk egy számladokumentumot. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
- Ha egy adott fájlt egy URI-n szeretne elemezni, a
beginRecognizeInvoicesFromUrl
. - Hozzáadtuk a fájl URI-értékét a
invoiceUrl
fő metódus változóhoz. - Az egyszerűség kedvéért a szolgáltatás által visszaadott összes mező nem jelenik meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.
Előre összeállított modell kiválasztása
Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. Az elemzési művelethez használandó modell az elemezni kívánt dokumentum típusától függ. A Document Intelligence szolgáltatás jelenleg az alábbi előre összeállított modelleket támogatja:
- Számla: a számlákból kinyeri a szöveget, a kijelölési jeleket, a táblákat, a mezőket és a kulcsadatokat.
- Nyugta: szöveges és kulcsinformációkat nyer ki a nyugtákból.
- Személyazonosító okmány: a vezetői engedélyekből és a nemzetközi útlevelekből kinyeri a szöveget és a kulcsadatokat.
- Névjegykártya: kinyeri a névjegykártyák szövegét és kulcsadatait.
Frissítse az alkalmazás FormRecognizer osztályát a következő kóddal (ügyeljen arra, hogy az Azure Portal Document Intelligence-példány értékeivel frissítse a kulcs- és végpontváltozókat):
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());
}
}
}
}
Az alkalmazás létrehozása és futtatása
Lépjen vissza a fő projektkönyvtárhoz – a form-recognizer-apphoz.
- Az alkalmazás létrehozása a
build
következő paranccsal:
gradle build
- Futtassa az alkalmazást a
run
következő paranccsal:
gradle run
Referenciadokumentáció Kódtár forráskódcsomagja | (npm)Minták | |
Ebben a rövid útmutatóban a következő API-k segítségével nyerhet ki strukturált adatokat űrlapokból és dokumentumokból:
Előfeltételek
Azure-előfizetés – Hozzon létre egyet ingyenesen.
A Visual Studio Code legújabb verziója vagy az ön által előnyben részesített IDE.
Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Miután megkapta az Azure-előfizetését, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (
F0
) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.Tipp.
Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.
Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:
Beállítás
Hozzon létre egy új Node.js alkalmazást. Egy konzolablakban (pl. cmd, PowerShell vagy Bash) hozzon létre egy új mappát az alkalmazásnak, majd navigáljon oda.
mkdir form-recognizer-app && cd form-recognizer-app
Futtassa az
npm init
parancsot egy Node-alkalmazáspackage.json
fájllal való létrehozásához.npm init
Telepítse az ügyféloldali
ai-form-recognizer
kódtár npm-csomagjait:npm install @azure/ai-form-recognizer
Az alkalmazás fájlja
package.json
frissül a függőségekkel.Hozzon létre egy fájlt,
index.js
nyissa meg, és importálja a következő kódtárakat:const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
Változók létrehozása az erőforrás Azure-végpontjához és kulcsához:
const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE"; const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
Ezen a ponton a JavaScript-alkalmazásnak a következő kódsorokat kell tartalmaznia:
const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer"); const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"; const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
Válasszon ki egy kódmintát az alkalmazásba való másoláshoz és beillesztéshez:
Fontos
Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.
Próbálja ki: Elrendezési modell
Adja hozzá a következő kódot az elrendezési alkalmazáshoz a változó alatti key
sorban
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);
});
Próbálja ki: Előre összeállított modell
Ez a minta bemutatja, hogyan elemezhet adatokat bizonyos típusú gyakori dokumentumokból előre betanított modellekkel, például számla használatával. A számlamezők teljes listájának megtekintéséhez tekintse meg előre összeállított koncepcióoldalunkat
- Ebben a példában egy előre összeállított modellel elemezünk egy számladokumentumot. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
- Hozzáadtuk a fájl URI-értékét a
invoiceUrl
fájl tetején lévő változóhoz. - Ha egy adott fájlt egy URI-n szeretne elemezni, a metódust
beginRecognizeInvoices
fogja használni. - Az egyszerűség kedvéért a szolgáltatás által visszaadott összes mező nem jelenik meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.
Előre összeállított modell kiválasztása
Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. Az elemzési művelethez használandó modell az elemezni kívánt dokumentum típusától függ. A Document Intelligence szolgáltatás jelenleg az alábbi előre összeállított modelleket támogatja:
- Számla: a számlákból kinyeri a szöveget, a kijelölési jeleket, a táblákat, a mezőket és a kulcsadatokat.
- Nyugta: szöveges és kulcsinformációkat nyer ki a nyugtákból.
- Személyazonosító okmány: a vezetői engedélyekből és a nemzetközi útlevelekből kinyeri a szöveget és a kulcsadatokat.
- Névjegykártya: kinyeri a névjegykártyák szövegét és kulcsadatait.
Adja hozzá az alábbi kódot az előre összeállított számlaalkalmazáshoz a key
változó alatt
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);
});
Referenciadokumentáció Kódtár forráskódcsomagja | (PyPi) | -minták |
Ebben a rövid útmutatóban a következő API-k segítségével nyerhet ki strukturált adatokat űrlapokból és dokumentumokból:
Előfeltételek
Azure-előfizetés – Ingyenes létrehozás
Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Miután megkapta az Azure-előfizetését, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (
F0
) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.Tipp.
Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.
Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:
Beállítás
Nyisson meg egy terminálablakot a helyi környezetben, és telepítse a Pythonhoz készült Azure AI Document Intelligence ügyféloldali kódtárat pip használatával:
pip install azure-ai-formrecognizer
Új Python-alkalmazás létrehozása
Hozzon létre egy form_recognizer_quickstart.py nevű új Python-alkalmazást az előnyben részesített szerkesztőben vagy IDE-ben. Ezután importálja a következő kódtárakat:
import os
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential
Változók létrehozása az Azure-erőforrásvégponthoz és -kulcshoz
endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"
Ezen a ponton a Python-alkalmazásnak a következő kódsorokat kell tartalmaznia:
import os
from azure.core.exceptions import ResourceNotFoundError
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"
Válasszon ki egy kódmintát az alkalmazásba való másoláshoz és beillesztéshez:
Fontos
Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.
Próbálja ki: Elrendezési modell
Adja hozzá a következő kódot az elrendezési alkalmazáshoz a változó alatti key
sorban
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()
Próbálja ki: Előre összeállított modell
Ez a minta bemutatja, hogyan elemezhet adatokat bizonyos típusú gyakori dokumentumokból előre betanított modellekkel, például számla használatával. A számlamezők teljes listájának megtekintéséhez tekintse meg előre összeállított koncepcióoldalunkat
- Ebben a példában egy előre összeállított modellel elemezünk egy számladokumentumot. Ehhez a rövid útmutatóhoz használhatja a számlaminta-dokumentumunkat.
- Hozzáadtuk a fájl URI-értékét a fájl tetején található "formUrl" változóhoz.
- Ha egy adott fájlt egy URI-n szeretne elemezni, használja a "begin_recognize_invoices_from_url" metódust.
- Az egyszerűség kedvéért a szolgáltatás által visszaadott összes mező nem jelenik meg itt. A támogatott mezők és a kapcsolódó típusok listáját a Számla koncepció oldalán tekintheti meg.
Előre összeállított modell kiválasztása
Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. Az elemzési művelethez használandó modell az elemezni kívánt dokumentum típusától függ. A Document Intelligence szolgáltatás jelenleg az alábbi előre összeállított modelleket támogatja:
- Számla: a számlákból kinyeri a szöveget, a kijelölési jeleket, a táblákat, a mezőket és a kulcsadatokat.
- Nyugta: szöveges és kulcsinformációkat nyer ki a nyugtákból.
- Személyazonosító okmány: a vezetői engedélyekből és a nemzetközi útlevelekből kinyeri a szöveget és a kulcsadatokat.
- Névjegykártya: kinyeri a névjegykártyák szövegét és kulcsadatait.
Adja hozzá az alábbi kódot az előre összeállított számlaalkalmazáshoz a key
változó alatt
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()
Az alkalmazás futtatása
Lépjen arra a mappára, ahol a form_recognizer_quickstart.py fájl található.
Írja be a következő parancsot a terminálba:
python form_recognizer_quickstart.py
| Document Intelligence REST API | Azure REST API-referencia |
Ebben a rövid útmutatóban a következő API-k segítségével nyerhet ki strukturált adatokat űrlapokból és dokumentumokból:
Előfeltételek
Azure-előfizetés – Ingyenes létrehozás
a cURL telepítve van.
PowerShell 6.0-s vagy hasonló parancssori alkalmazás.
Azure AI-szolgáltatások vagy Dokumentumintelligencia-erőforrás. Miután megkapta az Azure-előfizetését, hozzon létre egy egyszolgáltatásos vagy többszolgáltatásos dokumentumintelligencia-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az ingyenes tarifacsomag (
F0
) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.Tipp.
Azure AI-szolgáltatási erőforrás létrehozása, ha több Azure AI-szolgáltatást szeretne elérni egyetlen végpont/kulcs alatt. Csak dokumentumintelligencia-hozzáféréshez hozzon létre egy dokumentumintelligencia-erőforrást. Vegye figyelembe, hogy a Microsoft Entra-hitelesítés használatához egy egyszolgáltatásos erőforrásra lesz szüksége.
Az erőforrás üzembe helyezése után válassza az Ugrás az erőforrásra lehetőséget. Az alkalmazás a Document Intelligence API-hoz való csatlakoztatásához szüksége van a létrehozott erőforrás kulcsára és végpontjára. A rövid útmutató későbbi részében beillesztheti a kulcsot és a végpontot a kódba:
Válasszon ki egy kódmintát az alkalmazásba való másoláshoz és beillesztéshez:
Fontos
Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. További információ: Azure AI-szolgáltatások biztonsága.
Próbálja ki: Elrendezési modell
- Cserélje le
{endpoint}
a dokumentumintelligencia-előfizetéssel beszerzett végpontra. - Cserélje le
{key}
az előző lépésből kimásolt kulccsal. - Cserélje le
\"{your-document-url}
egy mintadokumentum URL-címére:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Kérés
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}'}"
Művelet helye
Egy műveleti hely fejlécet tartalmazó választ kap202 (Success)
. A fejléc értéke tartalmaz egy eredményazonosítót, amellyel lekérdezheti az aszinkron művelet állapotát, és lekérheti az eredményeket:
https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.
Az alábbi példában az URL-cím részeként a következő analyzeResults/
sztring az eredményazonosító.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Elrendezési eredmények lekérése
Miután meghívta az Elemzési elrendezés API-t, meghívja az Elemzési elrendezés eredménye API-t a művelet állapotának és a kinyert adatok lekéréséhez. A parancs futtatása előtt végezze el a következő módosításokat:
- Cserélje le
{endpoint}
a dokumentumintelligencia-előfizetéssel beszerzett végpontra. - Cserélje le
{key}
az előző lépésből kimásolt kulccsal. - Cserélje le
{resultId}
az előző lépés eredményazonosítóját.
Kérés
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Az eredmények vizsgálata
JSON-tartalommal rendelkező választ kap 200 (success)
.
Tekintse meg a következő számlarendszerképet és annak megfelelő JSON-kimenetét.
- A
"readResults"
csomópont minden olyan szövegsort tartalmaz, amelynek a megfelelő határolókerete az oldalon van elhelyezve. - A
selectionMarks
csomópont minden kijelölési jelet (jelölőnégyzetet, választójelet) és annak állapotátselected
unselected
vagy állapotát jeleníti meg. - A
"pageResults"
szakasz tartalmazza a kinyert táblákat. Minden táblázathoz ki lesz nyerve a szöveg, a sor és az oszlopindex, a sor- és oszlopfedés, a határolókeret és egyebek.
Választörzs
A teljes mintakimenet megtekinthető a GitHubon.
Próbálja ki: Előre összeállított modell
Előre összeállított modell kiválasztása
Nem korlátozódik a számlákra – számos előre összeállított modell közül választhat, amelyek mindegyike saját támogatott mezőkkel rendelkezik. Az elemzési művelethez használandó modell az elemezni kívánt dokumentum típusától függ. A Document Intelligence szolgáltatás jelenleg az alábbi előre összeállított modelleket támogatja:
- Számla: a számlákból kinyeri a szöveget, a kijelölési jeleket, a táblákat, a mezőket és a kulcsadatokat.
- Nyugta: szöveges és kulcsinformációkat nyer ki a nyugtákból.
- Személyazonosító okmány: a vezetői engedélyekből és a nemzetközi útlevelekből kinyeri a szöveget és a kulcsadatokat.
- Névjegykártya: kinyeri a névjegykártyák szövegét és kulcsadatait.
A parancs futtatása előtt végezze el a következő módosításokat:
Cserélje le
{endpoint}
a dokumentumintelligencia-előfizetéssel beszerzett végpontra.Cserélje le
{key}
az előző lépésből kimásolt kulccsal.Cserélje le
\"{your-document-url}
egy minta számla URL-címére:https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf
Kérés
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}'}"
Művelet helye
Egy műveleti hely fejlécet tartalmazó választ kap202 (Success)
. A fejléc értéke tartalmaz egy eredményazonosítót, amellyel lekérdezheti az aszinkron művelet állapotát, és lekérheti az eredményeket:
https:// cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}
Az alábbi példában az URL-cím részeként a következő analyzeResults/
sztring az eredményazonosító:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Számlaeredmények lekérése
Miután meghívta az Analyze Invoice API-t, meghívja a Számlaeredmény elemzése API-t a művelet állapotának és a kinyert adatok lekéréséhez. A parancs futtatása előtt végezze el a következő módosításokat:
- Cserélje le
{endpoint}
a dokumentumintelligencia-kulccsal beszerzett végpontra. A dokumentumintelligencia-erőforrás Áttekintés lapján található. - Cserélje le
{resultId}
az előző lépés eredményazonosítóját. - Írja felül a
{key}
változót a saját kulcsával.
Kérés
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
A válasz vizsgálata
JSON-kimenettel rendelkező választ kap 200 (Success)
.
- A
"readResults"
mező a számlából kinyert összes szövegsort tartalmazza. - Tartalmazza
"pageResults"
a számlából kinyert táblákat és kijelölési jeleket. - A
"documentResults"
mező a számla legrelevánsabb részeinek kulcs-érték adatait tartalmazza.
Választörzs
Tekintse meg a teljes mintakimenetet a GitHubon.
Ennyi, jól sikerült!
Következő lépések
A továbbfejlesztett felhasználói élmény és a fejlett modellminőség érdekében próbálja ki a Document Intelligence Studiót.
A Studio támogatja a v2.1 címkével ellátott adatokkal betanított modelleket.
A változásnaplók részletes információkat nyújtanak a 3.1-ről a 4.0-s verzióra való migrálásról.