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:tanda centangv4.0 (pratinjau)Versi sebelumnya:tanda centang biruv3.1 (GA)tanda centang biruv3.0 (GA)

  • Mulai menggunakan versi pratinjau terbaru Azure AI Document Intelligence (pratinjau 2024-02-29).

Konten ini berlaku untuk:tanda centangv3.1 (GA)Versi sebelumnya:tanda centang biruv3.0tanda centang biruv2.1

  • Mulai menggunakan Azure Form Recognizer versi GA terbaru (2023-07-31).

Konten ini berlaku untuk:tanda centangv3.0 (GA)Versi yang lebih baru:tanda centang biruv3.1tanda centang biruv2.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

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

  • 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:

    Cuplikan layar di titik akhir di portal Azure.

  • 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:

    Cuplikan layar di titik akhir di portal Azure.

Penyiapan

  1. Mulai Visual Studio.

  2. Dari halaman awal, pilih Buat proyek baru.

    Cuplikan layar jendela mulai Visual Studio.

  3. Pada halaman Buat proyek baru, masukkan konsol di kotak pencarian. Pilih templat Aplikasi Konsol, lalu pilih Berikutnya.

    Cuplikan layar halaman buat proyek baru Visual Studio.

  1. Di jendela dialog Konfigurasikan proyek baru Anda, masukkan doc_intel_quickstart di kotak Nama proyek. Kemudian pilih Berikutnya.
  1. Di jendela dialog Konfigurasikan proyek baru Anda, masukkan form_recognizer_quickstart di kotak Nama proyek. Kemudian pilih Berikutnya.
  1. Di jendela dialog Informasi tambahan, pilih .NET 6.0 (Dukungan jangka panjang), lalu pilih Buat.

    Cuplikan layar jendela dialog informasi tambahan Visual Studio.

Memasang pustaka klien dengan NuGet

  1. Klik kanan pada proyek doc_intel_quickstart Anda dan pilih Kelola Paket NuGet... .

    Cuplikan layar pilih jendela paket prarilis NuGet di Visual Studio.

  2. Pilih tab Telusuri dan ketik Azure.AI.DocumentIntelligence. Pilih kotak Include prerelease centang dan pilih versi 1.0.0-beta.1 dari menu dropdown

    Cuplikan layar pilih paket NuGet prarilis Kecerdasan Dokumen di Visual Studio.

  1. Klik kanan pada proyek form_recognizer_quickstart Anda dan pilih Kelola Paket NuGet... .

    Cuplikan layar jendela temukan paket NuGet di Visual Studio.

  2. Pilih tab Telusuri dan ketik Azure.AI.FormRecognizer. Pilih versi 4.1.0 dari menu dropdown

    Cuplikan layar pilih paket NuGet Form Recognizer di Visual Studio.

  1. Klik kanan pada proyek form_recognizer_quickstart Anda dan pilih Kelola Paket NuGet... .

    Cuplikan layar jendela paket NuGet di Visual Studio.

  2. Pilih tab Telusuri dan ketik Azure.AI.FormRecognizer. Pilih versi 4.0.0 dari menu dropdown

    Cuplikan layar pilih paket warisan NuGet di Visual Studio.

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 endpointDokumen 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 endpointAnda .

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, lihattemplat C# Baru menghasilkan pernyataan tingkat atas.
  1. Buka file Program.cs.

  2. 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 pass prebuilt-layout sebagai ID model. Nilai yang dikembalikan adalah objek AnalyzeResult 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");

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(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)," +
        $" 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.

Cuplikan layar tombol jalankan program Visual Studio Anda.

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.

Cuplikan layar jalankan lokasi tombol program Visual Studio Anda.

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.

Cuplikan layar menjalankan program Visual Studio Anda.

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 pass prebuilt-invoice sebagai ID model. Nilai yang dikembalikan adalah objek AnalyzeResult 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");

Operation<AnalyzeResult> 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)
        && 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.

Cuplikan layar tombol jalankan program Visual Studio Anda.

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.

