Mulai menggunakan Kecerdasan Dokumen
Penting
- Azure Cognitive Services Form Recognizer sekarang menjadi Azure AI Document Intelligence.
- 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 (pratinjau) Versi sebelumnya:
v3.1 (GA)
v3.0 (GA)
- Mulai menggunakan Azure AI Document Intelligence versi pratinjau terbaru (pratinjau 2024-07-31).
Konten ini berlaku untuk: v3.1 (GA) Versi sebelumnya:
v3.0
v2.1
- Mulai menggunakan Azure Form Recognizer versi GA terbaru (
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 AI Document Intelligence/Form Recognizer adalah layanan Azure AI 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.
Untuk mulai cepat ini, sebaiknya gunakan layanan gratis saat Anda mempelajari teknologi ini. Ingatlah bahwa jumlah halaman gratis dibatasi hingga 500 per bulan.
Untuk mempelajari selengkapnya tentang fitur API dan opsi pengembangan, kunjungi halaman Gambaran Umum kami.
Referensi SDK | pustaka | klien REST API | sampel|paket| rest api yang didukung versi
Paket referensi API referensi | | SDK pustaka | klien (NuGet) | Sampel Versi REST API yang Didukung |
Referensi SDK | pustaka | klien REST API | sampel |paket | rest api yang didukung versi
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 formulir, tanpa harus melatih model.
Model bawaan—Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model bawaan sebelumnya.
Prasyarat
Langganan Azure - Buat langganan gratis.
Versi saat ini dariIDE Visual Studio.
Layanan Azure AI atau sumber daya Kecerdasan Dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya multi-layanan layanan tunggal atau Azure AI, di portal Azure, untuk mendapatkan kunci dan titik akhir Anda.
Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.
Tip
Buat sumber daya layanan Azure AI jika Anda berencana mengakses beberapa layanan Azure AI di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda disebarkan, pilih Buka 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 Anda ke dalam kode nanti di mulai cepat:
Layanan Azure AI atau sumber daya Form Recognizer. Setelah Anda memiliki langganan Azure, buat sumber daya multi-layanan layanan tunggal atau Azure AI, di portal Azure, untuk mendapatkan kunci dan titik akhir Anda.
Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.
Tip
Buat sumber daya layanan Azure AI jika Anda berencana mengakses beberapa layanan Azure AI di bawah satu titik akhir/kunci. Hanya untuk akses Form Recognizer, buat sumber daya Form Recognizer. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda disebarkan, pilih Buka sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke Form Recognizer API. Anda menempelkan kunci dan titik akhir Anda ke dalam kode nanti di mulai cepat:
Penyiapan
Mulai Visual Studio.
Dari halaman awal, pilih Buat proyek baru.
Pada halaman Buat proyek baru, masukkan konsol di kotak pencarian. Pilih templat Aplikasi Konsol, lalu pilih Berikutnya.
- Di jendela dialog Konfigurasikan proyek baru Anda, masukkan
doc_intel_quickstart
di kotak Nama proyek. Kemudian pilih Berikutnya.
- Di jendela dialog Konfigurasikan proyek baru Anda, masukkan
form_recognizer_quickstart
di kotak Nama proyek. Kemudian pilih Berikutnya.
Di jendela dialog Informasi tambahan, pilih .NET 8.0 (Dukungan jangka panjang), lalu pilih Buat.
Memasang pustaka klien dengan NuGet
Klik kanan pada proyek doc_intel_quickstart Anda dan pilih Kelola Paket NuGet... .
Pilih tab Telusuri dan ketik Azure.AI.DocumentIntelligence. Pilih kotak
Include prerelease
centang dan pilih versi 1.0.0-beta.1 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.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
Bangun 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 DocumentIntelligenceClient
instans dengan AzureKeyCredential
dan Kecerdasan endpoint
Dokumen Anda .
Untuk berinteraksi dengan layanan Form Recognizer, Anda perlu membuat instans DocumentAnalysisClient
kelas. Untuk melakukannya, Anda membuat AzureKeyCredential
dengan key
dari portal Azure dan DocumentAnalysisClient
instans dengan AzureKeyCredential
dan Form Recognizer endpoint
Anda .
Catatan
- Dimulai dengan .NET 6, proyek baru yang menggunakan templat
console
menghasilkan gaya program baru yang berbeda dari versi sebelumnya. - Output baru menggunakan fitur C# terbaru yang menyederhanakan kode yang perlu Anda tulis.
- Saat Anda menggunakan versi yang lebih baru, Anda hanya perlu menulis isi metode
Main
. Anda tidak perlu menyertakan pernyataan tingkat atas, global menggunakan direktif, atau implisit menggunakan direktif. - Untuk informasi selengkapnya, lihat Templat C# baru menghasilkan pernyataan tingkat atas.
Buka file Program.cs.
Hapus kode yang sudah ada sebelumnya, termasuk baris
Console.Writeline("Hello World!")
, dan pilih salah satu sampel kode berikut untuk disalin dan tempelkan ke file Program.cs aplikasi Anda:
Penting
Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat Keamanan 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 mulai cepat ini.
- Kami sudah menambahkan nilai URI file ke variabel
Uri fileUri
di bagian teratas skrip. - Untuk mengekstrak tata letak dari file yang diberikan pada URI, gunakan
StartAnalyzeDocumentFromUri
metode dan passprebuilt-layout
sebagai ID model. Nilai yang dikembalikan adalah objekAnalyzeResult
yang berisi data tentang dokumen yang dikirimkan.
Tambahkan sampel kode berikut ke file Program.cs. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Portal Azure Kecerdasan Dokumen 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 instans Form Recognizer portal Azure:
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding box is:");
Console.WriteLine($" Upper left => X: {line.BoundingPolygon[0].X}, Y= {line.BoundingPolygon[0].Y}");
Console.WriteLine($" Upper right => X: {line.BoundingPolygon[1].X}, Y= {line.BoundingPolygon[1].Y}");
Console.WriteLine($" Lower right => X: {line.BoundingPolygon[2].X}, Y= {line.BoundingPolygon[2].Y}");
Console.WriteLine($" Lower left => X: {line.BoundingPolygon[3].X}, Y= {line.BoundingPolygon[3].Y}");
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding box is:");
Console.WriteLine($" Upper left => X: {selectionMark.BoundingPolygon[0].X}, Y= {selectionMark.BoundingPolygon[0].Y}");
Console.WriteLine($" Upper right => X: {selectionMark.BoundingPolygon[1].X}, Y= {selectionMark.BoundingPolygon[1].Y}");
Console.WriteLine($" Lower right => X: {selectionMark.BoundingPolygon[2].X}, Y= {selectionMark.BoundingPolygon[2].Y}");
Console.WriteLine($" Lower left => X: {selectionMark.BoundingPolygon[3].X}, Y= {selectionMark.BoundingPolygon[3].Y}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
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 dari 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 di GitHub untuk melihat output model tata letak.
Tambahkan sampel kode berikut ke file Program.cs. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer portal Azure:
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < line.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.BoundingPolygon[j].X}, Y: {line.BoundingPolygon[j].Y}");
}
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < selectionMark.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.BoundingPolygon[j].X}, Y: {selectionMark.BoundingPolygon[j].Y}");
}
}
}
Console.WriteLine("Paragraphs:");
foreach (DocumentParagraph paragraph in result.Paragraphs)
{
Console.WriteLine($" Paragraph content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Extract the layout of a document from a file stream
To extract the layout from a given file at a file stream, use the AnalyzeDocument method and pass prebuilt-layout as the model ID. The returned value is an AnalyzeResult object containing data about the submitted document.
string filePath = "<filePath>";
using var stream = new FileStream(filePath, FileMode.Open);
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", stream);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < line.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.BoundingPolygon[j].X}, Y: {line.BoundingPolygon[j].Y}");
}
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < selectionMark.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.BoundingPolygon[j].X}, Y: {selectionMark.BoundingPolygon[j].Y}");
}
}
}
Console.WriteLine("Paragraphs:");
foreach (DocumentParagraph paragraph in result.Paragraphs)
{
Console.WriteLine($" Paragraph content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
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.
Tip
Anda tidak dibatasi untuk hanya memilih faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki kumpulan bidang dukungan sendiri. Model yang analyze
digunakan untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat ekstraksi data model.
- Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk mulai cepat ini.
- Kami telah menambahkan nilai URI file ke variabel
Uri invoiceUri
di bagian atas metode Utama. - Untuk menganalisis file tertentu di URI, gunakan metode
StartAnalyzeDocumentFromUri
dan passprebuilt-invoice
sebagai ID model. Nilai yang dikembalikan adalah objekAnalyzeResult
yang berisi data tentang dokumen yang dikirimkan. - Untuk kemudahan, semua pasangan kunci-nilai yang dikembalikan layanan tidak ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis yang sesuai, 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 Portal Azure Kecerdasan Dokumen 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.Type == DocumentFieldType.String)
{
string vendorName = vendorNameField.ValueString;
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField)
&& customerNameField.Type == DocumentFieldType.String)
{
string customerName = customerNameField.ValueString;
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
&& itemsField.Type == DocumentFieldType.Array)
{
foreach (DocumentField itemField in itemsField.ValueArray)
{
Console.WriteLine("Item:");
if (itemField.Type == DocumentFieldType.Object)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueObject;
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField)
&& itemDescriptionField.Type == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.ValueString;
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField)
&& itemAmountField.Type == DocumentFieldType.Currency)
{
CurrencyValue itemAmount = itemAmountField.ValueCurrency;
Console.WriteLine($" Amount: '{itemAmount.CurrencySymbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
}
}
}
}
if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField)
&& subTotalField.Type == DocumentFieldType.Currency)
{
CurrencyValue subTotal = subTotalField.ValueCurrency;
Console.WriteLine($"Sub Total: '{subTotal.CurrencySymbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
}
if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField)
&& totalTaxField.Type == DocumentFieldType.Currency)
{
CurrencyValue totalTax = totalTaxField.ValueCurrency;
Console.WriteLine($"Total Tax: '{totalTax.CurrencySymbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
}
if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField)
&& invoiceTotalField.Type == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
Console.WriteLine($"Invoice Total: '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
}
}
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 portal Azure:
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 dari 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 bawaan.
Tambahkan sampel kode berikut ke file Program.cs Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer portal Azure:
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.
Referensi SDK | pustaka | klien Paket referensi | REST API (Maven) | Sampel Versi REST API yang Didukung |
Referensi SDK | pustaka | klien Paket referensi | REST API (Maven) | Sampel Versi REST API yang Didukung|
Referensi SDK | pustaka | klien Paket referensi | REST API (Maven) | 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, baris, kata, dan tanda pilihan seperti tombol radio dan kotak centang dalam dokumen formulir, tanpa perlu melatih model.
Faktur Bawaan—Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model yang telah dilatih sebelumnya.
Prasyarat
Langganan Azure - Buat langganan gratis.
Versi terbaru dari Visual Studio Code atau IDE pilihan Anda. Lihat Java di Visual Studio Code.
Tip
- Visual Studio Code menawarkan Paket Pengkodean untuk Java untuk Windows dan macOS.v Paket pengkodean adalah bundel Visual Studio Code, Java Development Kit (JDK), dan kumpulan ekstensi yang disarankan oleh Microsoft. Paket Pengkodean juga dapat digunakan untuk memperbaiki lingkungan pengembangan yang ada.
- Jika Anda menggunakan Visual Studio Code dan Paket Pengkodean untuk Java, pasang ekstensi Gradle for Java.
Jika Anda tidak menggunakan Visual Studio Code, pastikan Anda memiliki hal berikut yang terinstal di lingkungan pengembangan Anda:
Java Development Kit (JDK) versi 8 atau yang lebih baru. Untuk informasi selengkapnya, lihat Microsoft Build of OpenJDK.
Gradle, versi 6.8 atau yang lebih baru.
Layanan Azure AI atau sumber daya Kecerdasan Dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau multi-layanan, di portal Azure, untuk mendapatkan kunci dan titik akhir Anda. Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.Tip
Buat sumber daya layanan Azure AI jika Anda berencana mengakses beberapa layanan Azure AI di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda disebarkan, pilih Buka 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:
Penyiapan
Buat 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-app
mkdir doc-intel-app; cd doc-intel-app
Jalankan perintah
gradle init
dari direktori yang berfungsi. 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 basic
Saat 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 && form-recognize-app
mkdir form-recognize-app; cd form-recognize-app
Jalankan perintah
gradle init
dari direktori yang berfungsi. 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 basic
Saat diminta untuk memilih DSL, pilih Kotlin.
Terima nama proyek default (form-recognize-app) dengan memilih Kembalikan atau Masukkan.
Memasang pustaka klien
Mulai cepat ini menggunakan pengelola dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk pengelola dependensi lain di Repositori Pusat Maven.
Buka file build.gradle.kts proyek di IDE Anda. Copay dan lewati kode berikut untuk menyertakan pustaka klien sebagai implementation
pernyataan, 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-beta.2'
}
Mulai cepat ini menggunakan pengelola dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk pengelola dependensi lain di Repositori Pusat Maven.
Buka file build.gradle.kts proyek di IDE Anda. Copay dan lewati 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'
}
Mulai cepat ini menggunakan pengelola dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk pengelola dependensi lain di Repositori Pusat Maven.
Buka file build.gradle.kts proyek di IDE Anda. Copay dan lewati 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.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 dan DocumentIntelligenceClient
instans dengan AzureKeyCredential
dan Kecerdasan endpoint
Dokumen Anda .
Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentAnalysisClient
kelas. Untuk melakukannya, Anda membuat AzureKeyCredential
dengan key
dari portal Azure dan DocumentAnalysisClient
instans dengan AzureKeyCredential
dan Kecerdasan endpoint
Dokumen Anda .
Dari direktori doc-intel-app, jalankan perintah berikut:
mkdir -p src/main/java
Anda membuat struktur direktori berikut:
Buka direktori
java
dan buat file bernamaDocIntelligence.java
.Tip
- Anda dapat membuat file baru menggunakan PowerShell.
- Buka jendela PowerShell di direktori proyek Anda dengan menahan tombol Shift dan klik kanan folder.
- Ketik perintah berikut DocIntelligence.java Item Baru.
Buka file
DocIntelligence.java
. Salin dan tempel salah satu sampel kode berikut ke dalam aplikasi Anda:
Buka direktori
java
dan buat file bernamaFormRecognizer.java
.Tip
- Anda dapat membuat file baru menggunakan PowerShell.
- Buka jendela PowerShell di direktori proyek Anda dengan menahan tombol Shift dan klik kanan folder.
- Ketik perintah berikut New-Item FormRecognizer.java.
Buka file
FormRecognizer.java
. Salin dan tempel salah satu sampel kode berikut ke dalam aplikasi Anda:
Penting
Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat Keamanan 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 mulai cepat ini.
- Untuk menganalisis file yang diberikan di URI, Anda akan menggunakan metode
beginAnalyzeDocumentFromUrl
dan meneruskanprebuilt-layout
sebagai id model. Nilai yang dikembalikan adalah objekAnalyzeResult
yang berisi data tentang dokumen yang dikirimkan. - Kami telah menambahkan nilai URI file ke variabel
documentUrl
di metode utama.
Tambahkan kode berikut ke file DocIntelligence.java
. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Portal Azure Kecerdasan Dokumen Anda:
import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
import com.azure.ai.documentintelligence.models.DocumentTable;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.util.List;
public class DocIntelligence {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-layout";
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
SyncPoller <AnalyzeResultOperation, AnalyzeResultOperation> analyzeLayoutPoller =
client.beginAnalyzeDocument(modelId,
null,
null,
null,
null,
null,
null,
new AnalyzeDocumentRequest().setUrlSource(documentUrl));
AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult().getAnalyzeResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line '%s' is within a bounding polygon %s.%n",
documentLine.getContent(),
documentLine.getPolygon()));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f.%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getState().toString(),
documentSelectionMark.getPolygon(),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
// styles
analyzeLayoutResult.getStyles().forEach(documentStyle -
> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
}
}
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 perintah
build
:gradle build
Jalankan aplikasi dengan perintah
run
:gradle run
Tambahkan kode berikut ke file FormRecognizer.java
. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Portal Azure Kecerdasan Dokumen 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.getBoundingPolygon().toString()));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is %s and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getState().toString(),
documentSelectionMark.getBoundingPolygon().toString(),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
}
// Utility function to get the bounding polygon coordinates
private static String getBoundingCoordinates(List < Point > boundingPolygon) {
return boundingPolygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
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 perintah
build
:gradle build
Jalankan aplikasi dengan perintah
run
:gradle run
Output model tata letak
Berikut adalah cuplikan dari 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 di GitHub untuk melihat output model tata letak.
Tambahkan kode berikut ke file FormRecognizer.java
. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Portal Azure Kecerdasan Dokumen 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.getBoundingPolygon())));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f.%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getSelectionMarkState().toString(),
getBoundingCoordinates(documentSelectionMark.getBoundingPolygon()),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
// styles
analyzeLayoutResult.getStyles().forEach(documentStyle -
> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
}
/**
* Utility function to get the bounding polygon coordinates.
*/
private static String getBoundingCoordinates(List < Point > boundingPolygon) {
return boundingPolygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
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 perintah
build
:gradle build
Jalankan aplikasi dengan perintah
run
: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.
Tip
Anda tidak dibatasi untuk hanya memilih faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki kumpulan bidang dukungan sendiri. Model yang analyze
digunakan untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat ekstraksi data model.
- Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk mulai cepat ini.
- Kami telah menambahkan nilai URL file ke variabel
invoiceUrl
di bagian atas file Anda. - Untuk menganalisis file yang diberikan di URI, Anda akan menggunakan metode
beginAnalyzeDocuments
dan meneruskanPrebuiltModels.Invoice
sebagai id model. Nilai yang dikembalikan adalah objekresult
yang berisi data tentang dokumen yang dikirimkan. - Untuk kemudahan, semua pasangan kunci-nilai yang dikembalikan layanan tidak ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis yang sesuai, lihat halaman konsep Faktur kami.
Tambahkan kode berikut ke file DocIntelligence.java
. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Portal Azure Kecerdasan Dokumen Anda:
import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
import com.azure.ai.documentintelligence.models.Document;
import com.azure.ai.documentintelligence.models.DocumentField;
import com.azure.ai.documentintelligence.models.DocumentFieldType;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
public class DocIntelligence {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// sample document
String modelId = "prebuilt-invoice";
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
public static void main(final String[] args) throws IOException {
// Instantiate a client that will be used to call the service.
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
SyncPoller<AnalyzeResultOperation, AnalyzeResultOperation > analyzeInvoicesPoller =
client.beginAnalyzeDocument(modelId,
null,
null,
null,
null,
null,
null,
new AnalyzeDocumentRequest().setUrlSource(invoiceUrl));
AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult().getAnalyzeResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
Document analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (customerNameField != null) {
if (DocumentFieldType.DATE == invoiceDateField.getType()) {
LocalDate invoiceDate = invoiceDateField.getValueDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.NUMBER == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueNumber();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
invoiceTotal, invoiceTotalField.getConfidence());
}
}
DocumentField invoiceItemsField = invoiceFields.get("Items");
if (invoiceItemsField != null) {
System.out.printf("Invoice Items: %n");
if (DocumentFieldType.ARRAY == invoiceItemsField.getType()) {
List < DocumentField > invoiceItems = invoiceItemsField.getValueArray();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.OBJECT == invoiceItem.getType())
.map(documentField -> documentField.getValueObject())
.forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
// See a full list of fields found on an invoice here:
// https://aka.ms/documentintelligence/invoicefields
if ("Description".equals(key)) {
if (DocumentFieldType.STRING == documentField.getType()) {
String name = documentField.getValueString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double quantity = documentField.getValueNumber();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double unitPrice = documentField.getValueNumber();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double productCode = documentField.getValueNumber();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
}
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 perintah
build
:gradle build
Jalankan aplikasi dengan perintah
run
:gradle run
Tambahkan kode berikut ke file FormRecognizer.java
. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Portal Azure Kecerdasan Dokumen 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 perintah
build
:gradle build
Jalankan aplikasi dengan perintah
run
:gradle run
Output model bawaan
Berikut adalah cuplikan dari 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 bawaan.
Tambahkan kode berikut ke file FormRecognizer.java
. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Portal Azure Kecerdasan Dokumen 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 perintah
build
:gradle build
Jalankan aplikasi dengan perintah
run
:gradle run
Referensi SDK | pustaka | klien Paket referensi | REST API (npm) | Sampel Versi REST API yang didukung |
Referensi SDK | pustaka | klien Paket referensi | REST API (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, baris, kata, dan tanda pilihan seperti tombol radio dan kotak centang dalam dokumen formulir, 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 gratis.
Versi terbaru dari Visual Studio Code atau IDE pilihan Anda. Untuk informasi selengkapnya, lihat Node.js di Visual Studio Code.
Versi terbaru
LTS
Node.js.Layanan Azure AI atau sumber daya Kecerdasan Dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau multi-layanan, di portal Azure, untuk mendapatkan kunci dan titik akhir Anda. Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.Tip
Buat sumber daya layanan Azure AI jika Anda berencana mengakses beberapa layanan Azure AI di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda disebarkan, pilih Buka 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 Anda ke dalam kode nanti di mulai cepat:
Penyiapan
Membuat aplikasi Node.Js Ekspres: Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat direktori baru untuk aplikasi Anda yang diberi nama
doc-intel-app
.mkdir doc-intel-app && cd doc-intel-app
Jalankan perintah
npm init
untuk menginisialisasi aplikasi dan merancang proyek Anda.npm init
Tentukan atribut proyek Anda menggunakan petunjuk yang disajikan di terminal.
- Atribut yang paling penting adalah nama, nomor versi, dan titik masuk.
- Sebaiknya simpan
index.js
untuk nama titik masuk. Deskripsi, perintah pengujian, repositori GitHub, kata kunci, penulis, dan informasi lisensi adalah atribut opsional—atribut tersebut dapat dilewati untuk proyek ini. - Terima saran dalam tanda kurung dengan memilih Kembali atau Masukkan.
- Setelah Anda menyelesaikan perintah,
package.json
file akan dibuat di direktori doc-intel-app Anda.
Memasang pustaka klien
ai-document-intelligence
dan paket npmazure/identity
:npm i @azure-rest/ai-document-intelligence@1.0.0-beta.2 @azure/core-auth
File aplikasi
package.json
Anda diperbarui dengan dependensi.
Memasang pustaka klien
ai-form-recognizer
dan paket npmazure/identity
:npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
- File aplikasi
package.json
Anda diperbarui dengan dependensi.
- File aplikasi
Memasang pustaka klien
ai-form-recognizer
dan paket npmazure/identity
:npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
Buat file bernama
index.js
dalam direktori aplikasi.Tip
- Anda dapat membuat file baru menggunakan PowerShell.
- Buka jendela PowerShell di direktori proyek Anda dengan menahan tombol Shift dan klik kanan folder.
- Ketik perintah berikut New-Item index.js.
Bangun 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 DocumentIntelligenceClient
instans dengan AzureKeyCredential
dan Kecerdasan endpoint
Dokumen Anda .
Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentAnalysisClient
kelas. Untuk melakukannya, Anda membuat AzureKeyCredential
dengan key
dari portal Azure dan DocumentAnalysisClient
instans dengan AzureKeyCredential
dan Form Recognizer endpoint
Anda .
index.js
Buka file di Visual Studio Code atau IDE favorit Anda. Salin dan tempel salah satu sampel kode berikut ke dalam aplikasi Anda:
Penting
Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat Keamanan 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 mulai cepat ini.
- Kami telah menambahkan nilai URL file ke variabel
formUrl
di bagian atas file.- Untuk menganalisis file tertentu dari URL, Anda akan menggunakan metode
beginAnalyzeDocuments
dan passprebuilt-layout
sebagai ID model.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
const { AzureKeyCredential } = require("@azure/core-auth");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
async function main() {
const client = DocumentIntelligence(endpoint, new AzureKeyCredential(key));
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-layout")
.post({
contentType: "application/json",
body: {
urlSource: formUrl
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = await getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const document = documents && documents[0];
if (!document) {
throw new Error("Expected at least one document in the result.");
}
console.log(
"Extracted document:",
document.docType,
`(confidence: ${document.confidence || "<undefined>"})`,
);
console.log("Fields:", document.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
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).
Jalankan perintah berikut, di terminal Anda:
node index.js
Tambahkan kode berikut ke file index.js
. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Portal Azure Kecerdasan Dokumen 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).
Jalankan perintah berikut, di terminal Anda:
node index.js
Output model tata letak
Berikut adalah cuplikan dari 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 di GitHub untuk melihat output model tata letak.
Model bawaan
Dalam contoh ini, kami menganalisis faktur menggunakan model faktur bawaan.
Tip
Anda tidak dibatasi untuk hanya memilih faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki kumpulan bidang dukungan sendiri. Model yang analyze
digunakan untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat ekstraksi data model.
- Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk mulai cepat ini.
- Kami telah menambahkan nilai URL file ke variabel
invoiceUrl
di bagian atas file Anda. - Untuk menganalisis file yang diberikan di URI, Anda akan menggunakan metode
beginAnalyzeDocuments
dan meneruskanPrebuiltModels.Invoice
sebagai id model. Nilai yang dikembalikan adalah objekresult
yang berisi data tentang dokumen yang dikirimkan. - Untuk kemudahan, semua pasangan kunci-nilai yang dikembalikan layanan tidak ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis yang sesuai, lihat halaman konsep Faktur kami.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
const { AzureKeyCredential } = require("@azure/core-auth");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
async function main() {
const client = DocumentIntelligence(endpoint, new AzureKeyCredential(key));
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
.post({
contentType: "application/json",
body: {
// The Document Intelligence service will access the URL to the invoice image and extract data from it
urlSource: invoiceUrl,
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = await getLongRunningPoller(client, initialResponse);
poller.onProgress((state) => console.log("Operation:", state.result, state.status));
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const result = documents && documents[0];
if (result) {
console.log(result.fields);
} else {
throw new Error("Expected at least one invoice in the result.");
}
console.log(
"Extracted invoice:",
document.docType,
`(confidence: ${document.confidence || "<undefined>"})`,
);
console.log("Fields:", document.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
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).
Jalankan 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).
Jalankan perintah berikut, di terminal Anda:
node index.js
Output model bawaan
Berikut adalah cuplikan dari 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 bawaan.
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](../../concept-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).
Jalankan perintah berikut, di terminal Anda:
node index.js
Referensi SDK | pustaka |klien Paket referensi | REST API (PyPi) | Sampel Versi REST API yang Didukung |
Referensi SDK | pustaka |klien Paket referensi | REST API (PyPi) | Sampel Versi REST API yang Didukung |
Referensi SDK | pustaka | klien Paket referensi | REST API (PyPi) | Sampel Versi REST API yang Didukung |
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 Bawaan—Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model yang telah dilatih sebelumnya.
Prasyarat
Langganan Azure - Buat langganan gratis.
Python 3.7 atau yang lebih baru.
- Penginstalan Python Anda harus menyertakan pip. Anda dapat memeriksa apakah pip terinstal dengan menjalankan
pip --version
pada baris perintah. Dapatkan pip dengan menginstal versi terbaru Python.
- Penginstalan Python Anda harus menyertakan pip. Anda dapat memeriksa apakah pip terinstal dengan menjalankan
Versi terbaru dari Visual Studio Code atau IDE pilihan Anda. Untuk informasi selengkapnya, lihat Memulai Python di Visual Studio Code.
Layanan Azure AI atau sumber daya Kecerdasan Dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau multi-layanan, di portal Azure, untuk mendapatkan kunci dan titik akhir Anda. Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.
Tip
Buat sumber daya layanan Azure AI jika Anda berencana mengakses beberapa layanan Azure AI di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda disebarkan, pilih Buka 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 Anda ke dalam kode nanti di mulai cepat:
Penyiapan
Buka jendela terminal di lingkungan lokal Anda dan instal pustaka klien Azure AI Document Intelligence untuk Python dengan pip:
pip install azure-ai-documentintelligence==1.0.0b2
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 DocumentIntelligenceClient
instans dengan AzureKeyCredential
dan Kecerdasan endpoint
Dokumen Anda .
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 DocumentAnalysisClient
instans dengan AzureKeyCredential
dan Kecerdasan endpoint
Dokumen Anda .
Buat file Python baru bernama 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 ditempel ke aplikasi Anda:
Penting
Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat Keamanan 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 mulai cepat ini.
- Kami telah menambahkan nilai URL file ke variabel
formUrl
dalam fungsianalyze_layout
.
Tambahkan sampel kode berikut ke aplikasi doc_intel_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Portal Azure Kecerdasan Dokumen 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:
Navigasi ke folder tempat Anda memiliki file doc_intel_quickstart.py .
Jalankan perintah berikut, di terminal Anda:
python doc_intel_quickstart.py
Untuk menganalisis file tertentu di URL, Anda akan menggunakan metode begin_analyze_document_from_url
dan meneruskan prebuilt-layout
sebagai Id model. Nilai yang ditampilkan adalah objek result
yang 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 portal Azure:
# 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:
Buka folder tempat Anda menyimpan file form_recognizer_quickstart.py.
Jalankan perintah berikut, di terminal Anda:
python form_recognizer_quickstart.py
Output model tata letak
Berikut adalah cuplikan dari 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 di GitHub untuk melihat output model tata letak.
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 portal Azure:
# 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:
Buka folder tempat Anda menyimpan file form_recognizer_quickstart.py.
Jalankan 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.
Tip
Anda tidak dibatasi untuk hanya memilih faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki kumpulan bidang dukungan sendiri. Model yang analyze
digunakan untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat ekstraksi data model.
- Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk mulai cepat ini.
- Kami telah menambahkan nilai URL file ke variabel
invoiceUrl
di bagian atas file Anda. - Untuk kemudahan, semua pasangan kunci-nilai yang dikembalikan layanan tidak ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis yang sesuai, 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 Portal Azure Kecerdasan Dokumen 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:
Navigasi ke folder tempat Anda memiliki file doc_intel_quickstart.py .
Jalankan perintah berikut, di terminal Anda:
python doc_intel_quickstart.py
Untuk menganalisis file yang diberikan di URI, Anda akan menggunakan metode begin_analyze_document_from_url
dan meneruskan prebuilt-invoice
sebagai id model. Nilai yang dikembalikan adalah objek result
yang 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 portal Azure:
# 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:
Buka folder tempat Anda menyimpan file form_recognizer_quickstart.py.
Jalankan perintah berikut, di terminal Anda:
python form_recognizer_quickstart.py
Output model bawaan
Berikut adalah cuplikan dari 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 bawaan.
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 portal Azure:
# 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:
Buka folder tempat Anda menyimpan file form_recognizer_quickstart.py.
Jalankan perintah berikut, di terminal Anda:
python form_recognizer_quickstart.py
Dalam mulai cepat ini, pelajari 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 curl telah 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 layanan Azure AI (multi-layanan). Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau multi-layanan, di portal Azure, untuk mendapatkan kunci dan titik akhir Anda. Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.
Tip
Buat sumber daya layanan Azure AI jika Anda berencana mengakses beberapa layanan Azure AI di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda disebarkan, pilih Buka 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 Anda ke dalam kode nanti di mulai cepat:
Menganalisis dokumen dan mendapatkan hasil
Permintaan POST digunakan untuk menganalisis dokumen dengan model bawaan ataupun kustom. Permintaan GET digunakan untuk mengambil hasil panggilan dari analisis dokumen. modelId
digunakan bersama POST dan resultId
dengan operasi GET.
Menganalisis dokumen (POST Request)
Sebelum Anda menjalankan perintah cURL, buat perubahan berikut pada permintaan posting:
Ganti
{endpoint}
dengan nilai titik akhir dari instans Portal Azure Kecerdasan Dokumen Anda.Ganti
{key}
dengan nilai kunci dari instans Portal Azure Kecerdasan Dokumen 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} | {url-dokumen-Anda} |
---|---|---|
Baca | baca bawaan | 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 | Faktur Bawaan | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Kwitansi | tanda terima bawaan | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Dokumen ID | 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} | {url-dokumen-Anda} |
---|---|---|
Dokumen Umum | dokumen-bawaan | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf |
Baca | baca bawaan | 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 | Faktur Bawaan | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Kwitansi | tanda terima bawaan | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Dokumen ID | 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
Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat Keamanan layanan Azure AI.
Permintaan POST
curl -v -i POST "{endpoint}/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-02-29-preview" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelID}:analyze?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelId}:analyze?api-version=2022-08-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
Respons POST (resultID)
Anda menerima 202 (Success)
respons yang menyertakan header Lokasi Operasi baca-saja. 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:
Dapatkan hasil analisis (GET Request)
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-02-29-preview" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2023-07-31" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2022-08-31" -H "Ocp-Apim-Subscription-Key: {key}"
Periksa responsnya
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 di antara panggilan.
Respons sampel untuk faktur bawaan
{
"status": "succeeded",
"createdDateTime": "2024-03-25T19:31:37Z",
"lastUpdatedDateTime": "2024-03-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2024-02-29-preview",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
{
"status": "succeeded",
"createdDateTime": "2023-08-25T19:31:37Z",
"lastUpdatedDateTime": "2023-08-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2023-07-31",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
{
"status": "succeeded",
"createdDateTime": "2022-09-25T19:31:37Z",
"lastUpdatedDateTime": "2022-09-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2022-08-31",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
Format 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 diekstraksi.
Itu saja, selamat!
Dalam mulai cepat 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 (pratinjau)
Mulai menggunakan Azure AI Document Intelligence menggunakan bahasa pemrograman pilihan Anda atau REST API. Kecerdasan Dokumen adalah layanan Azure AI berbasis cloud yang menggunakan pembelajaran mesin untuk mengekstrak pasangan kunci-nilai, teks, dan tabel dari dokumen Anda. Kami sarankan agar Anda menggunakan layanan gratis saat mempelajari teknologi ini. 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) | Sampel
Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:
Prasyarat
Langganan Azure - Buat langganan gratis.
Versi saat ini dariIDE Visual Studio.
Layanan Azure AI atau sumber daya Kecerdasan Dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau multi-layanan di portal Azure untuk mendapatkan kunci dan titik akhir Anda. Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.Tip
Buat sumber daya layanan Azure AI jika Anda berencana mengakses beberapa layanan Azure AI di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda disebarkan, pilih Buka 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 Anda ke dalam kode nanti di mulai cepat:
Penyiapan
Mulai Visual Studio 2019.
Dari halaman awal, pilih Buat proyek baru.
Pada halaman Buat proyek baru, masukkan konsol di kotak pencarian. Pilih templat Aplikasi Konsol, lalu pilih Berikutnya.
Di jendela dialog Konfigurasikan proyek baru Anda, masukkan
formRecognizer_quickstart
di kotak Nama proyek. Kemudian pilih Berikutnya.Di jendela dialog Informasi tambahan, pilih .NET 5.0 (Saat Ini), lalu pilih Buat.
Memasang pustaka klien dengan NuGet
Klik kanan proyek formRecognizer_quickstart Anda dan pilih Kelola Paket NuGet....
Pilih tab Telusuri dan ketik Azure.AI.FormRecognizer.
Pilih versi 3.1.1-beta.1 dari menu geser turun lalu pilih Instal.
Bangun aplikasi Anda
Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans FormRecognizerClient
kelas. Untuk melakukannya, Anda membuat AzureKeyCredential
dengan kunci dan FormRecognizerClient
instans dengan AzureKeyCredential
dan Kecerdasan endpoint
Dokumen Anda .
Catatan
- Dimulai dengan .NET 6, proyek baru yang menggunakan templat
console
menghasilkan gaya program baru yang berbeda dari versi sebelumnya. - Output baru menggunakan fitur C# terbaru yang menyederhanakan kode yang perlu Anda tulis.
- Saat Anda menggunakan versi yang lebih baru, Anda hanya perlu menulis isi metode
Main
. Anda tidak perlu menyertakan pernyataan tingkat atas, global menggunakan direktif, atau implisit menggunakan direktif. - Untuk informasi selengkapnya, lihat Templat C# baru menghasilkan pernyataan tingkat atas.
Buka file Program.cs.
Tambahkan hal berikut menggunakan instruksi:
using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
- Atur variabel lingkungan
endpoint
dankey
Anda dan buat instansAzureKeyCredential
danFormRecognizerClient
Anda:
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("Hello World!");
, dan tambahkan salah satu kode sampel Try It ke dalam file Program.cs:Pilih sampel kode untuk disalin dan ditempelkan ke aplikasi Utama Anda:
Penting
Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat artikel keamanan layanan Azure AI.
Try it: Model tata letak
Ekstrak teks, tanda pilihan, gaya teks, dan struktur tabel, beserta koordinat wilayah pembatasnya dari dokumen.
- Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk mulai cepat ini.
- Kami telah menambahkan nilai URI file ke
formUri
variabel. - Untuk mengekstrak tata letak dari file yang diberikan pada 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}'.");
}
}
}
}
}
}
Cobalah: Model prabangun
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 prabangun. Anda dapat menggunakan dokumen faktur sampel kami untuk mulai cepat ini.
- Kami telah menambahkan nilai URI file ke variabel
invoiceUri
di bagian atas metode Utama. - Untuk menganalisis file tertentu di URI, gunakan metode
StartRecognizeInvoicesFromUriAsync
. - Untuk kemudahan, semua bidang yang dikembalikan layanan tidak ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis yang sesuai, lihat halaman konsep Faktur kami.
Pilih model prabangun
Anda tidak dibatasi untuk hanya memilih faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki kumpulan bidang dukungan sendiri. Model yang digunakan untuk operasi analisis bergantung 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 penting dari faktur.
- Kuitansi: mengekstrak teks dan informasi penting dari kuitansi.
- Dokumen ID: mengekstrak teks dan informasi penting dari SIM dan paspor internasional.
- Kartu nama: mengekstrak teks dan informasi penting dari kartu nama.
Tambahkan kode berikut ke 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 | Paket (Maven) | Sampel
Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:
Prasyarat
Langganan Azure - Buat langganan gratis.
Java Development Kit (JDK) versi 8 atau yang lebih baru. Untuk informasi selengkapnya, lihat Versi Java yang didukung dan jadwal pembaruan.
Layanan Azure AI atau sumber daya Kecerdasan Dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau multi-layanan di portal Azure untuk mendapatkan kunci dan titik akhir Anda. Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.Setelah sumber daya Anda disebarkan, pilih Buka 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 Anda ke dalam kode nanti di mulai cepat:
Penyiapan
Buat proyek Gradle baru
Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat direktori baru untuk aplikasi baru Anda yang disebutform-recognizer-app, dan buka direktori tersebut.
mkdir form-recognizer-app && form-recognizer-app
Jalankan perintah
gradle init
dari direktori yang berfungsi. 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 basic
Saat diminta untuk memilih DSL, pilih Kotlin.
Menerima nama proyek default (form-recognizer-app)
Memasang pustaka klien
Mulai cepat ini menggunakan pengelola dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk pengelola dependensi lain di Repositori Pusat Maven.
Di file build.gradle.kts proyek Anda, sertakan pustaka klien sebagai pernyataan implementation
, 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, jalankan perintah berikut:
mkdir -p src/main/java
Anda membuat struktur direktori berikut:
Buka direktori Java dan buat file bernama FormRecognizer.java. Buka di editor atau IDE pilihan Anda dan tambahkan deklarasi paket dan pernyataan import
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
Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat Keamanan layanan Azure AI.
Try it: Model tata letak
Ekstrak teks, tanda pilihan, gaya teks, dan struktur tabel, beserta koordinat wilayah pembatasnya dari dokumen.
- Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk mulai cepat ini.
- Untuk menganalisis file tertentu di URI, Anda akan menggunakan metode
beginRecognizeContentFromUrl
. - Kami telah menambahkan nilai URI file ke variabel
formUrl
di metode utama.
Perbarui kelas FormRecognizer aplikasi Anda, dengan kode berikut (pastikan untuk memperbarui variabel kunci dan titik akhir dengan nilai dari instans Portal Azure Kecerdasan Dokumen 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();
});
});
}
Cobalah: Model prabangun
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 prabangun. Anda dapat menggunakan dokumen faktur sampel kami untuk mulai cepat ini.
- Untuk menganalisis file tertentu di URI, Anda akan menggunakan
beginRecognizeInvoicesFromUrl
. - Kami telah menambahkan nilai URI file ke variabel
invoiceUrl
di metode utama. - Untuk kemudahan, semua bidang yang dikembalikan layanan tidak ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis yang sesuai, lihat halaman konsep Faktur kami.
Pilih model prabangun
Anda tidak dibatasi untuk hanya memilih faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki kumpulan bidang dukungan sendiri. Model yang digunakan untuk operasi analisis bergantung 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 penting dari faktur.
- Kuitansi: mengekstrak teks dan informasi penting dari kuitansi.
- Dokumen ID: mengekstrak teks dan informasi penting dari SIM dan paspor internasional.
- Kartu nama: mengekstrak teks dan informasi penting dari kartu nama.
Perbarui kelas FormRecognizer aplikasi Anda, dengan kode berikut (pastikan untuk memperbarui variabel kunci dan titik akhir dengan nilai dari instans Portal Azure Kecerdasan Dokumen 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
Buka kembali direktori proyek utama Anda —form-recognizer-app.
- Bangun aplikasi Anda dengan perintah
build
:
gradle build
- Jalankan aplikasi dengan perintah
run
:
gradle run
Dokumentasi referensi | Kode sumber pustaka | Paket (npm) | Sampel
Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:
Prasyarat
Langganan Azure - Buat langganan gratis.
Versi terbaru dari Visual Studio Code atau IDE pilihan Anda.
Versi LTS terbaru dari Node.js
Layanan Azure AI atau sumber daya Kecerdasan Dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau multi-layanan di portal Azure untuk mendapatkan kunci dan titik akhir Anda. Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.Tip
Buat sumber daya layanan Azure AI jika Anda berencana mengakses beberapa layanan Azure AI di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda disebarkan, pilih Buka 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 Anda ke dalam kode nanti di mulai cepat:
Penyiapan
Buat aplikasi Node.js baru. Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat direktori baru untuk aplikasi Anda, dan buka direktori tersebut.
mkdir form-recognizer-app && cd form-recognizer-app
Jalankan perintah
npm init
untuk membuat aplikasi node dengan filepackage.json
.npm init
Menginstal paket npm pustaka klien
ai-form-recognizer
:npm install @azure/ai-form-recognizer
File aplikasi
package.json
Anda diperbarui dengan dependensi.Buat file bernama
index.js
, buka, dan impor pustaka berikut ini:const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
Buat variabel untuk titik akhir dan kunci Azure dari sumber daya Anda:
const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE"; const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
Pada titik ini, aplikasi Python 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
Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat Keamanan layanan Azure AI.
Try it: Model tata letak
- Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk mulai cepat ini.
- Kami sudah menambahkan nilai URI file ke variabel
formUrl
di dekat 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 variabel key
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
async function recognizeContent() {
const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginRecognizeContentFromUrl(formUrl);
const pages = await poller.pollUntilDone();
if (!pages || pages.length === 0) {
throw new Error("Expecting non-empty list of pages!");
}
for (const page of pages) {
console.log(
`Page ${page.pageNumber}: width ${page.width} and height ${page.height} with unit ${page.unit}`
);
for (const table of page.tables) {
for (const cell of table.cells) {
console.log(`cell [${cell.rowIndex},${cell.columnIndex}] has text ${cell.text}`);
}
}
}
}
recognizeContent().catch((err) => {
console.error("The sample encountered an error:", err);
});
Cobalah: Model prabangun
Sampel ini menunjukkan cara menganalisis data dari jenis dokumen umum tertentu dengan model yang telah dilatih sebelumnya, menggunakan faktur sebagai contoh. Lihat halaman konsep prabangun kami untuk daftar lengkap bidang faktur
- Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model prabangun. Anda dapat menggunakan dokumen faktur sampel kami untuk mulai cepat ini.
- Kami sudah menambahkan nilai URI file ke variabel
invoiceUrl
di dekat bagian atas file Anda. - Untuk menganalisis file tertentu di URI, Anda akan menggunakan metode
beginRecognizeInvoices
. - Untuk kemudahan, semua bidang yang dikembalikan layanan tidak ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis yang sesuai, lihat halaman konsep Faktur kami.
Pilih model prabangun
Anda tidak dibatasi untuk hanya memilih faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki kumpulan bidang dukungan sendiri. Model yang digunakan untuk operasi analisis bergantung 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 penting dari faktur.
- Kuitansi: mengekstrak teks dan informasi penting dari kuitansi.
- Dokumen ID: mengekstrak teks dan informasi penting dari SIM dan paspor internasional.
- Kartu nama: mengekstrak teks dan informasi penting dari kartu nama.
Tambahkan kode berikut ke aplikasi faktur bawaan Anda di bawah variabel key
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) | Sampel
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 pip terinstal dengan menjalankan
pip --version
pada baris perintah. Dapatkan pip dengan menginstal versi terbaru Python.
- Penginstalan Python Anda harus menyertakan pip. Anda dapat memeriksa apakah pip terinstal dengan menjalankan
Layanan Azure AI atau sumber daya Kecerdasan Dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau multi-layanan di portal Azure untuk mendapatkan kunci dan titik akhir Anda. Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.Tip
Buat sumber daya layanan Azure AI jika Anda berencana mengakses beberapa layanan Azure AI di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda disebarkan, pilih Buka 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 Anda ke dalam kode nanti di mulai cepat:
Penyiapan
Buka jendela terminal di lingkungan lokal Anda dan instal pustaka klien Azure AI Document Intelligence untuk Python dengan pip:
pip install azure-ai-formrecognizer
Membuat aplikasi Python baru
Buat aplikasi Python baru bernama 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
Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat Keamanan layanan Azure AI.
Try it: Model tata letak
- Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk mulai cepat ini.
- Kami sudah menambahkan nilai URI file ke variabel
formUrl
di dekat 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 variabel key
def format_bounding_box(bounding_box):
if not bounding_box:
return "N/A"
return ", ".join(["[{}, {}]".format(p.x, p.y) for p in bounding_box])
def recognize_content():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = form_recognizer_client.begin_recognize_content_from_url(formUrl)
form_pages = poller.result()
for idx, content in enumerate(form_pages):
print(
"Page has width: {} and height: {}, measured with unit: {}".format(
content.width, content.height, content.unit
)
)
for table_idx, table in enumerate(content.tables):
print(
"Table # {} has {} rows and {} columns".format(
table_idx, table.row_count, table.column_count
)
)
print(
"Table # {} location on page: {}".format(
table_idx, format_bounding_box(table.bounding_box)
)
)
for cell in table.cells:
print(
"...Cell[{}][{}] has text '{}' within bounding box '{}'".format(
cell.row_index,
cell.column_index,
cell.text,
format_bounding_box(cell.bounding_box),
)
)
for line_idx, line in enumerate(content.lines):
print(
"Line # {} has word count '{}' and text '{}' within bounding box '{}'".format(
line_idx,
len(line.words),
line.text,
format_bounding_box(line.bounding_box),
)
)
if line.appearance:
if (
line.appearance.style_name == "handwriting"
and line.appearance.style_confidence > 0.8
):
print(
"Text line '{}' is handwritten and might be a signature.".format(
line.text
)
)
for word in line.words:
print(
"...Word '{}' has a confidence of {}".format(
word.text, word.confidence
)
)
for selection_mark in content.selection_marks:
print(
"Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
selection_mark.state,
format_bounding_box(selection_mark.bounding_box),
selection_mark.confidence,
)
)
print("----------------------------------------")
if __name__ == "__main__":
recognize_content()
Cobalah: Model prabangun
Sampel ini menunjukkan cara menganalisis data dari jenis dokumen umum tertentu dengan model yang telah dilatih sebelumnya, menggunakan faktur sebagai contoh. Lihat halaman konsep prabangun kami untuk daftar lengkap bidang faktur
- Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model prabangun. Anda dapat menggunakan dokumen faktur sampel kami untuk mulai cepat ini.
- Kami sudah menambahkan nilai URI file ke variabel di dekat bagian atas file.
- Untuk menganalisis file yang diberikan di URI, Anda akan menggunakan metode ''begin_recognize_invoices_from_url'.
- Untuk kemudahan, semua bidang yang dikembalikan layanan tidak ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis yang sesuai, lihat halaman konsep Faktur kami.
Pilih model prabangun
Anda tidak dibatasi untuk hanya memilih faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki kumpulan bidang dukungan sendiri. Model yang digunakan untuk operasi analisis bergantung 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 penting dari faktur.
- Kuitansi: mengekstrak teks dan informasi penting dari kuitansi.
- Dokumen ID: mengekstrak teks dan informasi penting dari SIM dan paspor internasional.
- Kartu nama: mengekstrak teks dan informasi penting dari kartu nama.
Tambahkan kode berikut ke aplikasi faktur bawaan Anda di bawah variabel key
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
Buka folder tempat Anda menyimpan file form_recognizer_quickstart.py.
Jalankan perintah berikut, di terminal Anda:
python form_recognizer_quickstart.py
| Referensi REST API Azure REST API | Kecerdasan Dokumen |
Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:
Prasyarat
Langganan Azure - Buat langganan secara gratis
cURL diinstal.
PowerShell versi 6.0+, atau aplikasi baris perintah serupa.
Layanan Azure AI atau sumber daya Kecerdasan Dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau multi-layanan di portal Azure untuk mendapatkan kunci dan titik akhir Anda. Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.Tip
Buat sumber daya layanan Azure AI jika Anda berencana mengakses beberapa layanan Azure AI di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.
Setelah sumber daya Anda disebarkan, pilih Buka 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 Anda ke dalam kode nanti di mulai cepat:
Pilih sampel kode untuk disalin dan ditempelkan ke aplikasi Anda:
Penting
Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat Keamanan layanan Azure AI.
Try it: Model tata letak
- Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk mulai cepat 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 URL dokumen sampel:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Minta
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}'}"
Operasi-Lokasi
Anda menerima 202 (Success)
respons yang menyertakan header Operation-Location . Nilai header ini berisi ID hasil yang dapat Anda gunakan untuk menanyakan status operasi asinkron dan mendapatkan hasilnya:
https://cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.
Dalam contoh berikut, sebagai bagian dari URL, untai setelah analyzeResults/
adalah ID hasil.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Mendapatkan hasil tata letak
Setelah Anda memanggil Analyze Layout API, Anda memanggil Get Analyze Layout Result API untuk mendapatkan status operasi dan data yang diekstraksi. 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.
Minta
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Periksa hasilnya
Anda menerima 200 (success)
respons dengan konten JSON.
Lihat gambar faktur berikut dan output JSON yang sesuai.
- Node
"readResults"
berisi setiap baris teks dengan penempatan kotak pembatasnya masing-masing pada halaman. - Simpul
selectionMarks
menunjukkan setiap tanda pilihan (kotak centang, tanda radio) dan apakah statusnyaselected
atauunselected
. - Bagian
"pageResults"
ini mencakup tabel yang diekstrak. Rentang baris dan kolom, kotak pembatas, dan lainnya diekstrak untuk setiap tabel, teks, baris, dan indeks kolom.
Isi respons
Anda dapat melihat output sampel lengkap di GitHub.
Cobalah: Model prabangun
- Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model prabangun. Anda dapat menggunakan dokumen faktur sampel kami untuk mulai cepat ini.
Pilih model prabangun
Anda tidak dibatasi untuk hanya memilih faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki kumpulan bidang dukungan sendiri. Model yang digunakan untuk operasi analisis bergantung 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 penting dari faktur.
- Kuitansi: mengekstrak teks dan informasi penting dari kuitansi.
- Dokumen ID: mengekstrak teks dan informasi penting dari SIM dan paspor internasional.
- Kartu nama: mengekstrak teks dan informasi penting 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
Minta
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}'}"
Operasi-Lokasi
Anda menerima 202 (Success)
respons yang menyertakan header Operation-Location . Nilai header ini berisi ID hasil yang dapat Anda gunakan untuk menanyakan status operasi asinkron dan mendapatkan hasilnya:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}
Dalam contoh berikut, sebagai bagian dari URL, untai setelah analyzeResults/
adalah ID hasil:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Mendapatkan hasil faktur
Setelah Anda memanggil API Analyze Invoice, Anda memanggil API Get Analyze Invoice Result 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 Kecerdasan Dokumen 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.
Minta
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Periksa responsnya
Anda menerima 200 (Success)
respons dengan output JSON.
- Bidang
"readResults"
berisi setiap baris teks yang diambil dari faktur. "pageResults"
menyertakan tabel dan tanda pilihan yang diambil dari faktur.- Bidang
"documentResults"
berisi informasi kunci/nilai untuk bagian faktur yang paling relevan.
Lihat dokumen Faktur sampel.
Isi respons
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.