Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penting
- Azure Cognitive Services Form Recognizer sekarang menjadi Azure Inteligensi Dokumen di Foundry Tools.
- Beberapa platform masih menunggu pembaruan penggantian nama.
- Semua penyebutan Form Recognizer atau Kecerdasan Dokumen dalam dokumentasi kami mengacu pada layanan Azure yang sama.
Konten ini berlaku untuk:
v4.0 (GA)Versi sebelumnya:
v3.1 (GA)
v3.0 (GA)
- Mulai menggunakan Azure Document Intelligence versi stabil terbaru v4.0
2024-11-30(GA).
Konten ini berlaku untuk:
v3.1 (GA)Versi sebelumnya:
v3.0
v2.1
- Mulai menggunakan versi GA terbaru Azure Form Recognizer (
2023-07-31).
Konten ini berlaku untuk:
v3.0 (GA)Versi yang lebih baru:
v3.1
v2.1
- Mulai menggunakan versi GA warisan Azure Form Recognizer (
2022-08-31).
Azure Document Intelligence / Form Recognizer adalah layanan Foundry Tools berbasis cloud yang menggunakan pembelajaran mesin untuk mengekstrak pasangan kunci-nilai, teks, tabel, dan data kunci dari dokumen Anda.
Anda dapat dengan mudah mengintegrasikan model pemrosesan dokumen ke dalam alur kerja dan aplikasi Anda dengan menggunakan SDK bahasa pemrograman atau memanggil REST API.
Kami menyarankan agar Anda menggunakan layanan gratis saat mempelajari cara kerja teknologi ini untuk panduan cepat. Ingatlah bahwa jumlah halaman gratis dibatasi hingga 500 per bulan.
Untuk mempelajari selengkapnya tentang fitur API dan opsi pengembangan, kunjungi halaman Gambaran Umum kami.
Client pustaka
Dalam mulai cepat ini, gunakan fitur berikut untuk menganalisis dan mengekstrak data dan nilai dari formulir dan dokumen:
Model tata letak—Menganalisis dan mengekstrak tabel, garis, kata, dan tanda pilihan seperti tombol radio dan kotak centang dalam dokumen, tanpa perlu melatih model.
Model bawaan—Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model bawaan.
Prasyarat
langganan Azure - Buat langganan secara gratis.
Versi saat ini Visual Studio IDE.
Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya single-service atau multi-layanan Azure di portal Azure, untuk mendapatkan kunci dan titik akhir Anda.
Anda dapat menggunakan tingkat harga gratis (
F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.
Tips
Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.
Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat single-service atau Azure sumber daya multi-layanan, di portal Azure, untuk mendapatkan kunci dan titik akhir Anda.
Anda dapat menggunakan tingkat harga gratis (
F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.
Tips
Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Untuk akses Form Recognizer saja, buat sumber daya Form Recognizer. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Form Recognizer. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.
Mengatur
Mulai Visual Studio.
Pada halaman mulai, pilih Buat proyek baru.
Pada halaman Buat proyek baru, masukkan konsol di kotak pencarian. Pilih templat Aplikasi Konsol , lalu pilih Berikutnya.
- Di jendela dialog Konfigurasi project baru Anda, masukkan
doc_intel_quickstartdi kotak nama Project. Lalu pilih Berikutnya.
- Di jendela dialog Konfigurasi project baru Anda, masukkan
form_recognizer_quickstartdi kotak nama Project. Lalu pilih Berikutnya.
Di jendela dialog Informasi tambahan, pilih .NET 8.0 (Dukungan jangka panjang), lalu pilih Buat.
Menginstal pustaka klien dengan NuGet
Klik kanan proyek doc_intel_quickstart Anda dan pilih Kelola Paket NuGet... .
Pilih tab Browse dan ketik Azure. AI. DocumentIntelligence.
Pilih kotak
Include prereleasecentang.
Pilih versi dari menu dropdown dan instal paket di proyek Anda.
Klik kanan pada proyek form_recognizer_quickstart Anda dan pilih Kelola Paket NuGet... .
Pilih tab Telusuri dan ketik Azure. AI. FormRecognizer. Pilih versi 4.1.0 dari menu dropdown
Klik kanan pada proyek form_recognizer_quickstart Anda dan pilih Kelola Paket NuGet... .
Pilih tab Telusuri dan ketik Azure. AI. FormRecognizer. Pilih versi 4.0.0 dari menu dropdown
Membangun aplikasi Anda
Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentIntelligenceClient kelas. Untuk melakukannya, Anda membuat AzureKeyCredential dengan key dari portal Azure dan instans DocumentIntelligenceClient dengan AzureKeyCredential dan Inteligensi Dokumen milik Anda endpoint.
Untuk berinteraksi dengan layanan Form Recognizer, Anda perlu membuat instans kelas DocumentAnalysisClient. Untuk melakukannya, Anda membuat sebuah AzureKeyCredential dengan key dari portal Azure dan sebuah instans DocumentAnalysisClient dengan AzureKeyCredential serta Form Recognizer endpoint Anda.
Catatan
- Dimulai dengan .NET 6, proyek baru yang menggunakan templat
consolemenghasilkan gaya program baru yang berbeda dari versi sebelumnya. - Output baru menggunakan fitur C# terbaru yang menyederhanakan kode yang perlu Anda tulis.
- Ketika Anda menggunakan versi yang lebih baru, Anda hanya perlu menulis isi
Mainmetode . Anda tidak perlu menyertakan pernyataan tingkat teratas, direktif menggunakan global, atau direktif menggunakan implisit. - Untuk informasi selengkapnya, lihatTemplat C# baru menghasilkan pernyataan tingkat atas.
Buka file Program.cs .
Hapus kode yang ada, termasuk baris
Console.Writeline("Halo Dunia!"), dan pilih salah satu sampel kode berikut untuk disalin dan ditempelkan ke file Program.cs aplikasi Anda:
Penting
Sebaiknya autentikasi Microsoft Entra ID dengan identitas terkelola untuk sumber daya Azure untuk menghindari penyimpanan kredensial pada aplikasi Anda yang berjalan di cloud.
Gunakan kunci API dengan hati-hati. Jangan sertakan kunci API langsung dalam kode Anda, dan jangan pernah mempostingnya secara publik. Jika menggunakan kunci API, simpan dengan aman di Azure Key Vault, putar kunci secara teratur, dan batasi akses ke Azure Key Vault menggunakan kontrol akses berbasis peran dan pembatasan akses jaringan. Untuk informasi selengkapnya tentang menggunakan kunci API dengan aman di aplikasi Anda, lihat kunci API dengan Azure Key Vault.
Untuk informasi selengkapnya tentang keamanan layanan AI, lihat cara mengotentikasi permintaan ke layanan Azure AI.
Model tata letak
Ekstrak teks, tanda pilihan, gaya teks, struktur tabel, dan koordinat wilayah pembatas dari dokumen.
- Untuk contoh ini, Anda memerlukan file dokumen dari URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
- Kami telah menambahkan nilai URI file ke
Uri fileUrivariabel di bagian atas skrip. - Untuk mengekstrak tata letak dari file tertentu di URI, gunakan metode
AnalyzeDocumentAsyncdan operkanprebuilt-layoutsebagai ID model. Nilai yang dikembalikan adalah objek yangAnalyzeResultberisi data dari dokumen yang dikirimkan.
Tambahkan sampel kode berikut ke file Program.cs. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:
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}");
}
}
Jalankan aplikasi Anda
Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.
Tambahkan sampel kode berikut ke file Program.cs. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari Azure Portal Anda (instans Form Recognizer):
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding box is:");
Console.WriteLine($" Upper left => X: {line.Polygon[0].X}, Y= {line.Polygon[0].Y}");
Console.WriteLine($" Upper right => X: {line.Polygon[1].X}, Y= {line.Polygon[1].Y}");
Console.WriteLine($" Lower right => X: {line.Polygon[2].X}, Y= {line.Polygon[2].Y}");
Console.WriteLine($" Lower left => X: {line.Polygon[3].X}, Y= {line.Polygon[3].Y}");
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding box is:");
Console.WriteLine($" Upper left => X: {selectionMark.Polygon[0].X}, Y= {selectionMark.Polygon[0].Y}");
Console.WriteLine($" Upper right => X: {selectionMark.Polygon[1].X}, Y= {selectionMark.Polygon[1].Y}");
Console.WriteLine($" Lower right => X: {selectionMark.Polygon[2].X}, Y= {selectionMark.Polygon[2].Y}");
Console.WriteLine($" Lower left => X: {selectionMark.Polygon[3].X}, Y= {selectionMark.Polygon[3].Y}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Jalankan aplikasi Anda
Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.
Output model tata letak
Berikut adalah cuplikan output yang diharapkan:
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
Untuk melihat seluruh output, kunjungi repositori sampel Azure pada GitHub untuk melihat output model layout.
Tambahkan sampel kode berikut ke file Program.cs. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < line.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
}
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < selectionMark.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
}
}
}
Console.WriteLine("Paragraphs:");
foreach (DocumentParagraph paragraph in result.Paragraphs)
{
Console.WriteLine($" Paragraph content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Extract the layout of a document from a file stream
To extract the layout from a given file at a file stream, use the AnalyzeDocument method and pass prebuilt-layout as the model ID. The returned value is an AnalyzeResult object containing data about the submitted document.
string filePath = "<filePath>";
using var stream = new FileStream(filePath, FileMode.Open);
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", stream);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < line.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
}
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < selectionMark.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
}
}
}
Console.WriteLine("Paragraphs:");
foreach (DocumentParagraph paragraph in result.Paragraphs)
{
Console.WriteLine($" Paragraph content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Jalankan aplikasi Anda
Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.
Model bawaan
Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model bawaan. Dalam contoh ini, kami menganalisis faktur menggunakan model faktur bawaan.
Tips
Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat pengambilan data model.
- Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
- Kami telah menambahkan nilai URI file ke
Uri invoiceUrivariabel di bagian atas file Program.cs. - Untuk menganalisis file pada URI, gunakan
AnalyzeDocumentAsyncdan berikanprebuilt-invoicesebagai ID model. Nilai yang dikembalikan adalah objek yangAnalyzeResultberisi data dari dokumen yang dikirimkan. - Untuk kesederhanaan, pasangan kunci-nilai yang dikembalikan oleh layanan tidak semuanya ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.
Tambahkan sampel kode berikut ke file Program.cs Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:
using Azure;
using Azure.AI.DocumentIntelligence;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
//sample invoice document
Uri invoiceUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");
AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
UrlSource = invoiceUri
};
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", content);
AnalyzeResult result = operation.Value;
for (int i = 0; i < result.Documents.Count; i++)
{
Console.WriteLine($"Document {i}:");
AnalyzedDocument document = result.Documents[i];
if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField)
&& vendorNameField.FieldType == DocumentFieldType.String)
{
string vendorName = vendorNameField.ValueString;
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField)
&& customerNameField.FieldType == DocumentFieldType.String)
{
string customerName = customerNameField.ValueString;
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
&& itemsField.FieldType == DocumentFieldType.List)
{
foreach (DocumentField itemField in itemsField.ValueList)
{
Console.WriteLine("Item:");
if (itemField.FieldType == DocumentFieldType.Dictionary)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueDictionary;
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField)
&& itemDescriptionField.FieldType == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.ValueString;
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField)
&& itemAmountField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue itemAmount = itemAmountField.ValueCurrency;
Console.WriteLine($" Amount: '{itemAmount.CurrencySymbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
}
}
}
}
if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField)
&& subTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue subTotal = subTotalField.ValueCurrency;
Console.WriteLine($"Sub Total: '{subTotal.CurrencySymbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
}
if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField)
&& totalTaxField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue totalTax = totalTaxField.ValueCurrency;
Console.WriteLine($"Total Tax: '{totalTax.CurrencySymbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
}
if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField)
&& invoiceTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
Console.WriteLine($"Invoice Total: '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
}
}
Jalankan aplikasi Anda
Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.
Tambahkan sampel kode berikut ke file Program.cs Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.
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}");
}
}
}
Jalankan aplikasi Anda
Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.
Output model bawaan
Berikut adalah cuplikan output yang diharapkan:
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
Untuk melihat seluruh output, kunjungi repositori sampel Azure di GitHub untuk melihat output model faktur prabangun.
Tambahkan sampel kode berikut ke file Program.cs Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.
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}");
}
}
}
Jalankan aplikasi Anda
Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.
Dalam mulai cepat ini, gunakan fitur berikut untuk menganalisis dan mengekstrak data dan nilai dari formulir dan dokumen:
Tata Letak—Menganalisis dan mengekstrak tabel, garis, kata, dan tanda pilihan seperti tombol radio dan kotak centang dalam dokumen, tanpa perlu melatih model.
Faktur Prabangun—Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model yang sudah dilatih sebelumnya.
Prasyarat
langganan Azure - Buat langganan secara gratis.
Versi terbaru Visual Studio Code atau IDE pilihan Anda. LihatJava di Visual Studio Code.
Tips
- Visual Studio Code menawarkan paket Coding untuk Java untuk Windows dan macOS.Paket pengodean adalah bundel Vs Code, Java Development Kit (JDK), dan kumpulan ekstensi yang disarankan oleh Microsoft. Coding Pack juga dapat digunakan untuk memperbaiki lingkungan pengembangan yang ada.
- Jika Anda menggunakan VS Code dan Coding Pack For Java, instal ekstensi Gradle untuk Java.
Jika Anda tidak menggunakan Visual Studio Code, pastikan Anda memiliki hal berikut yang terinstal di lingkungan pengembangan Anda:
Kit Pengembangan Java (JDK) versi 8 atau yang lebih baru. Untuk informasi selengkapnya, lihatMicrosoft Build di OpenJDK.
Gradle, versi 6.8 atau yang lebih baru.
Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat single-service atau multi-service layanan sumber daya Document Intelligence di portal Azure, untuk memperoleh kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (
F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.Tips
Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Kemudian, Anda menempelkan kunci dan titik akhir Anda ke dalam kode:
Mengatur
Membuat proyek Gradle baru
Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat direktori baru untuk aplikasi Anda yang disebut doc-intel-app, dan navigasikan ke dalamnya.
mkdir doc-intel-app && doc-intel-appmkdir doc-intel-app; cd doc-intel-appJalankan
gradle initperintah dari direktori kerja Anda. Perintah ini membuat file build penting untuk Gradle, termasuk build.gradle.kts, yang digunakan pada runtime untuk membuat dan mengonfigurasi aplikasi Anda.gradle init --type basicSaat diminta untuk memilih DSL, pilih Kotlin.
Terima nama proyek default (doc-intel-app) dengan memilih Kembalikan atau Masukkan.
Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat direktori baru untuk aplikasi Anda yang disebut form-recognize-app, dan navigasikan ke dalamnya.
mkdir form-recognize-app && cd form-recognize-appmkdir form-recognize-app; cd form-recognize-appJalankan
gradle initperintah dari direktori kerja Anda. Perintah ini membuat file build penting untuk Gradle, termasuk build.gradle.kts, yang digunakan pada runtime untuk membuat dan mengonfigurasi aplikasi Anda.gradle init --type basicSaat diminta untuk memilih DSL, pilih Kotlin.
Terima nama proyek default (form-recognize-app) dengan memilih Kembalikan atau Masukkan.
Menginstal pustaka klien
Panduan cepat ini menggunakan manajer dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk manajer dependensi lain di Repositori Pusat Maven.
Buka file build.gradle.kts proyek di IDE Anda. Salin dan tempel kode berikut untuk menyertakan pustaka klien sebagai implementation perintah, bersama dengan plugin dan pengaturan yang diperlukan.
plugins {
java
application
}
application {
mainClass.set("DocIntelligence")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0'
}
Panduan cepat ini menggunakan manajer dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk manajer dependensi lain di Repositori Pusat Maven.
Buka file build.gradle.kts proyek di IDE Anda. Salin dan tempelkan kode berikut untuk menyertakan pustaka klien sebagai implementation pernyataan, bersama dengan plugin dan pengaturan yang diperlukan.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.1.0'
}
Panduan cepat ini menggunakan manajer dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk manajer dependensi lain di Repositori Pusat Maven.
Buka file build.gradle.kts proyek di IDE Anda. Copay dan tempel kode berikut untuk menyertakan pustaka klien sebagai implementation klausa, bersama dengan plugin dan pengaturan yang diperlukan.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'
}
Membuat aplikasi Java
Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentIntelligenceClient kelas. Untuk melakukannya, Anda membuat AzureKeyCredential dengan key dari portal Azure serta instance DocumentIntelligenceClient menggunakan AzureKeyCredential dan Inteligensi Dokumen endpoint Anda.
Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentAnalysisClient kelas. Untuk melakukannya, Anda membuat AzureKeyCredential dengan key dari portal Azure dan instans DocumentAnalysisClient dengan AzureKeyCredential dan Inteligensi Dokumen milik Anda endpoint.
Dari direktori doc-intel-app, jalankan perintah berikut:
mkdir -p src/main/javaAnda membuat struktur direktori berikut:
Navigasi ke
javadirektori dan buat file bernamaDocIntelligence.java.Tips
- Anda dapat membuat file baru menggunakan PowerShell.
- Buka jendela PowerShell di direktori proyek Anda dengan menahan tombol Shift dan mengklik kanan folder.
- Ketik perintah berikut New-Item DocIntelligence.java.
Buka file
DocIntelligence.java. Salin dan tempel salah satu sampel kode berikut ke dalam aplikasi Anda:
Navigasi ke
javadirektori dan buat file bernamaFormRecognizer.java.Tips
- Anda dapat membuat file baru menggunakan PowerShell.
- Buka jendela PowerShell di direktori proyek Anda dengan menahan tombol Shift dan mengklik kanan folder.
- Ketik perintah berikutNew-Item FormRecognizer.java.
Buka
FormRecognizer.javafile. Salin dan tempel salah satu sampel kode berikut ke dalam aplikasi Anda:
Penting
Sebaiknya autentikasi Microsoft Entra ID dengan identitas terkelola untuk sumber daya Azure untuk menghindari penyimpanan kredensial pada aplikasi Anda yang berjalan di cloud.
Gunakan kunci API dengan hati-hati. Jangan sertakan kunci API langsung dalam kode Anda, dan jangan pernah mempostingnya secara publik. Jika menggunakan kunci API, simpan dengan aman di Azure Key Vault, putar kunci secara teratur, dan batasi akses ke Azure Key Vault menggunakan kontrol akses berbasis peran dan pembatasan akses jaringan. Untuk informasi selengkapnya tentang menggunakan kunci API dengan aman di aplikasi Anda, lihat kunci API dengan Azure Key Vault.
Untuk informasi selengkapnya tentang keamanan layanan AI, lihat cara mengotentikasi permintaan ke layanan Azure AI.
Model tata letak
Ekstrak teks, tanda pilihan, gaya teks, struktur tabel, dan koordinat wilayah pembatas dari dokumen.
- Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
- Untuk menganalisis file tertentu di URI, Anda akan menggunakan
beginAnalyzeDocumentmetode dan meneruskanprebuilt-layoutsebagai Id model. Nilai yang dikembalikan adalah objek yangAnalyzeResultberisi data tentang dokumen yang dikirimkan. - Kami telah menambahkan nilai URI file ke
documentUrlvariabel dalam metode utama.
Tambahkan sampel kode berikut ke DocIntelligence.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:
import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.DocumentTable;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.util.List;
public class DocIntelligence {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-layout";
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
AnalyzeDocumentOptions options = new AnalyzeDocumentOptions(documentUrl);
SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeLayoutPoller = client.beginAnalyzeDocument(modelId, options);
AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line '%s' is within a bounding polygon %s.%n",
documentLine.getContent(),
documentLine.getPolygon()));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f.%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getState().toString(),
documentSelectionMark.getPolygon(),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell ->
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex()));
System.out.println();
}
// styles
analyzeLayoutResult.getStyles().forEach(documentStyle -> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
}
}
Membangun dan menjalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—doc-intel-app.
Bangun aplikasi Anda dengan
buildperintah :gradle buildJalankan aplikasi Anda dengan
runperintah :gradle run
Tambahkan sampel kode berikut ke FormRecognizer.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:
import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-layout";
SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);
AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line %s is within a bounding polygon %s.%n",
documentLine.getContent(),
documentLine.getPolygon().toString()));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is %s and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getState().toString(),
documentSelectionMark.getPolygon().toString(),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
}
// Utility function to get the bounding polygon coordinates
private static String getBoundingCoordinates(List < Point > Polygon) {
return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Membangun dan menjalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—form-recognize-app.
Bangun aplikasi Anda dengan
buildperintah :gradle buildJalankan aplikasi Anda dengan
runperintah :gradle run
Output model tata letak
Berikut adalah cuplikan output yang diharapkan:
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.
Untuk melihat seluruh output, kunjungi repositori sampel Azure pada GitHub untuk melihat output model layout.
Tambahkan sampel kode berikut ke FormRecognizer.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentTable;
import com.azure.ai.formrecognizer.documentanalysis.models.Point;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.util.List;
import java.util.stream.Collectors;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-layout";
SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutPoller =
client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);
AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line '%s' is within a bounding polygon %s.%n",
documentLine.getContent(),
getBoundingCoordinates(documentLine.getPolygon())));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f.%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getSelectionMarkState().toString(),
getBoundingCoordinates(documentSelectionMark.getPolygon()),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
// styles
analyzeLayoutResult.getStyles().forEach(documentStyle -
> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
}
/**
* Utility function to get the bounding polygon coordinates.
*/
private static String getBoundingCoordinates(List < Point > Polygon) {
return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Membangun dan menjalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—form-recognize-app.
Bangun aplikasi Anda dengan
buildperintah :gradle buildJalankan aplikasi Anda dengan
runperintah :gradle run
Model bawaan
Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model bawaan. Dalam contoh ini, kami menganalisis faktur menggunakan model faktur bawaan.
Tips
Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat pengambilan data model.
- Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
- Kami telah menambahkan nilai URL file ke
invoiceUrlvariabel di bagian atas file. - Untuk menganalisis file tertentu di URI, Anda akan menggunakan
beginAnalyzeDocumentsmetode dan meneruskanPrebuiltModels.Invoicesebagai Id model. Nilai yang dikembalikan adalah objek yangresultberisi data tentang dokumen yang dikirimkan. - Untuk kesederhanaan, pasangan kunci-nilai yang dikembalikan oleh layanan tidak semuanya ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.
Tambahkan sampel kode berikut ke DocIntelligence.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:
import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzedDocument;
import com.azure.ai.documentintelligence.models.DocumentField;
import com.azure.ai.documentintelligence.models.DocumentFieldType;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
public class DocIntelligence {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-invoice";
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeInvoicesPoller =
client.beginAnalyzeDocument(modelId, new AnalyzeDocumentOptions(invoiceUrl));
AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map<String, DocumentField> invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueAsString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueAsString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueAsString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueAsString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueAsString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (invoiceDateField != null) {
if (DocumentFieldType.DATE == invoiceDateField.getType()) {
LocalDate invoiceDate = invoiceDateField.getValueAsDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (invoiceTotalField != null) {
if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueAsDouble();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
invoiceTotal, invoiceTotalField.getConfidence());
}
}
DocumentField invoiceItemsField = invoiceFields.get("Items");
if (invoiceItemsField != null) {
System.out.printf("Invoice Items: %n");
if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
List<DocumentField> invoiceItems = invoiceItemsField.getValueAsList();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
.map(documentField -> documentField.getValueAsMap())
.forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
// See a full list of fields found on an invoice here:
// https://aka.ms/documentintelligence/invoicefields
if ("Description".equals(key)) {
if (DocumentFieldType.STRING == documentField.getType()) {
String name = documentField.getValueAsString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double quantity = documentField.getValueAsDouble();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double unitPrice = documentField.getValueAsDouble();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double productCode = documentField.getValueAsDouble();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
Membangun dan menjalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—doc-intel-app.
Bangun aplikasi Anda dengan
buildperintah :gradle buildJalankan aplikasi Anda dengan
runperintah :gradle run
Tambahkan sampel kode berikut ke FormRecognizer.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:
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());
}
}
}));
}
}
}
}
}
Membangun dan menjalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—doc-intel-app.
Bangun aplikasi Anda dengan
buildperintah :gradle buildJalankan aplikasi Anda dengan
runperintah :gradle run
Output model bawaan
Berikut adalah cuplikan output yang diharapkan:
----------- 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
Untuk melihat seluruh output, kunjungi repositori sampel Azure di GitHub untuk melihat output model faktur prabangun.
Tambahkan sampel kode berikut ke FormRecognizer.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:
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());
}
}
}));
}
}
}
}
}
Membangun dan menjalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—doc-intel-app.
Bangun aplikasi Anda dengan
buildperintah :gradle buildJalankan aplikasi Anda dengan
runperintah :gradle run
Pustaka klien |Referensi | REST APIPaket (npm) | Sampel |Versi REST API yang didukung
Pustaka klien |Referensi | REST APIPaket (npm) | Sampel |Versi REST API yang didukung
Dalam mulai cepat ini, gunakan fitur berikut untuk menganalisis dan mengekstrak data dan nilai dari formulir dan dokumen:
Tata Letak—Menganalisis dan mengekstrak tabel, garis, kata, dan tanda pilihan seperti tombol radio dan kotak centang dalam dokumen, tanpa perlu melatih model.
Faktur Bawaan—Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model faktur yang telah dilatih sebelumnya.
Prasyarat
langganan Azure - Buat langganan secara gratis.
Versi terbaru Visual Studio Code atau IDE pilihan Anda. Untuk informasi selengkapnya, seeNode.js di Visual Studio Code.
Versi terbaru
LTSNode.js.Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat single-service atau multi-service layanan sumber daya Document Intelligence di portal Azure, untuk memperoleh kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (
F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.Tips
Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.
Mengatur
Membuat aplikasi Node.js Express baru: Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat dan navigasikan ke direktori baru untuk aplikasi Anda bernama
doc-intel-app.mkdir doc-intel-app && cd doc-intel-appJalankan perintah
npm inituntuk menginisialisasi aplikasi dan membangun kerangka proyek Anda.npm initTentukan atribut proyek Anda menggunakan perintah yang disajikan di terminal.
- Atribut yang paling penting adalah nama, nomor versi, dan titik masuk.
- Sebaiknya simpan
index.jsuntuk nama titik masuk. Deskripsi, perintah pengujian, repositori GitHub, kata kunci, penulis, dan informasi lisensi adalah atribut opsional—mereka dapat dilewati untuk proyek ini. - Terima saran dalam tanda kurung dengan memilih Kembalikan atau Masukkan.
- Setelah Anda menyelesaikan perintah,
package.jsonfile akan dibuat di direktori doc-intel-app Anda.
ai-document-intelligenceInstal pustaka klien danazure/identitypaket npm:npm i @azure-rest/ai-document-intelligence@1.1.0File aplikasi
package.jsonAnda diperbarui dengan dependensi.
ai-form-recognizerInstal pustaka klien danazure/identitypaket npm:npm i @azure/ai-form-recognizer@5.0.0 @azure/identity- File aplikasi
package.jsonAnda diperbarui dengan dependensi.
- File aplikasi
ai-form-recognizerInstal pustaka klien danazure/identitypaket npm:npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
Buat file bernama
index.jsdi direktori aplikasi.Tips
- Anda dapat membuat file baru menggunakan PowerShell.
- Buka jendela PowerShell di direktori proyek Anda dengan menahan tombol Shift dan mengklik kanan folder.
- Ketik perintah berikut New-Item index.js.
Membangun aplikasi Anda
Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentIntelligenceClient kelas. Untuk melakukannya, Anda membuat AzureKeyCredential dengan key dari portal Azure dan instans DocumentIntelligenceClient dengan AzureKeyCredential dan Inteligensi Dokumen milik Anda endpoint.
Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentAnalysisClient kelas. Untuk melakukannya, Anda membuat sebuah AzureKeyCredential dengan key dari portal Azure dan sebuah instans DocumentAnalysisClient dengan AzureKeyCredential serta Form Recognizer endpoint Anda.
Buka file
index.jsdi Visual Studio Code atau IDE favorit Anda. Salin dan tempel salah satu sampel kode berikut ke dalam aplikasi Anda:
Penting
Sebaiknya autentikasi Microsoft Entra ID dengan identitas terkelola untuk sumber daya Azure untuk menghindari penyimpanan kredensial pada aplikasi Anda yang berjalan di cloud.
Gunakan kunci API dengan hati-hati. Jangan sertakan kunci API langsung dalam kode Anda, dan jangan pernah mempostingnya secara publik. Jika menggunakan kunci API, simpan dengan aman di Azure Key Vault, putar kunci secara teratur, dan batasi akses ke Azure Key Vault menggunakan kontrol akses berbasis peran dan pembatasan akses jaringan. Untuk informasi selengkapnya tentang menggunakan kunci API dengan aman di aplikasi Anda, lihat kunci API dengan Azure Key Vault.
Untuk informasi selengkapnya tentang keamanan layanan AI, lihat cara mengotentikasi permintaan ke layanan Azure AI.
Model tata letak
Ekstrak teks, tanda pilihan, gaya teks, struktur tabel, dan koordinat wilayah pembatas dari dokumen.
- Untuk contoh ini, Anda memerlukan file dokumen dari URL. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
- Kami telah menambahkan nilai URL file ke variabel di
formUrldekat bagian atas file.- Untuk menganalisis file tertentu dari URL, Anda akan menggunakan metode
beginAnalyzeDocumentsdan meneruskanprebuilt-layoutsebagai Id model.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
async function main() {
const client = DocumentIntelligence(endpoint, { key });
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-layout")
.post({
contentType: "application/json",
body: {
urlSource: formUrl
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const pages = analyzeResult?.pages;
const tables = analyzeResult?.tables;
if (pages && pages.length > 0) {
console.log("Pages:");
for (const page of pages) {
console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
console.log(` ${page.width}x${page.height}`);
console.log(` ${page.lines?.length || 0} lines, ${page.words?.length || 0} words`);
}
} else {
console.log("No pages were extracted from the document.");
}
if (tables && tables.length > 0) {
console.log("Tables:");
for (const table of tables) {
console.log(
`- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
);
}
} else {
console.log("No tables were extracted from the document.");
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Jalankan aplikasi Anda
Setelah Anda menambahkan sampel kode ke aplikasi, jalankan program Anda:
Navigasi ke folder tempat Anda memiliki aplikasi Kecerdasan Dokumen (doc-intel-app).
Ketik perintah berikut di terminal Anda:
node index.js
Tambahkan sampel kode berikut ke index.js file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:
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);
});
Jalankan aplikasi Anda
Setelah Anda menambahkan sampel kode ke aplikasi, jalankan program Anda:
Navigasi ke folder tempat Anda memiliki aplikasi Kecerdasan Dokumen (doc-intel-app).
Ketik perintah berikut di terminal Anda:
node index.js
Output model tata letak
Berikut adalah cuplikan output yang diharapkan:
Pages:
- Page 1 (unit: inch)
8.5x11, angle: 0
69 lines, 425 words
Tables:
- Extracted table: 3 columns, 5 rows (15 cells)
Untuk melihat seluruh output, kunjungi repositori sampel Azure pada GitHub untuk melihat output model layout.
Model bawaan
Dalam contoh ini, kami menganalisis faktur menggunakan model faktur bawaan.
Tips
Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat pengambilan data model.
- Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
- Kami telah menambahkan nilai URL file ke
invoiceUrlvariabel di bagian atas file. - Untuk menganalisis file tertentu di URI, Anda akan menggunakan
beginAnalyzeDocumentsmetode dan meneruskanPrebuiltModels.Invoicesebagai Id model. Nilai yang dikembalikan adalah objek yangresultberisi data tentang dokumen yang dikirimkan. - Untuk kesederhanaan, pasangan kunci-nilai yang dikembalikan oleh layanan tidak semuanya ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
async function main() {
const client = DocumentIntelligence(endpoint, { key });
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
.post({
contentType: "application/json",
body: {
urlSource: invoiceUrl,
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const invoice = documents && documents[0];
if (!invoice) {
throw new Error("Expected at least one invoice in the result.");
}
console.log(
"Extracted invoice:",
invoice.docType,
`(confidence: ${invoice.confidence || "<undefined>"})`
);
console.log("Fields:", invoice.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Jalankan aplikasi Anda
Setelah Anda menambahkan sampel kode ke aplikasi, jalankan program Anda:
Navigasi ke folder tempat Anda memiliki aplikasi Kecerdasan Dokumen (doc-intel-app).
Ketik perintah berikut di terminal Anda:
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);
});
Jalankan aplikasi Anda
Setelah Anda menambahkan sampel kode ke aplikasi, jalankan program Anda:
Navigasi ke folder tempat Anda memiliki aplikasi Kecerdasan Dokumen (doc-intel-app).
Ketik perintah berikut di terminal Anda:
node index.js
Output model bawaan
Berikut adalah cuplikan output yang diharapkan:
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
Untuk melihat seluruh output, kunjungi repositori sampel Azure di GitHub untuk melihat output model faktur prabangun.
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);
});
Jalankan aplikasi Anda
Setelah Anda menambahkan sampel kode ke aplikasi, jalankan program Anda:
Navigasi ke folder tempat Anda memiliki aplikasi Kecerdasan Dokumen (doc-intel-app).
Ketik perintah berikut di terminal Anda:
node index.js
Dalam mulai cepat ini, gunakan fitur berikut untuk menganalisis dan mengekstrak data dari formulir dan dokumen:
Tata letak—Menganalisis dan mengekstrak tabel, garis, kata, dan tanda pilihan seperti tombol radio dan kotak centang, dan pasangan kunci-nilai, tanpa perlu melatih model.
Faktur Prabangun—Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model yang sudah dilatih sebelumnya.
Prasyarat
langganan Azure - Buat langganan secara gratis.
Python 3.7 atau yang lebih baru.
- Penginstalan Python Anda harus menyertakan pip. Anda dapat memeriksa apakah Anda telah menginstal pip dengan menjalankan
pip --versionpada baris perintah. Untuk mendapatkan pip, pasanglah versi terbaru dari Python.
- Penginstalan Python Anda harus menyertakan pip. Anda dapat memeriksa apakah Anda telah menginstal pip dengan menjalankan
Versi terbaru Visual Studio Code atau IDE pilihan Anda. Untuk informasi selengkapnya, seeMulai dengan Python di Visual Studio Code.
Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat single-service atau multi-service layanan sumber daya Document Intelligence di portal Azure, untuk memperoleh kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (
F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.
Tips
Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.
Mengatur
Buka jendela terminal di lingkungan lokal Anda dan instal pustaka klien Foundry Tools Azure Document Intelligence untuk Python menggunakan pip:
pip install azure-ai-documentintelligence==1.0.2
pip install azure-ai-formrecognizer==3.3.0
pip install azure-ai-formrecognizer==3.2.0b6
Membuat aplikasi Python Anda
Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentIntelligenceClient kelas. Untuk melakukannya, Anda membuat AzureKeyCredential dengan key dari portal Azure dan instans DocumentIntelligenceClient dengan AzureKeyCredential dan Inteligensi Dokumen milik Anda endpoint.
Buat file Python baru yang disebut doc_intel_quickstart.py di editor atau IDE pilihan Anda.
Buka file doc_intel_quickstart.py dan pilih salah satu sampel kode berikut untuk disalin dan ditempelkan ke dalam aplikasi Anda:
Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentAnalysisClient kelas. Untuk melakukannya, Anda membuat AzureKeyCredential dengan key dari portal Azure dan instans DocumentAnalysisClient dengan AzureKeyCredential dan Inteligensi Dokumen milik Anda endpoint.
Buat file Python baru yang disebut form_recognizer_quickstart.py di editor atau IDE pilihan Anda.
Buka file form_recognizer_quickstart.py dan pilih salah satu sampel kode berikut untuk disalin dan ditempelkan ke dalam aplikasi Anda:
Penting
Sebaiknya autentikasi Microsoft Entra ID dengan identitas terkelola untuk sumber daya Azure untuk menghindari penyimpanan kredensial pada aplikasi Anda yang berjalan di cloud.
Gunakan kunci API dengan hati-hati. Jangan sertakan kunci API langsung dalam kode Anda, dan jangan pernah mempostingnya secara publik. Jika menggunakan kunci API, simpan dengan aman di Azure Key Vault, putar kunci secara teratur, dan batasi akses ke Azure Key Vault menggunakan kontrol akses berbasis peran dan pembatasan akses jaringan. Untuk informasi selengkapnya tentang menggunakan kunci API dengan aman di aplikasi Anda, lihat kunci API dengan Azure Key Vault.
Untuk informasi selengkapnya tentang keamanan layanan AI, lihat cara mengotentikasi permintaan ke layanan Azure AI.
Model tata letak
Ekstrak teks, tanda pilihan, gaya teks, struktur tabel, dan koordinat wilayah pembatas dari dokumen.
- Untuk contoh ini, Anda memerlukan file dokumen dari URL. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
- Kami telah menambahkan nilai URL file ke
formUrlvariabel dalamanalyze_layoutfungsi .
Tambahkan sampel kode berikut ke aplikasi doc_intel_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:
# 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()
Jalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:
Navigasikan ke folder tempat Anda memiliki file doc_intel_quickstart.py .
Ketik perintah berikut di terminal Anda:
python doc_intel_quickstart.py
Untuk menganalisis file tertentu di URL, gunakan metode begin_analyze_document_from_url dan gunakan prebuilt-layout sebagai ID model. Nilai yang dikembalikan adalah objek yang result berisi data tentang dokumen yang dikirimkan.
Tambahkan sampel kode berikut ke aplikasi form_recognizer_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.
# 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()
Jalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:
Navigasikan ke folder tempat Anda memiliki file form_recognizer_quickstart.py .
Ketik perintah berikut di terminal Anda:
python form_recognizer_quickstart.py
Output model tata letak
Berikut adalah cuplikan output yang diharapkan:
----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
Untuk melihat seluruh output, kunjungi repositori sampel Azure pada GitHub untuk melihat output model layout.
Tambahkan sampel kode berikut ke aplikasi form_recognizer_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.
# 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()
Jalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:
Navigasikan ke folder tempat Anda memiliki file form_recognizer_quickstart.py .
Ketik perintah berikut di terminal Anda:
python form_recognizer_quickstart.py
Model bawaan
Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model bawaan. Dalam contoh ini, kami menganalisis faktur menggunakan model faktur bawaan.
Tips
Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat pengambilan data model.
- Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
- Kami telah menambahkan nilai URL file ke
invoiceUrlvariabel di bagian atas file. - Untuk kesederhanaan, pasangan kunci-nilai yang dikembalikan oleh layanan tidak semuanya ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.
Tambahkan sampel kode berikut ke aplikasi doc_intel_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:
# 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()
Jalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:
Navigasikan ke folder tempat Anda memiliki file doc_intel_quickstart.py .
Ketik perintah berikut di terminal Anda:
python doc_intel_quickstart.py
Untuk menganalisis file pada URI, gunakan begin_analyze_document_from_url dan berikan prebuilt-invoice sebagai ID model. Nilai yang dikembalikan adalah objek yang result berisi data tentang dokumen yang dikirimkan.
Tambahkan sampel kode berikut ke aplikasi form_recognizer_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.
# 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()
Jalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:
Navigasikan ke folder tempat Anda memiliki file form_recognizer_quickstart.py .
Ketik perintah berikut di terminal Anda:
python form_recognizer_quickstart.py
Output model bawaan
Berikut adalah cuplikan output yang diharapkan:
--------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
Untuk melihat seluruh output, kunjungi repositori sampel Azure di GitHub untuk melihat output model faktur prabangun.
Tambahkan sampel kode berikut ke aplikasi form_recognizer_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.
# 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()
Jalankan aplikasi
Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:
Navigasikan ke folder tempat Anda memiliki file form_recognizer_quickstart.py .
Ketik perintah berikut di terminal Anda:
python form_recognizer_quickstart.py
Dalam panduan singkat ini, belajarlah cara menggunakan REST API Kecerdasan Dokumen untuk menganalisis dan mengekstrak data dan nilai dari dokumen.
Prasyarat
langganan Azure - Buat langganan secara gratis
Alat baris perintah
cURLtelah terinstal.PowerShell versi 7.*+ (atau aplikasi baris perintah serupa.):
Untuk memeriksa versi PowerShell Anda, ketik perintah berikut relatif terhadap sistem operasi Anda:
- Windows:
Get-Host | Select-Object Version - macOS atau Linux:
$PSVersionTable
- Windows:
Sumber daya Kecerdasan Dokumen (layanan tunggal) atau Foundry Tools (multi-layanan). Setelah Anda memiliki langganan Azure, buat single-service atau multi-service layanan sumber daya Document Intelligence di portal Azure, untuk memperoleh kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (
F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.
Tips
Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.
Menganalisis dokumen dan mendapatkan hasil
Permintaan POST digunakan untuk menganalisis dokumen dengan model bawaan atau kustom. Permintaan GET digunakan untuk mengambil hasil panggilan analisis dokumen.
modelId digunakan dengan POST dan resultId dengan operasi GET.
Analisis dokumen (Permintaan POST)
Sebelum Anda menjalankan perintah cURL, buat perubahan berikut pada permintaan posting:
Ganti
{endpoint}dengan nilai titik akhir dari instans Kecerdasan Dokumen portal Azure Anda.Ganti
{key}dengan nilai kunci dari instans Kecerdasan Dokumen portal Azure Anda.Menggunakan tabel berikut sebagai referensi, ganti
{modelID}dan{your-document-url}dengan nilai yang Anda inginkan.Anda memerlukan file dokumen di URL. Untuk mulai cepat ini, Anda dapat menggunakan formulir sampel yang disediakan dalam tabel berikut untuk setiap fitur:
Contoh dokumen
| Fitur | {modelID} | {your-document-url} |
|---|---|---|
| Membaca | prebuilt-read |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
| Tata letak | prebuilt-layout |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
| Kartu asuransi kesehatan | prebuilt-healthInsuranceCard.us |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png |
| W-2 | prebuilt-tax.us.w2 |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png |
| Faktur | prebuilt-invoice |
https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
| Tanda terima | prebuilt-receipt |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
| Dokumen Identitas | prebuilt-idDocument |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Contoh dokumen
| Fitur | {modelID} | {your-document-url} |
|---|---|---|
| Dokumen Umum | prebuilt-document |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf |
| Membaca | prebuilt-read |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
| Tata letak | prebuilt-layout |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
| Kartu asuransi kesehatan | prebuilt-healthInsuranceCard.us |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png |
| W-2 | prebuilt-tax.us.w2 |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png |
| Faktur | prebuilt-invoice |
https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
| Tanda terima | prebuilt-receipt |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
| Dokumen Identitas | prebuilt-idDocument |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
| Kartu nama | prebuilt-businessCard |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg |
Penting
Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihatKeamanan Foundry Tools.
Permintaan POST
curl -v -i -X POST "{endpoint}/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-11-30" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelID}:analyze?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelId}:analyze?api-version=2022-08-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
Respons POST (resultID)
Anda menerima 202 (Success) respons yang menyertakan header Operation-Location yang hanya dapat dibaca. Nilai header ini berisi resultID yang dapat dikueri untuk mendapatkan status operasi asinkron dan mengambil hasilnya menggunakan permintaan GET dengan kunci langganan sumber daya yang sama:
Mendapatkan hasil analisis (Permintaan GET)
Setelah Anda memanggil Analyze document API, panggil Get analyze result API untuk mendapatkan status operasi dan data yang diekstrak. Sebelum Anda menjalankan perintah, buat perubahan ini:
Setelah Anda memanggil Analyze document API, panggil Get analyze result API untuk mendapatkan status operasi dan data yang diekstrak. Sebelum Anda menjalankan perintah, buat perubahan ini:
Setelah Anda memanggil Analyze document API, panggil Get analyze result API untuk mendapatkan status operasi dan data yang diekstrak. Sebelum Anda menjalankan perintah, buat perubahan ini:
Ganti
{resultID}header Operation-Location dari respons POST.Ganti
{key}dengan nilai kunci dari instans Kecerdasan Dokumen Anda di portal Azure.
Permintaan GET
curl -v -X GET "{endpoint}/documentintelligence/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2024-11-30" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2023-07-31" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2022-08-31" -H "Ocp-Apim-Subscription-Key: {key}"
Memeriksa respons
Anda menerima 200 (Success) respons dengan output JSON. Bidang pertama, "status", menunjukkan status operasi. Jika operasi tidak selesai, nilainya "status" adalah "running" atau "notStarted", dan Anda harus memanggil API lagi, baik secara manual atau melalui skrip. Kami merekomendasikan interval satu detik atau lebih antara panggilan.
Sampel respons untuk faktur bawaan
{
"status": "succeeded",
"createdDateTime": "2024-03-25T19:31:37Z",
"lastUpdatedDateTime": "2024-03-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2024-11-30",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
{
"status": "succeeded",
"createdDateTime": "2023-08-25T19:31:37Z",
"lastUpdatedDateTime": "2023-08-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2023-07-31",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
{
"status": "succeeded",
"createdDateTime": "2022-09-25T19:31:37Z",
"lastUpdatedDateTime": "2022-09-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2022-08-31",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
Bidang dokumen yang didukung
Model bawaan mengekstrak set bidang dokumen yang telah ditentukan sebelumnya. Lihat Ekstraksi data model untuk nama bidang, jenis, deskripsi, dan contoh yang diekstrak.
Itu saja, selamat!
Dalam panduan kilat ini, Anda menggunakan model kecerdasan dokumen untuk menganalisis berbagai formulir dan dokumen. Selanjutnya, jelajahi Studio Kecerdasan Dokumen dan dokumentasi referensi untuk mempelajari TENTANG API Kecerdasan Dokumen secara mendalam.
Langkah berikutnya
Untuk pengalaman yang ditingkatkan dan kualitas model tingkat lanjut, coba Studio Kecerdasan Dokumen
Untuk migrasi v3.1 ke v4.0, lihat Panduan Migrasi Changelog.
Konten ini berlaku untuk:
v2.1 | Versi terbaru:
v4.0 (GA)
Mulai menggunakan Azure Kecerdasan Dokumen menggunakan bahasa pemrograman pilihan Anda atau REST API. Kecerdasan Dokumen adalah layanan Foundry Tools berbasis cloud yang menggunakan pembelajaran mesin untuk mengekstrak pasangan kunci-nilai, teks, dan tabel dari dokumen Anda. Kami menyarankan agar Anda menggunakan layanan gratis saat mempelajari teknologi. Ingatlah bahwa jumlah halaman gratis dibatasi hingga 500 per bulan.
Untuk mempelajari selengkapnya tentang fitur Dan opsi pengembangan Kecerdasan Dokumen, kunjungi halaman Gambaran Umum kami.
Dokumentasi referensi | Kode sumber pustaka | Paket (NuGet) | Contoh-contoh
Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:
Prasyarat
langganan Azure - Buat langganan secara gratis.
Versi saat ini Visual Studio IDE.
Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau layanan multi di portal Azure untuk mendapatkan kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (
F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.Tips
Buat sumber daya foundry jika Anda berencana untuk mengakses beberapa Foundry Tools dengan satu kunci/titik akhir. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda berniat menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.
Mengatur
Mulai Visual Studio 2019.
Pada halaman mulai, pilih Buat proyek baru.
Pada halaman Buat proyek baru, masukkan konsol di kotak pencarian. Pilih templat Aplikasi Konsol , lalu pilih Berikutnya.
Di jendela dialog Konfigurasi project baru Anda, masukkan
formRecognizer_quickstartdi kotak nama Project. Lalu pilih Berikutnya.
Di jendela dialog Informasi tambahan, pilih .NET 5.0 (Saat Ini), lalu pilih Buat.
Menginstal pustaka klien dengan NuGet
Klik kanan pada proyek formRecognizer_quickstart Anda dan pilih Kelola Paket NuGet... .
Pilih tab Telusuri dan ketik Azure. AI. FormRecognizer.
Pilih versi 3.1.1 dari menu dropdown dan pilih Instal.
Membangun aplikasi Anda
Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans FormRecognizerClient kelas. Untuk melakukannya, Anda membuat sebuah AzureKeyCredential dengan kunci Anda dan sebuah instance FormRecognizerClient dengan AzureKeyCredential dan Dokumen Kecerdasan endpoint Anda.
Catatan
- Dimulai dengan .NET 6, proyek baru yang menggunakan templat
consolemenghasilkan gaya program baru yang berbeda dari versi sebelumnya. - Output baru menggunakan fitur C# terbaru yang menyederhanakan kode yang perlu Anda tulis.
- Ketika Anda menggunakan versi yang lebih baru, Anda hanya perlu menulis isi
Mainmetode . Anda tidak perlu menyertakan pernyataan tingkat teratas, direktif menggunakan global, atau direktif menggunakan implisit. - Untuk informasi selengkapnya, lihatTemplat C# baru menghasilkan pernyataan tingkat atas.
Buka file Program.cs .
Sertakan berikut ini menggunakan direktif:
using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
- Atur variabel lingkungan
endpointdankeyAnda dan buat instansAzureKeyCredentialdanFormRecognizerClientAnda.
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);
Hapus baris,
Console.Writeline("Halo Dunia!");, dan tambahkan salah satu sampel kode Try It ke file Program.cs:
Pilih sampel kode untuk disalin dan ditempelkan ke metode Utama aplikasi Anda:
Penting
Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat artikel keamanan Foundry Tools.
Coba: Model tata letak
Ekstrak teks, tanda pilihan, gaya teks, dan struktur tabel, bersama dengan koordinat wilayah pembatasnya dari dokumen.
- Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
- Kami telah menambahkan nilai URI file ke
formUrivariabel . - Untuk mengekstrak tata letak dari file yang ditentukan di URI, gunakan metode
StartRecognizeContentFromUriAsync.
Tambahkan kode berikut ke file Program.cs aplikasi tata letak Anda:
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}'.");
}
}
}
}
}
}
Coba: Model bawaan
Sampel ini menunjukkan cara menganalisis data dari jenis dokumen umum tertentu dengan model yang telah dilatih sebelumnya, menggunakan faktur sebagai contoh.
- Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
- Kami telah menambahkan nilai URI file ke
invoiceUrivariabel di bagian atas metode Utama. - Untuk menganalisis file tertentu di URI, gunakan
StartRecognizeInvoicesFromUriAsyncmetode . - Untuk kesederhanaan, tidak semua field yang dikembalikan oleh layanan ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.
Pilih model bawaan
Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan untuk operasi analisis tergantung pada jenis dokumen yang akan dianalisis. Berikut adalah model bawaan yang saat ini didukung oleh layanan Kecerdasan Dokumen:
- Faktur: mengekstrak teks, tanda pilihan, tabel, bidang, dan informasi utama dari faktur.
- Tanda terima: mengekstrak teks dan informasi kunci dari tanda terima.
- Dokumen ID: mengekstrak teks dan informasi utama dari SIM dan paspor internasional.
- Kartu nama: mengekstrak teks dan informasi utama dari kartu nama.
Tambahkan kode berikut ke dalam metode file Program.cs aplikasi faktur bawaan Anda
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}");
}
}
}
}
}
Jalankan aplikasi Anda
Pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.
Dokumentasi Referensi | Kode sumber pustaka | Package (Maven) | Contoh
Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:
Prasyarat
langganan Azure - Buat langganan secara gratis.
Kit Pengembangan Java (JDK) versi 8 atau yang lebih baru. Untuk informasi selengkapnya, lihatVersi Java yang didukung dan jadwal pembaruan.
Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau layanan multi di portal Azure untuk mendapatkan kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (
F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.
Mengatur
Membuat proyek Gradle baru
Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat direktori baru untuk aplikasi Anda yang disebut form-recognizer-app, dan navigasikan ke dalamnya.
mkdir form-recognizer-app && form-recognizer-app
Jalankan
gradle initperintah dari direktori kerja Anda. Perintah ini membuat file build penting untuk Gradle, termasuk build.gradle.kts, yang digunakan pada runtime untuk membuat dan mengonfigurasi aplikasi Anda.gradle init --type basicSaat diminta untuk memilih DSL, pilih Kotlin.
Terima nama proyek default (form-recognizer-app)
Menginstal pustaka klien
Panduan cepat ini menggunakan manajer dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk manajer dependensi lain di Repositori Pusat Maven.
Dalam file build.gradle.kts proyek Anda, sertakan pustaka klien sebagai implementation pernyataan, bersama dengan plugin dan pengaturan yang diperlukan.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}
Membuat file Java
Dari direktori kerja Anda, jalankan perintah berikut:
mkdir -p src/main/java
Anda membuat struktur direktori berikut:
Navigasi ke direktori Java dan buat file yang disebut FormRecognizer.java. Buka di editor atau IDE pilihan Anda dan tambahkan deklarasi dan import pernyataan paket berikut:
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;
Pilih sampel kode untuk disalin dan ditempelkan ke metode utama aplikasi Anda:
Penting
Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihatKeamanan Foundry Tools.
Coba: Model tata letak
Ekstrak teks, tanda pilihan, gaya teks, dan struktur tabel, bersama dengan koordinat wilayah pembatasnya dari dokumen.
- Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
- Untuk menganalisis file tertentu di URI, Anda akan menggunakan metode .
beginRecognizeContentFromUrl - Kami telah menambahkan nilai URI file ke
formUrlvariabel dalam metode utama.
Perbarui kelas FormRecognizer aplikasi Anda, dengan kode berikut (pastikan untuk memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda):
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();
});
});
}
Coba: Model bawaan
Sampel ini menunjukkan cara menganalisis data dari jenis dokumen umum tertentu dengan model yang telah dilatih sebelumnya, menggunakan faktur sebagai contoh.
- Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
- Untuk menganalisis file tertentu di URI, Anda akan menggunakan
beginRecognizeInvoicesFromUrl. - Kami telah menambahkan nilai URI file ke
invoiceUrlvariabel dalam metode utama. - Untuk kesederhanaan, tidak semua field yang dikembalikan oleh layanan ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.
Pilih model bawaan
Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Berikut adalah model bawaan yang saat ini didukung oleh layanan Kecerdasan Dokumen:
- Faktur: mengekstrak teks, tanda pilihan, tabel, bidang, dan informasi utama dari faktur.
- Tanda terima: mengekstrak teks dan informasi kunci dari tanda terima.
- Dokumen ID: mengekstrak teks dan informasi utama dari SIM dan paspor internasional.
- Kartu nama: mengekstrak teks dan informasi utama dari kartu nama.
Perbarui kelas FormRecognizer aplikasi Anda, dengan kode berikut (pastikan untuk memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda):
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());
}
}
}
}
Membangun dan menjalankan aplikasi Anda
Navigasikan kembali ke direktori proyek utama Anda—form-recognizer-app.
- Bangun aplikasi Anda dengan
buildperintah :
gradle build
- Jalankan aplikasi Anda dengan
runperintah :
gradle run
Dokumentasi Referensi | Kode Sumber Pustaka | Package (npm) | Sampel
Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:
Prasyarat
langganan Azure - Buat langganan secara gratis.
Versi terbaru Visual Studio Code atau IDE pilihan Anda.
Versi terbaru
LTSNode.jsPerangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau layanan multi di portal Azure untuk mendapatkan kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (
F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.Tips
Buat sumber daya foundry jika Anda berencana untuk mengakses beberapa Foundry Tools dengan satu kunci/titik akhir. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda berniat menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.
Mengatur
Buat aplikasi Node.js baru. Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat direktori baru untuk aplikasi Anda, dan navigasikan ke dalamnya.
mkdir form-recognizer-app && cd form-recognizer-appJalankan perintah
npm inituntuk membuat aplikasi Node menggunakan filepackage.json.npm initai-form-recognizerInstal paket npm pustaka klien:npm install @azure/ai-form-recognizerFile aplikasi
package.jsonAnda diperbarui dengan dependensi.Buat file bernama
index.js, buka, dan impor pustaka berikut:const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");Buat variabel untuk titik akhir dan kunci Azure sumber daya Anda:
const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE"; const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";Pada titik ini, aplikasi JavaScript Anda harus berisi baris kode berikut:
const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer"); const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"; const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
Pilih sampel kode untuk disalin dan ditempelkan ke aplikasi Anda:
Penting
Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihatKeamanan Foundry Tools.
Coba: Model tata letak
- Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
- Kami telah menambahkan nilai URI file ke variabel di
formUrldekat bagian atas file. - Untuk menganalisis file tertentu di URI, Anda akan menggunakan metode .
beginRecognizeContent
Tambahkan kode berikut ke aplikasi tata letak Anda pada baris di bawah key variabel
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);
});
Coba: Model bawaan
Sampel ini menunjukkan cara menganalisis data dari jenis dokumen umum tertentu dengan model yang telah dilatih sebelumnya, menggunakan faktur sebagai contoh. Lihat halaman konsep bawaan kami untuk daftar lengkap bidang faktur
- Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
- Kami telah menambahkan nilai URI file ke
invoiceUrlvariabel di bagian atas file. - Untuk menganalisis file tertentu di URI, Anda akan menggunakan metode .
beginRecognizeInvoices - Untuk kesederhanaan, tidak semua field yang dikembalikan oleh layanan ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.
Pilih model bawaan
Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Berikut adalah model bawaan yang saat ini didukung oleh layanan Kecerdasan Dokumen:
- Faktur: mengekstrak teks, tanda pilihan, tabel, bidang, dan informasi utama dari faktur.
- Tanda terima: mengekstrak teks dan informasi kunci dari tanda terima.
- Dokumen ID: mengekstrak teks dan informasi utama dari SIM dan paspor internasional.
- Kartu nama: mengekstrak teks dan informasi utama dari kartu nama.
Tambahkan kode berikut ke aplikasi faktur bawaan Anda di key bawah variabel
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);
});
Dokumentasi Referensi | Kode sumber pustaka | Paket (PyPi) | Contoh
Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:
Prasyarat
langganan Azure - Buat langganan secara gratis
-
- Penginstalan Python Anda harus menyertakan pip. Anda dapat memeriksa apakah Anda telah menginstal pip dengan menjalankan
pip --versionpada baris perintah. Untuk mendapatkan pip, pasanglah versi terbaru dari Python.
- Penginstalan Python Anda harus menyertakan pip. Anda dapat memeriksa apakah Anda telah menginstal pip dengan menjalankan
Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau layanan multi di portal Azure untuk mendapatkan kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (
F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.Tips
Buat sumber daya foundry jika Anda berencana untuk mengakses beberapa Foundry Tools dengan satu kunci/titik akhir. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda berniat menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.
Mengatur
Buka jendela terminal di lingkungan lokal Anda dan instal pustaka klien Foundry Tools Azure Document Intelligence untuk Python menggunakan pip:
pip install azure-ai-formrecognizer
Membuat aplikasi Python baru
Buat aplikasi Python baru yang disebut form_recognizer_quickstart.py di editor atau IDE pilihan Anda. Kemudian impor pustaka berikut:
import os
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential
Membuat variabel untuk titik akhir dan kunci sumber daya Azure Anda
endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"
Pada titik ini, aplikasi Python Anda harus berisi baris kode berikut:
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"
Pilih sampel kode untuk disalin dan ditempelkan ke aplikasi Anda:
Penting
Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihatKeamanan Foundry Tools.
Coba: Model tata letak
- Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
- Kami telah menambahkan nilai URI file ke variabel di
formUrldekat bagian atas file. - Untuk menganalisis file tertentu di URI, Anda akan menggunakan metode .
begin_recognize_content_from_url
Tambahkan kode berikut ke aplikasi tata letak Anda pada baris di bawah key variabel
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()
Coba: Model bawaan
Sampel ini menunjukkan cara menganalisis data dari jenis dokumen umum tertentu dengan model yang telah dilatih sebelumnya, menggunakan faktur sebagai contoh. Lihat halaman konsep bawaan kami untuk daftar lengkap bidang faktur
- Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
- Kami telah menambahkan nilai URI file ke variabel ''formUrl' di bagian atas file.
- Untuk menganalisis file tertentu pada sebuah URI, Anda akan menggunakan metode ``begin_recognize_invoices_from_url``.
- Untuk kesederhanaan, semua kolom yang dikembalikan oleh layanan tidak ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.
Pilih model bawaan
Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Berikut adalah model bawaan yang saat ini didukung oleh layanan Kecerdasan Dokumen:
- Faktur: mengekstrak teks, tanda pilihan, tabel, bidang, dan informasi utama dari faktur.
- Tanda terima: mengekstrak teks dan informasi kunci dari tanda terima.
- Dokumen ID: mengekstrak teks dan informasi utama dari SIM dan paspor internasional.
- Kartu nama: mengekstrak teks dan informasi utama dari kartu nama.
Tambahkan kode berikut ke aplikasi faktur bawaan Anda di key bawah variabel
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()
Jalankan aplikasi Anda
Navigasikan ke folder tempat Anda memiliki file form_recognizer_quickstart.py .
Ketik perintah berikut di terminal Anda:
python form_recognizer_quickstart.py
| Document Intelligence REST API | Referensi Azure REST API |
Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:
Prasyarat
langganan Azure - Buat langganan secara gratis
cURL terinstal.
PowerShell versi 6.0+, atau aplikasi baris perintah serupa.
Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau layanan multi di portal Azure untuk mendapatkan kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (
F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.Tips
Buat sumber daya foundry jika Anda berencana untuk mengakses beberapa Foundry Tools dengan satu kunci/titik akhir. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda berniat menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.
Pilih sampel kode untuk disalin dan ditempelkan ke aplikasi Anda:
Penting
Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihatKeamanan Foundry Tools.
Coba: Model tata letak
- Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
- Ganti
{endpoint}dengan titik akhir yang Anda peroleh melalui langganan Kecerdasan Dokumen. - Ganti
{key}dengan kunci yang Anda salin dari langkah sebelumnya. - Ganti
\"{your-document-url}dengan URL dokumen sampel:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Permintaan
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}'}"
Lokasi-Operasi
Anda menerima respons 202 (Success) yang menyertakan header Operation-Location. Nilai header ini berisi ID hasil yang bisa Anda gunakan untuk mengkueri status operasi asinkron dan mendapatkan hasilnya:
https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.
Dalam contoh berikut, sebagai bagian dari URL, string setelah analyzeResults/ adalah ID hasil.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Dapatkan hasil tata letak
Setelah memanggil Analyze Layout API, Anda memanggil Get Analyze Layout Result API untuk mendapatkan status operasi dan data yang diekstrak. Sebelum Anda menjalankan perintah, buat perubahan ini:
- Ganti
{endpoint}dengan titik akhir yang Anda peroleh dengan langganan Kecerdasan Dokumen Anda. - Ganti
{key}dengan kunci yang Anda salin dari langkah sebelumnya. - Ganti
{resultId}dengan ID hasil dari langkah sebelumnya.
Permintaan
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Memeriksa hasilnya
Anda menerima 200 (success) respons dengan konten JSON.
Lihat gambar faktur berikut dan output JSON yang sesuai.
- Simpul
"readResults"berisi setiap baris teks dengan letak kotak pembatas masing-masing di halaman. - Simpul
selectionMarksmenunjukkan setiap opsi pilihan (kotak centang, tanda radio) dan apakah statusnya adalahselectedatauunselected. - Bagian
"pageResults"ini mencakup tabel-tabel yang telah diekstrak. Untuk setiap tabel, indeks teks, baris, dan kolom, rentang baris dan kolom, kotak pembatas, dan lainnya diekstrak.
Isi respons
Anda dapat melihat output sampel full pada GitHub.
Coba: Model bawaan
- Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
Pilih model bawaan
Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Berikut adalah model bawaan yang saat ini didukung oleh layanan Kecerdasan Dokumen:
- Faktur: mengekstrak teks, tanda pilihan, tabel, bidang, dan informasi utama dari faktur.
- Tanda terima: mengekstrak teks dan informasi kunci dari tanda terima.
- Dokumen ID: mengekstrak teks dan informasi utama dari SIM dan paspor internasional.
- Kartu nama: mengekstrak teks dan informasi utama dari kartu nama.
Sebelum Anda menjalankan perintah, buat perubahan ini:
Ganti
{endpoint}dengan titik akhir yang Anda peroleh dengan langganan Kecerdasan Dokumen Anda.Ganti
{key}dengan kunci yang Anda salin dari langkah sebelumnya.Ganti
\"{your-document-url}dengan contoh URL faktur:https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf
Permintaan
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}'}"
Lokasi-Operasi
Anda menerima respons 202 (Success) yang menyertakan header Operation-Location. Nilai header ini berisi ID hasil yang bisa Anda gunakan untuk mengkueri status operasi asinkron dan mendapatkan hasilnya:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}
Dalam contoh berikut, sebagai bagian dari URL, string setelah analyzeResults/ adalah ID hasil:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Mendapatkan hasil faktur
Setelah memanggil Analyze Invoice API, Anda memanggil Get Analyze Invoice Result API untuk mendapatkan status operasi dan data yang diekstrak. Sebelum Anda menjalankan perintah, buat perubahan ini:
- Ganti
{endpoint}dengan titik akhir yang Anda peroleh dengan kunci Document Intelligence Anda. Anda dapat menemukannya di tab Gambaran Umum sumber daya Kecerdasan Dokumen Anda. - Ganti
{resultId}dengan ID hasil dari langkah sebelumnya. - Ganti
{key}dengan kunci Anda.
Permintaan
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Memeriksa respons
Anda menerima 200 (Success) respons dengan output JSON.
- Bidang
"readResults"berisi setiap baris teks yang diekstrak dari faktur. - menyertakan
"pageResults"tabel dan tanda pilihan yang diekstrak dari faktur. - Bidang
"documentResults"berisi informasi kunci/nilai untuk bagian faktur yang paling relevan.
Lihat dokumen faktur Sample.
Isi respons
Lihat output sampel lengkap di GitHub.
Itu saja, bagus!
Langkah berikutnya
Untuk pengalaman yang ditingkatkan dan kualitas model tingkat lanjut, coba Studio Kecerdasan Dokumen.
Studio mendukung model apa pun yang dilatih dengan data berlabel v2.1.
Changelog memberikan informasi terperinci tentang migrasi dari v3.1 ke v4.0.