Cuplikan layar jalankan lokasi tombol program Visual Studio Anda.

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.

Cuplikan layar menjalankan program Visual Studio Anda.

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. LihatJava 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:

  • 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:

    Cuplikan layar di titik akhir di portal Azure.

Penyiapan

Buat proyek Gradle baru

  1. 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
    
  2. 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
    
  3. Saat diminta untuk memilih DSL, pilih Kotlin.

  4. Terima nama proyek default (doc-intel-app) dengan memilih Kembalikan atau Masukkan.

  1. 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
    
  2. 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
    
  3. Saat diminta untuk memilih DSL, pilih Kotlin.

  4. 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 endpointDokumen 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 endpointDokumen Anda .

  1. Dari direktori doc-intel-app, jalankan perintah berikut:

    mkdir -p src/main/java
    

    Anda membuat struktur direktori berikut:

    Cuplikan layar struktur direktori Java

  1. Buka direktori java dan buat file bernama DocIntelligence.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.
  2. Buka file DocIntelligence.java. Salin dan tempel salah satu sampel kode berikut ke dalam aplikasi Anda:

  1. Buka direktori java dan buat file bernama FormRecognizer.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.
  2. 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 meneruskan prebuilt-layout sebagai id model. Nilai yang dikembalikan adalah objek AnalyzeResult 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;

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 `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
      .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 <AnalyzeResultOperation, AnalyzeResultOperation> analyzeLayoutResultPoller =
      client.beginAnalyzeDocument(modelId, 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.

  1. Bangun aplikasi Anda dengan perintah build:

    gradle build
    
  2. 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.*;

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.

  1. Bangun aplikasi Anda dengan perintah build:

    gradle build
    
  2. 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;

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.

  1. Bangun aplikasi Anda dengan perintah build:

    gradle build
    
  2. 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 meneruskan PrebuiltModels.Invoice sebagai id model. Nilai yang dikembalikan adalah objek result 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;

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) {

    // create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
      .credential(new AzureKeyCredential(key))
      .endpoint(endpoint)
      .buildClient();

    // sample document
    String modelId = "prebuilt-invoice";
    String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

    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("https://{endpoint}.cognitiveservices.azure.com/")
        .buildClient();

      SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
        client.beginAnalyzeDocument(modelId, 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.

  1. Bangun aplikasi Anda dengan perintah build:

    gradle build
    
  2. 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.*;

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.

  1. Bangun aplikasi Anda dengan perintah build:

    gradle build
    
  2. 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;

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.

  1. Bangun aplikasi Anda dengan perintah build:

    gradle build
    
  2. Jalankan aplikasi dengan perintah run:

    gradle run
    

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, lihatNode.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:

    Cuplikan layar di titik akhir di portal Azure.

Penyiapan

  1. 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
    
  2. Jalankan perintah npm init untuk menginisialisasi aplikasi dan merancang proyek Anda.

    npm init
    
  3. 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.
  1. Memasang pustaka klien ai-document-intelligence dan paket npm azure/identity:

    npm i @azure-rest/ai-document-intelligence@1.0.0-beta.2 @azure/identity
    
    

    File aplikasi package.json Anda diperbarui dengan dependensi.

  1. Memasang pustaka klien ai-form-recognizer dan paket npm azure/identity:

    npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
    
    • File aplikasi package.json Anda diperbarui dengan dependensi.
  1. Memasang pustaka klien ai-form-recognizer dan paket npm azure/identity:

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. 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 endpointDokumen 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 endpointAnda .

  1. 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 pass prebuilt-layout sebagai ID model.
    const { DocumentIntelligenceClient } = 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 = DocumentIntelligenceClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginAnalyzeDocument("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:

  1. Navigasi ke folder tempat Anda memiliki aplikasi Kecerdasan Dokumen (doc-intel-app).

  2. 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:

  1. Navigasi ke folder tempat Anda memiliki aplikasi Kecerdasan Dokumen (doc-intel-app).

  2. 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 meneruskan PrebuiltModels.Invoice sebagai id model. Nilai yang dikembalikan adalah objek result 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 { DocumentIntelligenceClient } = 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
    invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

async function main() {
    const client = DocumentIntelligenceClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginAnalyzeDocument("prebuilt-invoice", invoiceUrl);
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:

  1. Navigasi ke folder tempat Anda memiliki aplikasi Kecerdasan Dokumen (doc-intel-app).

  2. 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:

  1. Navigasi ke folder tempat Anda memiliki aplikasi Kecerdasan Dokumen (doc-intel-app).

  2. 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:

  1. Navigasi ke folder tempat Anda memiliki aplikasi Kecerdasan Dokumen (doc-intel-app).

  2. Jalankan perintah berikut, di terminal Anda:

    node index.js
    

Dalam mulai cepat ini, gunakan fitur berikut untuk menganalisis dan mengekstrak data dari formulir dan dokumen:

  • Tata letak—Menganalisis dan mengekstrak tabel, garis, kata, dan tanda pilihan seperti tombol radio dan kotak centang, dan pasangan kunci-nilai, tanpa perlu melatih model.

  • Faktur 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.
  • Versi terbaru dari Visual Studio Code atau IDE pilihan Anda. Untuk informasi selengkapnya, lihatMemulai 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:

    Cuplikan layar di titik akhir di portal Azure.

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 endpointDokumen Anda .

  1. Buat file Python baru yang disebut doc_intel_quickstart.py di editor atau IDE pilihan Anda.

  2. 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 endpointDokumen Anda .

  1. Buat file Python baru bernama form_recognizer_quickstart.py di editor atau IDE pilihan Anda.

  2. 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 fungsi analyze_layout.
  • 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 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

# 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", formUrl
    )

    analyze_request = 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:

  1. Navigasi ke folder tempat Anda memiliki file doc_intel_quickstart.py .

  2. Jalankan perintah berikut, di terminal Anda:

    python doc_intel_quickstart.py
    

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(
            "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:

  1. Buka folder tempat Anda menyimpan file form_recognizer_quickstart.py.

  2. 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:

  1. Buka folder tempat Anda menyimpan file form_recognizer_quickstart.py.

  2. 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 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.
  • 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


# 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", 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:

  1. Navigasi ke folder tempat Anda memiliki file doc_intel_quickstart.py .

  2. Jalankan perintah berikut, di terminal Anda:

    python doc_intel_quickstart.py
    

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:

  1. Buka folder tempat Anda menyimpan file form_recognizer_quickstart.py.

  2. 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:

  1. Buka folder tempat Anda menyimpan file form_recognizer_quickstart.py.

  2. 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
  • 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:

    Cuplikan layar di titik akhir di portal Azure.

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:

  1. Ganti {endpoint} dengan nilai titik akhir dari instans Portal Azure Kecerdasan Dokumen Anda.

  2. Ganti {key} dengan nilai kunci dari instans Portal Azure Kecerdasan Dokumen Anda.

  3. Menggunakan tabel berikut sebagai referensi, ganti {modelID} dan {your-document-url} dengan nilai yang Anda inginkan.

  4. 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
Tanda terima 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
Tanda terima 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:

{alt-teks}

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:

  1. Ganti {resultID} header Operation-Location dari respons POST.

  2. 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:tanda centangv2.1 | Versi terbaru:tanda centang biruv4.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:

    Cuplikan layar di titik akhir di portal Azure.

Penyiapan

  1. Mulai Visual Studio 2019.

  2. Dari halaman awal, pilih Buat proyek baru.

    Cuplikan layar jendela mulai Visual Studio.

  3. Pada halaman Buat proyek baru, masukkan konsol di kotak pencarian. Pilih templat Aplikasi Konsol, lalu pilih Berikutnya.

    Cuplikan layar halaman Buat proyek baru di Visual Studio.

  4. Di jendela dialog Konfigurasikan proyek baru Anda, masukkan formRecognizer_quickstart di kotak Nama proyek. Kemudian pilih Berikutnya.

    Cuplikan layar jendela dialog Visual Studios mengonfigurasi proyek baru.

  5. Di jendela dialog Informasi tambahan, pilih .NET 5.0 (Saat Ini), lalu pilih Buat.

    Cuplikan layar jendela dialog informasi tambahan Visual Studio.

Memasang pustaka klien dengan NuGet

  1. Klik kanan proyek formRecognizer_quickstart Anda dan pilih Kelola Paket NuGet....

    Cuplikan layar memperlihatkan jendela pilih paket NuGet.

  2. Pilih tab Telusuri dan ketik Azure.AI.FormRecognizer.

    Cuplikan layar memperlihatkan menu dropdown pilih paket Kecerdasan Dokumen.

  3. 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 endpointDokumen 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, lihattemplat C# Baru menghasilkan pernyataan tingkat atas.
  1. Buka file Program.cs.

  2. Tambahkan hal berikut menggunakan instruksi:

using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
  1. Atur variabel lingkungan endpoint dan key Anda dan buat instans AzureKeyCredential dan FormRecognizerClient 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);
  1. Hapus baris, Console.Writeline("Hello World!"); , dan tambahkan salah satu kode sampel Try It ke dalam file Program.cs:

    Cuplikan layar tambahkan kode sampel ke metode Utama.

  2. 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.

Cuplikan layar menjalankan program Visual Studio Anda.

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, lihatVersi 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:

    Cuplikan layar di titik akhir di portal Azure.

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
  1. 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
    
  2. Saat diminta untuk memilih DSL, pilih Kotlin.

  3. 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:

Cuplikan layar struktur direktori Java aplikasi.

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.

  1. Bangun aplikasi Anda dengan perintah build:
gradle build
  1. 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:

    Cuplikan layar di titik akhir di portal Azure.

Penyiapan

  1. 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
    
  2. Jalankan perintah npm init untuk membuat aplikasi node dengan file package.json.

    npm init
    
  3. Menginstal paket npm pustaka klien ai-form-recognizer:

    npm install @azure/ai-form-recognizer
    

    File aplikasi package.json Anda diperbarui dengan dependensi.

  4. Buat file bernama index.js, buka, dan impor pustaka berikut ini:

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. 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";
    
  6. 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

  • Python 3.x

    • 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.
  • 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:

    Cuplikan layar di titik akhir di portal Azure.

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

  1. Buka folder tempat Anda menyimpan file form_recognizer_quickstart.py.

  2. 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:

    Cuplikan layar di titik akhir di portal Azure.

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.
  1. Ganti {endpoint} dengan titik akhir yang Anda peroleh dengan langganan Kecerdasan Dokumen Anda.
  2. Ganti {key} dengan kunci yang Anda salin dari langkah sebelumnya.
  3. 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:

  1. Ganti {endpoint} dengan titik akhir yang Anda peroleh dengan langganan Kecerdasan Dokumen Anda.
  2. Ganti {key} dengan kunci yang Anda salin dari langkah sebelumnya.
  3. 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 statusnya selected atau unselected.
  • Bagian "pageResults" ini mencakup tabel yang diekstrak. Rentang baris dan kolom, kotak pembatas, dan lainnya diekstrak untuk setiap tabel, teks, baris, dan indeks kolom.

Dokumen pernyataan proyek Contoso dengan tabel.

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:

  1. Ganti {endpoint} dengan titik akhir yang Anda peroleh dengan langganan Kecerdasan Dokumen Anda.

  2. Ganti {key} dengan kunci yang Anda salin dari langkah sebelumnya.

  3. 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:

  1. 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.
  2. Ganti {resultId} dengan ID hasil dari langkah sebelumnya.
  3. 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

Lihat output sampel lengkap di GitHub.

Itu saja, bagus!

Langkah berikutnya

  • Untuk pengalaman yang ditingkatkan dan kualitas model tingkat lanjut, coba Studio Kecerdasan Dokumen.

    • Studio mendukung model apa pun yang dilatih dengan data berlabel v2.1.

    • Changelog memberikan informasi terperinci tentang migrasi dari v3.1 ke v4.0.