Mulai menggunakan Kecerdasan Dokumen

Penting

  • Azure Cognitive Services Form Recognizer sekarang menjadi Azure Inteligensi Dokumen di Foundry Tools.
  • Beberapa platform masih menunggu pembaruan penggantian nama.
  • Semua penyebutan Form Recognizer atau Kecerdasan Dokumen dalam dokumentasi kami mengacu pada layanan Azure yang sama.

Konten ini berlaku untuk:checkmarkv4.0 (GA)Versi sebelumnya:blue-checkmarkv3.1 (GA)blue-checkmarkv3.0 (GA)

  • Mulai menggunakan Azure Document Intelligence versi stabil terbaru v4.0 2024-11-30 (GA).

Konten ini berlaku untuk:checkmarkv3.1 (GA)Versi sebelumnya:blue-checkmarkv3.0blue-checkmarkv2.1

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

Konten ini berlaku untuk:checkmarkv3.0 (GA)Versi yang lebih baru:blue-checkmarkv3.1blue-checkmarkv2.1

  • Mulai menggunakan versi GA warisan Azure Form Recognizer (2022-08-31).
  • Azure Document Intelligence / Form Recognizer adalah layanan Foundry Tools berbasis cloud yang menggunakan pembelajaran mesin untuk mengekstrak pasangan kunci-nilai, teks, tabel, dan data kunci dari dokumen Anda.

  • Anda dapat dengan mudah mengintegrasikan model pemrosesan dokumen ke dalam alur kerja dan aplikasi Anda dengan menggunakan SDK bahasa pemrograman atau memanggil REST API.

  • Kami menyarankan agar Anda menggunakan layanan gratis saat mempelajari cara kerja teknologi ini untuk panduan cepat. Ingatlah bahwa jumlah halaman gratis dibatasi hingga 500 per bulan.

Untuk mempelajari selengkapnya tentang fitur API dan opsi pengembangan, kunjungi halaman Gambaran Umum kami.

Client pustakaReferensi APIPaket (NuGet)ContohVersi API REST yang Didukung

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

  • Model tata letak—Menganalisis dan mengekstrak tabel, garis, kata, dan tanda pilihan seperti tombol radio dan kotak centang dalam dokumen, tanpa perlu melatih model.

  • Model bawaan—Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model bawaan.

Prasyarat

  • Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya single-service atau multi-layanan Azure di portal Azure, untuk mendapatkan kunci dan titik akhir Anda.

  • Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.

Tips

Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.

  • Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.

    Cuplikan layar dari kunci dan lokasi titik akhir di portal Azure.

  • Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat single-service atau Azure sumber daya multi-layanan, di portal Azure, untuk mendapatkan kunci dan titik akhir Anda.

  • Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.

Tips

Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Untuk akses Form Recognizer saja, buat sumber daya Form Recognizer. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.

  • Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Form Recognizer. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.

    Cuplikan layar dari kunci dan lokasi titik akhir di portal Azure.

Mengatur

  1. Mulai Visual Studio.

  2. Pada halaman mulai, pilih Buat proyek baru.

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

  1. Di jendela dialog Konfigurasi project baru Anda, masukkan doc_intel_quickstart di kotak nama Project. Lalu pilih Berikutnya.
  1. Di jendela dialog Konfigurasi project baru Anda, masukkan form_recognizer_quickstart di kotak nama Project. Lalu pilih Berikutnya.
  1. Di jendela dialog Informasi tambahan, pilih .NET 8.0 (Dukungan jangka panjang), lalu pilih Buat.

    Screenshot dari jendela dialog informasi tambahan Visual Studio.

Menginstal pustaka klien dengan NuGet

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

    Screenshot dari jendela paket prarilis NuGet tertentu di Visual Studio.

  2. Pilih tab Browse dan ketik Azure. AI. DocumentIntelligence.

  3. Pilih kotak Include prerelease centang.

    Screenshot dari paket NuGet prarilis tertentu di Visual Studio.

  4. Pilih versi dari menu dropdown dan instal paket di proyek Anda.

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

    Screenshot jendela pencarian paket NuGet di Visual Studio.

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

    Screenshot dari paket Form Recognizer NuGet tertentu di Visual Studio.

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

    Screenshot jendela paket NuGet di Visual Studio.

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

    Screenshot dari paket warisan NuGet tertentu di Visual Studio.

Membangun aplikasi Anda

Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentIntelligenceClient kelas. Untuk melakukannya, Anda membuat AzureKeyCredential dengan key dari portal Azure dan instans DocumentIntelligenceClient dengan AzureKeyCredential dan Inteligensi Dokumen milik Anda endpoint.

Untuk berinteraksi dengan layanan Form Recognizer, Anda perlu membuat instans kelas DocumentAnalysisClient. Untuk melakukannya, Anda membuat sebuah AzureKeyCredential dengan key dari portal Azure dan sebuah instans DocumentAnalysisClient dengan AzureKeyCredential serta Form Recognizer endpoint Anda.

Catatan

  • Dimulai dengan .NET 6, proyek baru yang menggunakan templat console menghasilkan gaya program baru yang berbeda dari versi sebelumnya.
  • Output baru menggunakan fitur C# terbaru yang menyederhanakan kode yang perlu Anda tulis.
  • Ketika Anda menggunakan versi yang lebih baru, Anda hanya perlu menulis isi Main metode . Anda tidak perlu menyertakan pernyataan tingkat teratas, direktif menggunakan global, atau direktif menggunakan implisit.
  • Untuk informasi selengkapnya, lihatTemplat C# baru menghasilkan pernyataan tingkat atas.
  1. Buka file Program.cs .

  2. Hapus kode yang ada, termasuk baris Console.Writeline("Halo Dunia!"), dan pilih salah satu sampel kode berikut untuk disalin dan ditempelkan ke file Program.cs aplikasi Anda:

Penting

Sebaiknya autentikasi Microsoft Entra ID dengan identitas terkelola untuk sumber daya Azure untuk menghindari penyimpanan kredensial pada aplikasi Anda yang berjalan di cloud.

Gunakan kunci API dengan hati-hati. Jangan sertakan kunci API langsung dalam kode Anda, dan jangan pernah mempostingnya secara publik. Jika menggunakan kunci API, simpan dengan aman di Azure Key Vault, putar kunci secara teratur, dan batasi akses ke Azure Key Vault menggunakan kontrol akses berbasis peran dan pembatasan akses jaringan. Untuk informasi selengkapnya tentang menggunakan kunci API dengan aman di aplikasi Anda, lihat kunci API dengan Azure Key Vault.

Untuk informasi selengkapnya tentang keamanan layanan AI, lihat cara mengotentikasi permintaan ke layanan Azure AI.

Model tata letak

Ekstrak teks, tanda pilihan, gaya teks, struktur tabel, dan koordinat wilayah pembatas dari dokumen.

  • Untuk contoh ini, Anda memerlukan file dokumen dari URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
  • Kami telah menambahkan nilai URI file ke Uri fileUri variabel di bagian atas skrip.
  • Untuk mengekstrak tata letak dari file tertentu di URI, gunakan metode AnalyzeDocumentAsync dan operkan prebuilt-layout sebagai ID model. Nilai yang dikembalikan adalah objek yang AnalyzeResult berisi data dari dokumen yang dikirimkan.

Tambahkan sampel kode berikut ke file Program.cs. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:


using Azure;
using Azure.AI.DocumentIntelligence;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");

AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
    UrlSource= fileUri
};

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", content);

AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s)," +
        $" and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];

        Console.WriteLine($"  Line {i}:");
        Console.WriteLine($"    Content: '{line.Content}'");

        Console.Write("    Bounding polygon, with points ordered clockwise:");
        for (int j = 0; j < line.Polygon.Count; j += 2)
        {
            Console.Write($" ({line.Polygon[j]}, {line.Polygon[j + 1]})");
        }

        Console.WriteLine();
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    State: {selectionMark.State}");

        Console.Write("    Bounding polygon, with points ordered clockwise:");
        for (int j = 0; j < selectionMark.Polygon.Count; j++)
        {
            Console.Write($" ({selectionMark.Polygon[j]}, {selectionMark.Polygon[j + 1]})");
        }

        Console.WriteLine();
    }
}

for (int i = 0; i < result.Paragraphs.Count; i++)
{
    DocumentParagraph paragraph = result.Paragraphs[i];

    Console.WriteLine($"Paragraph {i}:");
    Console.WriteLine($"  Content: {paragraph.Content}");

    if (paragraph.Role != null)
    {
        Console.WriteLine($"  Role: {paragraph.Role}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            var handwrittenContent = result.Content.Substring(span.Offset, span.Length);
            Console.WriteLine($"  {handwrittenContent}");
        }
    }
}

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];

    Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"  Cell ({cell.RowIndex}, {cell.ColumnIndex}) is a '{cell.Kind}' with content: {cell.Content}");
    }
}

Jalankan aplikasi Anda

Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.

Screenshot tombol untuk menjalankan program Visual Studio Anda.

Tambahkan sampel kode berikut ke file Program.cs. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari Azure Portal Anda (instans Form Recognizer):

using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);

AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
    Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding box is:");
        Console.WriteLine($"      Upper left => X: {line.Polygon[0].X}, Y= {line.Polygon[0].Y}");
        Console.WriteLine($"      Upper right => X: {line.Polygon[1].X}, Y= {line.Polygon[1].Y}");
        Console.WriteLine($"      Lower right => X: {line.Polygon[2].X}, Y= {line.Polygon[2].Y}");
        Console.WriteLine($"      Lower left => X: {line.Polygon[3].X}, Y= {line.Polygon[3].Y}");
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding box is:");
        Console.WriteLine($"      Upper left => X: {selectionMark.Polygon[0].X}, Y= {selectionMark.Polygon[0].Y}");
        Console.WriteLine($"      Upper right => X: {selectionMark.Polygon[1].X}, Y= {selectionMark.Polygon[1].Y}");
        Console.WriteLine($"      Lower right => X: {selectionMark.Polygon[2].X}, Y= {selectionMark.Polygon[2].Y}");
        Console.WriteLine($"      Lower left => X: {selectionMark.Polygon[3].X}, Y= {selectionMark.Polygon[3].Y}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
    }
}

Jalankan aplikasi Anda

Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.

Screenshot lokasi tombol 'Jalankan' pada program Visual Studio Anda.

Output model tata letak

Berikut adalah cuplikan output yang diharapkan:

  Document Page 1 has 69 line(s), 425 word(s), and 15 selection mark(s).
  Line 0 has content: 'UNITED STATES'.
    Its bounding box is:
      Upper left => X: 3.4915, Y= 0.6828
      Upper right => X: 5.0116, Y= 0.6828
      Lower right => X: 5.0116, Y= 0.8265
      Lower left => X: 3.4915, Y= 0.8265
  Line 1 has content: 'SECURITIES AND EXCHANGE COMMISSION'.
    Its bounding box is:
      Upper left => X: 2.1937, Y= 0.9061
      Upper right => X: 6.297, Y= 0.9061
      Lower right => X: 6.297, Y= 1.0498
      Lower left => X: 2.1937, Y= 1.0498

Untuk melihat seluruh output, kunjungi repositori sampel Azure pada GitHub untuk melihat output model layout.

Tambahkan sampel kode berikut ke file Program.cs. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.

using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);

AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
    Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < line.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
        }
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < selectionMark.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
        }
    }
}

Console.WriteLine("Paragraphs:");

foreach (DocumentParagraph paragraph in result.Paragraphs)
{
    Console.WriteLine($"  Paragraph content: {paragraph.Content}");

    if (paragraph.Role != null)
    {
        Console.WriteLine($"    Role: {paragraph.Role}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
    }
}
Extract the layout of a document from a file stream
To extract the layout from a given file at a file stream, use the AnalyzeDocument method and pass prebuilt-layout as the model ID. The returned value is an AnalyzeResult object containing data about the submitted document.

string filePath = "<filePath>";
using var stream = new FileStream(filePath, FileMode.Open);

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", stream);
AnalyzeResult result = operation.Value;

foreach (DocumentPage page in result.Pages)
{
    Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
    Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");

    for (int i = 0; i < page.Lines.Count; i++)
    {
        DocumentLine line = page.Lines[i];
        Console.WriteLine($"  Line {i} has content: '{line.Content}'.");

        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < line.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
        }
    }

    for (int i = 0; i < page.SelectionMarks.Count; i++)
    {
        DocumentSelectionMark selectionMark = page.SelectionMarks[i];

        Console.WriteLine($"  Selection Mark {i} is {selectionMark.State}.");
        Console.WriteLine($"    Its bounding polygon (points ordered clockwise):");

        for (int j = 0; j < selectionMark.Polygon.Count; j++)
        {
            Console.WriteLine($"      Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
        }
    }
}

Console.WriteLine("Paragraphs:");

foreach (DocumentParagraph paragraph in result.Paragraphs)
{
    Console.WriteLine($"  Paragraph content: {paragraph.Content}");

    if (paragraph.Role != null)
    {
        Console.WriteLine($"    Role: {paragraph.Role}");
    }
}

foreach (DocumentStyle style in result.Styles)
{
    // Check the style and style confidence to see if text is handwritten.
    // Note that value '0.8' is used as an example.

    bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;

    if (isHandwritten && style.Confidence > 0.8)
    {
        Console.WriteLine($"Handwritten content found:");

        foreach (DocumentSpan span in style.Spans)
        {
            Console.WriteLine($"  Content: {result.Content.Substring(span.Index, span.Length)}");
        }
    }
}

Console.WriteLine("The following tables were extracted:");

for (int i = 0; i < result.Tables.Count; i++)
{
    DocumentTable table = result.Tables[i];
    Console.WriteLine($"  Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");

    foreach (DocumentTableCell cell in table.Cells)
    {
        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
    }
}

Jalankan aplikasi Anda

Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.

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

Tips

Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat pengambilan data model.

  • Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
  • Kami telah menambahkan nilai URI file ke Uri invoiceUri variabel di bagian atas file Program.cs.
  • Untuk menganalisis file pada URI, gunakan AnalyzeDocumentAsync dan berikan prebuilt-invoice sebagai ID model. Nilai yang dikembalikan adalah objek yang AnalyzeResult berisi data dari dokumen yang dikirimkan.
  • Untuk kesederhanaan, pasangan kunci-nilai yang dikembalikan oleh layanan tidak semuanya ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.

Tambahkan sampel kode berikut ke file Program.cs Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:


using Azure;
using Azure.AI.DocumentIntelligence;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);

//sample invoice document
Uri invoiceUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");

AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
    UrlSource = invoiceUri
};

Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", content);

AnalyzeResult result = operation.Value;

for (int i = 0; i < result.Documents.Count; i++)
{
    Console.WriteLine($"Document {i}:");

    AnalyzedDocument document = result.Documents[i];

    if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField)
        && vendorNameField.FieldType == DocumentFieldType.String)
    {
        string vendorName = vendorNameField.ValueString;
        Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
    }

    if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField)
        && customerNameField.FieldType == DocumentFieldType.String)
    {
        string customerName = customerNameField.ValueString;
        Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
    }

    if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
        && itemsField.FieldType == DocumentFieldType.List)
    {
        foreach (DocumentField itemField in itemsField.ValueList)
        {
            Console.WriteLine("Item:");

            if (itemField.FieldType == DocumentFieldType.Dictionary)
            {
                IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueDictionary;

                if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField)
                    && itemDescriptionField.FieldType == DocumentFieldType.String)
                {
                    string itemDescription = itemDescriptionField.ValueString;
                    Console.WriteLine($"  Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
                }

                if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField)
                    && itemAmountField.FieldType == DocumentFieldType.Currency)
                {
                    CurrencyValue itemAmount = itemAmountField.ValueCurrency;
                    Console.WriteLine($"  Amount: '{itemAmount.CurrencySymbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
                }
            }
        }
    }

    if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField)
        && subTotalField.FieldType == DocumentFieldType.Currency)
    {
        CurrencyValue subTotal = subTotalField.ValueCurrency;
        Console.WriteLine($"Sub Total: '{subTotal.CurrencySymbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
    }

    if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField)
        && totalTaxField.FieldType == DocumentFieldType.Currency)
    {
        CurrencyValue totalTax = totalTaxField.ValueCurrency;
        Console.WriteLine($"Total Tax: '{totalTax.CurrencySymbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
    }

    if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField)
        && invoiceTotalField.FieldType == DocumentFieldType.Currency)
    {
        CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
        Console.WriteLine($"Invoice Total: '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
    }
}

Jalankan aplikasi Anda

Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.

Screenshot tombol 'Run' pada 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 di portal Azure Anda.


using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `FormRecognizerClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample invoice document

Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");

Operation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", invoiceUri);

AnalyzeResult result = operation.Value;

for (int i = 0; i < result.Documents.Count; i++)
{
    Console.WriteLine($"Document {i}:");

    AnalyzedDocument document = result.Documents[i];

    if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField))
    {
        if (vendorNameField.FieldType == DocumentFieldType.String)
        {
            string vendorName = vendorNameField.Value.AsString();
            Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField))
    {
        if (customerNameField.FieldType == DocumentFieldType.String)
        {
            string customerName = customerNameField.Value.AsString();
            Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
    {
        if (itemsField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField itemField in itemsField.Value.AsList())
            {
                Console.WriteLine("Item:");

                if (itemField.FieldType == DocumentFieldType.Dictionary)
                {
                    IReadOnlyDictionary<string, DocumentField> itemFields = itemField.Value.AsDictionary();

                    if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
                    {
                        if (itemDescriptionField.FieldType == DocumentFieldType.String)
                        {
                            string itemDescription = itemDescriptionField.Value.AsString();

                            Console.WriteLine($"  Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
                        }
                    }

                    if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
                    {
                        if (itemAmountField.FieldType == DocumentFieldType.Currency)
                        {
                            CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();

                            Console.WriteLine($"  Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField))
    {
        if (subTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue subTotal = subTotalField.Value.AsCurrency();
            Console.WriteLine($"Sub Total: '{subTotal.Symbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField))
    {
        if (totalTaxField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue totalTax = totalTaxField.Value.AsCurrency();
            Console.WriteLine($"Total Tax: '{totalTax.Symbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField))
    {
        if (invoiceTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue invoiceTotal = invoiceTotalField.Value.AsCurrency();
            Console.WriteLine($"Invoice Total: '{invoiceTotal.Symbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
        }
    }
}

Jalankan aplikasi Anda

Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.

Screenshot lokasi tombol untuk menjalankan program Visual Studio Anda.

Output model bawaan

Berikut adalah cuplikan output yang diharapkan:

  Document 0:
  Vendor Name: 'CONTOSO LTD.', with confidence 0.962
  Customer Name: 'MICROSOFT CORPORATION', with confidence 0.951
  Item:
    Description: 'Test for 23 fields', with confidence 0.899
    Amount: '100', with confidence 0.902
  Sub Total: '100', with confidence 0.979

Untuk melihat seluruh output, kunjungi repositori sampel Azure di GitHub untuk melihat output model faktur prabangun.

Tambahkan sampel kode berikut ke file Program.cs Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.


using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;

//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `FormRecognizerClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

//sample invoice document

Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-invoice", invoiceUri);

AnalyzeResult result = operation.Value;

for (int i = 0; i < result.Documents.Count; i++)
{
    Console.WriteLine($"Document {i}:");

    AnalyzedDocument document = result.Documents[i];

    if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField))
    {
        if (vendorNameField.FieldType == DocumentFieldType.String)
        {
            string vendorName = vendorNameField.Value.AsString();
            Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField))
    {
        if (customerNameField.FieldType == DocumentFieldType.String)
        {
            string customerName = customerNameField.Value.AsString();
            Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
    {
        if (itemsField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField itemField in itemsField.Value.AsList())
            {
                Console.WriteLine("Item:");

                if (itemField.FieldType == DocumentFieldType.Dictionary)
                {
                    IReadOnlyDictionary<string, DocumentField> itemFields = itemField.Value.AsDictionary();

                    if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
                    {
                        if (itemDescriptionField.FieldType == DocumentFieldType.String)
                        {
                            string itemDescription = itemDescriptionField.Value.AsString();

                            Console.WriteLine($"  Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
                        }
                    }

                    if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
                    {
                        if (itemAmountField.FieldType == DocumentFieldType.Currency)
                        {
                            CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();

                            Console.WriteLine($"  Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField))
    {
        if (subTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue subTotal = subTotalField.Value.AsCurrency();
            Console.WriteLine($"Sub Total: '{subTotal.Symbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField))
    {
        if (totalTaxField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue totalTax = totalTaxField.Value.AsCurrency();
            Console.WriteLine($"Total Tax: '{totalTax.Symbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField))
    {
        if (invoiceTotalField.FieldType == DocumentFieldType.Currency)
        {
            CurrencyValue invoiceTotal = invoiceTotalField.Value.AsCurrency();
            Console.WriteLine($"Invoice Total: '{invoiceTotal.Symbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
        }
    }
}

Jalankan aplikasi Anda

Setelah Anda menambahkan sampel kode ke aplikasi Anda, pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.

Screenshot menjalankan program Visual Studio Anda.

Client libraryReferensi REST APIPackage (Maven)ContohVersi REST API yang Didukung

Client libraryReferensi REST APIPackage (Maven)ContohVersi REST API yang Didukung

Client libraryReferensi REST APIPackage (Maven)ContohVersi REST API yang Didukung

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

  • Tata Letak—Menganalisis dan mengekstrak tabel, garis, kata, dan tanda pilihan seperti tombol radio dan kotak centang dalam dokumen, tanpa perlu melatih model.

  • Faktur Prabangun—Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model yang sudah dilatih sebelumnya.

Prasyarat

  • langganan Azure - Buat langganan secara gratis.

  • Versi terbaru Visual Studio Code atau IDE pilihan Anda. LihatJava di Visual Studio Code.

    Tips

    • Visual Studio Code menawarkan paket Coding untuk Java untuk Windows dan macOS.Paket pengodean adalah bundel Vs Code, Java Development Kit (JDK), dan kumpulan ekstensi yang disarankan oleh Microsoft. Coding Pack juga dapat digunakan untuk memperbaiki lingkungan pengembangan yang ada.
    • Jika Anda menggunakan VS Code dan Coding Pack For Java, instal ekstensi Gradle untuk Java.
  • Jika Anda tidak menggunakan Visual Studio Code, pastikan Anda memiliki hal berikut yang terinstal di lingkungan pengembangan Anda:

  • Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat single-service atau multi-service layanan sumber daya Document Intelligence di portal Azure, untuk memperoleh kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.

    Tips

    Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.

  • Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Kemudian, Anda menempelkan kunci dan titik akhir Anda ke dalam kode:

    Cuplikan layar dari kunci dan lokasi titik akhir di portal Azure.

Mengatur

Membuat 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 gradle init perintah dari direktori kerja Anda. Perintah ini membuat file build penting untuk Gradle, termasuk build.gradle.kts, yang digunakan pada runtime untuk membuat dan mengonfigurasi aplikasi Anda.

    gradle init --type 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 && cd form-recognize-app
    
    mkdir form-recognize-app; cd form-recognize-app
    
  2. Jalankan gradle init perintah dari direktori kerja Anda. Perintah ini membuat file build penting untuk Gradle, termasuk build.gradle.kts, yang digunakan pada runtime untuk membuat dan mengonfigurasi aplikasi Anda.

    gradle init --type basic
    
  3. Saat diminta untuk memilih DSL, pilih Kotlin.

  4. Terima nama proyek default (form-recognize-app) dengan memilih Kembalikan atau Masukkan.

Menginstal pustaka klien

Panduan cepat ini menggunakan manajer dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk manajer dependensi lain di Repositori Pusat Maven.

Buka file build.gradle.kts proyek di IDE Anda. Salin dan tempel kode berikut untuk menyertakan pustaka klien sebagai implementation perintah, bersama dengan plugin dan pengaturan yang diperlukan.

   plugins {
       java
       application
   }
   application {
       mainClass.set("DocIntelligence")
   }
   repositories {
       mavenCentral()
   }
   dependencies {
       implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0'

   }

Panduan cepat ini menggunakan manajer dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk manajer dependensi lain di Repositori Pusat Maven.

Buka file build.gradle.kts proyek di IDE Anda. Salin dan tempelkan kode berikut untuk menyertakan pustaka klien sebagai implementation pernyataan, bersama dengan plugin dan pengaturan yang diperlukan.

   plugins {
       java
       application
   }
   application {
       mainClass.set("FormRecognizer")
   }
   repositories {
       mavenCentral()
   }
   dependencies {
       implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.1.0'

   }

Panduan cepat ini menggunakan manajer dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk manajer dependensi lain di Repositori Pusat Maven.

Buka file build.gradle.kts proyek di IDE Anda. Copay dan tempel kode berikut untuk menyertakan pustaka klien sebagai implementation klausa, bersama dengan plugin dan pengaturan yang diperlukan.

   plugins {
       java
       application
   }
   application {
       mainClass.set("FormRecognizer")
   }
   repositories {
       mavenCentral()
   }
   dependencies {
       implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'


   }

Membuat aplikasi Java

Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentIntelligenceClient kelas. Untuk melakukannya, Anda membuat AzureKeyCredential dengan key dari portal Azure serta instance DocumentIntelligenceClient menggunakan AzureKeyCredential dan Inteligensi Dokumen endpoint Anda.

Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentAnalysisClient kelas. Untuk melakukannya, Anda membuat AzureKeyCredential dengan key dari portal Azure dan instans DocumentAnalysisClient dengan AzureKeyCredential dan Inteligensi Dokumen milik Anda endpoint.

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

    mkdir -p src/main/java
    

    Anda membuat struktur direktori berikut:

    Screenshot struktur direktori Java

  1. Navigasi ke java direktori dan buat file bernama DocIntelligence.java.

    Tips

    • Anda dapat membuat file baru menggunakan PowerShell.
    • Buka jendela PowerShell di direktori proyek Anda dengan menahan tombol Shift dan mengklik kanan folder.
    • Ketik perintah berikut New-Item DocIntelligence.java.
  2. Buka file DocIntelligence.java. Salin dan tempel salah satu sampel kode berikut ke dalam aplikasi Anda:

  1. Navigasi ke java direktori dan buat file bernama FormRecognizer.java.

    Tips

    • Anda dapat membuat file baru menggunakan PowerShell.
    • Buka jendela PowerShell di direktori proyek Anda dengan menahan tombol Shift dan mengklik kanan folder.
    • Ketik perintah berikutNew-Item FormRecognizer.java.
  2. Buka FormRecognizer.java file. Salin dan tempel salah satu sampel kode berikut ke dalam aplikasi Anda:

Penting

Sebaiknya autentikasi Microsoft Entra ID dengan identitas terkelola untuk sumber daya Azure untuk menghindari penyimpanan kredensial pada aplikasi Anda yang berjalan di cloud.

Gunakan kunci API dengan hati-hati. Jangan sertakan kunci API langsung dalam kode Anda, dan jangan pernah mempostingnya secara publik. Jika menggunakan kunci API, simpan dengan aman di Azure Key Vault, putar kunci secara teratur, dan batasi akses ke Azure Key Vault menggunakan kontrol akses berbasis peran dan pembatasan akses jaringan. Untuk informasi selengkapnya tentang menggunakan kunci API dengan aman di aplikasi Anda, lihat kunci API dengan Azure Key Vault.

Untuk informasi selengkapnya tentang keamanan layanan AI, lihat cara mengotentikasi permintaan ke layanan Azure AI.

Model tata letak

Ekstrak teks, tanda pilihan, gaya teks, struktur tabel, dan koordinat wilayah pembatas dari dokumen.

  • Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
  • Untuk menganalisis file tertentu di URI, Anda akan menggunakan beginAnalyzeDocument metode dan meneruskan prebuilt-layout sebagai Id model. Nilai yang dikembalikan adalah objek yang AnalyzeResult berisi data tentang dokumen yang dikirimkan.
  • Kami telah menambahkan nilai URI file ke documentUrl variabel dalam metode utama.

Tambahkan sampel kode berikut ke DocIntelligence.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:


import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.DocumentTable;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.util.List;

public class DocIntelligence {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

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

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

    AnalyzeDocumentOptions options = new AnalyzeDocumentOptions(documentUrl);

    SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeLayoutPoller = client.beginAnalyzeDocument(modelId, options);

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();

    // pages
    analyzeLayoutResult.getPages().forEach(documentPage -> {
      System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
        documentPage.getWidth(),
        documentPage.getHeight(),
        documentPage.getUnit());

      // lines
      documentPage.getLines().forEach(documentLine ->
        System.out.printf("Line '%s' is within a bounding polygon %s.%n",
          documentLine.getContent(),
          documentLine.getPolygon()));

      // words
      documentPage.getWords().forEach(documentWord ->
        System.out.printf("Word '%s' has a confidence score of %.2f.%n",
          documentWord.getContent(),
          documentWord.getConfidence()));

      // selection marks
      documentPage.getSelectionMarks().forEach(documentSelectionMark ->
        System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
          documentSelectionMark.getState().toString(),
          documentSelectionMark.getPolygon(),
          documentSelectionMark.getConfidence()));
    });

    // tables
    List < DocumentTable > tables = analyzeLayoutResult.getTables();
    for (int i = 0; i < tables.size(); i++) {
      DocumentTable documentTable = tables.get(i);
      System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
        documentTable.getColumnCount());
      documentTable.getCells().forEach(documentTableCell ->
        System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
          documentTableCell.getRowIndex(), documentTableCell.getColumnIndex()));
      System.out.println();
    }

    // styles
    analyzeLayoutResult.getStyles().forEach(documentStyle -> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
  }
}

Membangun dan menjalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—doc-intel-app.

  1. Bangun aplikasi Anda dengan build perintah :

    gradle build
    
  2. Jalankan aplikasi Anda dengan run perintah :

    gradle run
    

Tambahkan sampel kode berikut ke FormRecognizer.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:


import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

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

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

    SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
      client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);

    AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();

    // pages
    analyzeLayoutResult.getPages().forEach(documentPage -> {
      System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
        documentPage.getWidth(),
        documentPage.getHeight(),
        documentPage.getUnit());

      // lines
      documentPage.getLines().forEach(documentLine ->
        System.out.printf("Line %s is within a bounding polygon %s.%n",
          documentLine.getContent(),
          documentLine.getPolygon().toString()));

      // words
      documentPage.getWords().forEach(documentWord ->
        System.out.printf("Word '%s' has a confidence score of %.2f%n",
          documentWord.getContent(),
          documentWord.getConfidence()));

      // selection marks
      documentPage.getSelectionMarks().forEach(documentSelectionMark ->
        System.out.printf("Selection mark is %s and is within a bounding polygon %s with confidence %.2f.%n",
          documentSelectionMark.getState().toString(),
          documentSelectionMark.getPolygon().toString(),
          documentSelectionMark.getConfidence()));
    });

    // tables
    List < DocumentTable > tables = analyzeLayoutResult.getTables();
    for (int i = 0; i < tables.size(); i++) {
      DocumentTable documentTable = tables.get(i);
      System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
        documentTable.getColumnCount());
      documentTable.getCells().forEach(documentTableCell -> {
        System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
          documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
      });
      System.out.println();
    }
  }
  // Utility function to get the bounding polygon coordinates
  private static String getBoundingCoordinates(List < Point > Polygon) {
    return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
      point.getY())).collect(Collectors.joining(", "));
  }
}

Membangun dan menjalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—form-recognize-app.

  1. Bangun aplikasi Anda dengan build perintah :

    gradle build
    
  2. Jalankan aplikasi Anda dengan run perintah :

    gradle run
    

Output model tata letak

Berikut adalah cuplikan output yang diharapkan:

  Table 0 has 5 rows and 3 columns.
  Cell 'Title of each class', has row index 0 and column index 0.
  Cell 'Trading Symbol', has row index 0 and column index 1.
  Cell 'Name of exchange on which registered', has row index 0 and column index 2.
  Cell 'Common stock, $0.00000625 par value per share', has row index 1 and column index 0.
  Cell 'MSFT', has row index 1 and column index 1.
  Cell 'NASDAQ', has row index 1 and column index 2.
  Cell '2.125% Notes due 2021', has row index 2 and column index 0.
  Cell 'MSFT', has row index 2 and column index 1.
  Cell 'NASDAQ', has row index 2 and column index 2.
  Cell '3.125% Notes due 2028', has row index 3 and column index 0.
  Cell 'MSFT', has row index 3 and column index 1.
  Cell 'NASDAQ', has row index 3 and column index 2.
  Cell '2.625% Notes due 2033', has row index 4 and column index 0.
  Cell 'MSFT', has row index 4 and column index 1.
  Cell 'NASDAQ', has row index 4 and column index 2.

Untuk melihat seluruh output, kunjungi repositori sampel Azure pada GitHub untuk melihat output model layout.

Tambahkan sampel kode berikut ke FormRecognizer.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:


import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentTable;
import com.azure.ai.formrecognizer.documentanalysis.models.Point;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.util.List;
import java.util.stream.Collectors;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

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

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

    SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutPoller =
      client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();

    // pages
    analyzeLayoutResult.getPages().forEach(documentPage -> {
      System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
        documentPage.getWidth(),
        documentPage.getHeight(),
        documentPage.getUnit());

      // lines
      documentPage.getLines().forEach(documentLine ->
        System.out.printf("Line '%s' is within a bounding polygon %s.%n",
          documentLine.getContent(),
          getBoundingCoordinates(documentLine.getPolygon())));

      // words
      documentPage.getWords().forEach(documentWord ->
        System.out.printf("Word '%s' has a confidence score of %.2f.%n",
          documentWord.getContent(),
          documentWord.getConfidence()));

      // selection marks
      documentPage.getSelectionMarks().forEach(documentSelectionMark ->
        System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
          documentSelectionMark.getSelectionMarkState().toString(),
          getBoundingCoordinates(documentSelectionMark.getPolygon()),
          documentSelectionMark.getConfidence()));
    });

    // tables
    List < DocumentTable > tables = analyzeLayoutResult.getTables();
    for (int i = 0; i < tables.size(); i++) {
      DocumentTable documentTable = tables.get(i);
      System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
        documentTable.getColumnCount());
      documentTable.getCells().forEach(documentTableCell -> {
        System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
          documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
      });
      System.out.println();
    }

    // styles
    analyzeLayoutResult.getStyles().forEach(documentStyle -
      > System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
  }

  /**
   * Utility function to get the bounding polygon coordinates.
   */
  private static String getBoundingCoordinates(List < Point > Polygon) {
    return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
      point.getY())).collect(Collectors.joining(", "));
  }
}

Membangun dan menjalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—form-recognize-app.

  1. Bangun aplikasi Anda dengan build perintah :

    gradle build
    
  2. Jalankan aplikasi Anda dengan run perintah :

    gradle run
    

Model bawaan

Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model bawaan. Dalam contoh ini, kami menganalisis faktur menggunakan model faktur bawaan.

Tips

Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat pengambilan data model.

  • Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
  • Kami telah menambahkan nilai URL file ke invoiceUrl variabel di bagian atas file.
  • Untuk menganalisis file tertentu di URI, Anda akan menggunakan beginAnalyzeDocuments metode dan meneruskan PrebuiltModels.Invoice sebagai Id model. Nilai yang dikembalikan adalah objek yang result berisi data tentang dokumen yang dikirimkan.
  • Untuk kesederhanaan, pasangan kunci-nilai yang dikembalikan oleh layanan tidak semuanya ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.

Tambahkan sampel kode berikut ke DocIntelligence.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:


import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzedDocument;
import com.azure.ai.documentintelligence.models.DocumentField;
import com.azure.ai.documentintelligence.models.DocumentFieldType;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

public class DocIntelligence {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

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

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

    SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeInvoicesPoller =
      client.beginAnalyzeDocument(modelId, new AnalyzeDocumentOptions(invoiceUrl));

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult();

    for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
      AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
      Map<String, DocumentField> invoiceFields = analyzedInvoice.getFields();
      System.out.printf("----------- Analyzing invoice  %d -----------%n", i);
      DocumentField vendorNameField = invoiceFields.get("VendorName");
      if (vendorNameField != null) {
        if (DocumentFieldType.STRING == vendorNameField.getType()) {
          String merchantName = vendorNameField.getValueAsString();
          System.out.printf("Vendor Name: %s, confidence: %.2f%n",
            merchantName, vendorNameField.getConfidence());
        }
      }

      DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
      if (vendorAddressField != null) {
        if (DocumentFieldType.STRING == vendorAddressField.getType()) {
          String merchantAddress = vendorAddressField.getValueAsString();
          System.out.printf("Vendor address: %s, confidence: %.2f%n",
            merchantAddress, vendorAddressField.getConfidence());
        }
      }

      DocumentField customerNameField = invoiceFields.get("CustomerName");
      if (customerNameField != null) {
        if (DocumentFieldType.STRING == customerNameField.getType()) {
          String merchantAddress = customerNameField.getValueAsString();
          System.out.printf("Customer Name: %s, confidence: %.2f%n",
            merchantAddress, customerNameField.getConfidence());
        }
      }

      DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
          String customerAddr = customerAddressRecipientField.getValueAsString();
          System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
            customerAddr, customerAddressRecipientField.getConfidence());
        }
      }

      DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
      if (invoiceIdField != null) {
        if (DocumentFieldType.STRING == invoiceIdField.getType()) {
          String invoiceId = invoiceIdField.getValueAsString();
          System.out.printf("Invoice ID: %s, confidence: %.2f%n",
            invoiceId, invoiceIdField.getConfidence());
        }
      }

      DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
      if (invoiceDateField != null) {
        if (DocumentFieldType.DATE == invoiceDateField.getType()) {
          LocalDate invoiceDate = invoiceDateField.getValueAsDate();
          System.out.printf("Invoice Date: %s, confidence: %.2f%n",
            invoiceDate, invoiceDateField.getConfidence());
        }
      }

      DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
      if (invoiceTotalField != null) {
        if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
          Double invoiceTotal = invoiceTotalField.getValueAsDouble();
          System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
            invoiceTotal, invoiceTotalField.getConfidence());
        }
      }

      DocumentField invoiceItemsField = invoiceFields.get("Items");
      if (invoiceItemsField != null) {
        System.out.printf("Invoice Items: %n");
        if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
          List<DocumentField> invoiceItems = invoiceItemsField.getValueAsList();
          invoiceItems.stream()
            .filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
            .map(documentField -> documentField.getValueAsMap())
            .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {

              // See a full list of fields found on an invoice here:
              // https://aka.ms/documentintelligence/invoicefields

              if ("Description".equals(key)) {
                if (DocumentFieldType.STRING == documentField.getType()) {
                  String name = documentField.getValueAsString();
                  System.out.printf("Description: %s, confidence: %.2fs%n",
                    name, documentField.getConfidence());
                }
              }
              if ("Quantity".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double quantity = documentField.getValueAsDouble();
                  System.out.printf("Quantity: %f, confidence: %.2f%n",
                    quantity, documentField.getConfidence());
                }
              }
              if ("UnitPrice".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double unitPrice = documentField.getValueAsDouble();
                  System.out.printf("Unit Price: %f, confidence: %.2f%n",
                    unitPrice, documentField.getConfidence());
                }
              }
              if ("ProductCode".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double productCode = documentField.getValueAsDouble();
                  System.out.printf("Product Code: %f, confidence: %.2f%n",
                    productCode, documentField.getConfidence());
                }
              }
            }));
        }
      }
    }
  }
}

Membangun dan menjalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—doc-intel-app.

  1. Bangun aplikasi Anda dengan build perintah :

    gradle build
    
  2. Jalankan aplikasi Anda dengan run perintah :

    gradle run
    

Tambahkan sampel kode berikut ke FormRecognizer.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:


import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(final String[] args) throws IOException {

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

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

    SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

    for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
      AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
      Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
      System.out.printf("----------- Analyzing invoice  %d -----------%n", i);
      DocumentField vendorNameField = invoiceFields.get("VendorName");
      if (vendorNameField != null) {
        if (DocumentFieldType.STRING == vendorNameField.getType()) {
          String merchantName = vendorNameField.getValueAsString();
          System.out.printf("Vendor Name: %s, confidence: %.2f%n",
            merchantName, vendorNameField.getConfidence());
        }
      }

      DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
      if (vendorAddressField != null) {
        if (DocumentFieldType.STRING == vendorAddressField.getType()) {
          String merchantAddress = vendorAddressField.getValueAsString();
          System.out.printf("Vendor address: %s, confidence: %.2f%n",
            merchantAddress, vendorAddressField.getConfidence());
        }
      }

      DocumentField customerNameField = invoiceFields.get("CustomerName");
      if (customerNameField != null) {
        if (DocumentFieldType.STRING == customerNameField.getType()) {
          String merchantAddress = customerNameField.getValueAsString();
          System.out.printf("Customer Name: %s, confidence: %.2f%n",
            merchantAddress, customerNameField.getConfidence());
        }
      }

      DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
          String customerAddr = customerAddressRecipientField.getValueAsString();
          System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
            customerAddr, customerAddressRecipientField.getConfidence());
        }
      }

      DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
      if (invoiceIdField != null) {
        if (DocumentFieldType.STRING == invoiceIdField.getType()) {
          String invoiceId = invoiceIdField.getValueAsString();
          System.out.printf("Invoice ID: %s, confidence: %.2f%n",
            invoiceId, invoiceIdField.getConfidence());
        }
      }

      DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
      if (customerNameField != null) {
        if (DocumentFieldType.DATE == invoiceDateField.getType()) {
          LocalDate invoiceDate = invoiceDateField.getValueAsDate();
          System.out.printf("Invoice Date: %s, confidence: %.2f%n",
            invoiceDate, invoiceDateField.getConfidence());
        }
      }

      DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
          Double invoiceTotal = invoiceTotalField.getValueAsDouble();
          System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
            invoiceTotal, invoiceTotalField.getConfidence());
        }
      }

      DocumentField invoiceItemsField = invoiceFields.get("Items");
      if (invoiceItemsField != null) {
        System.out.printf("Invoice Items: %n");
        if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
          List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
          invoiceItems.stream()
            .filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
            .map(documentField -> documentField.getValueAsMap())
            .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {

              // See a full list of fields found on an invoice here:
              // https://aka.ms/formrecognizer/invoicefields

              if ("Description".equals(key)) {
                if (DocumentFieldType.STRING == documentField.getType()) {
                  String name = documentField.getValueAsString();
                  System.out.printf("Description: %s, confidence: %.2fs%n",
                    name, documentField.getConfidence());
                }
              }
              if ("Quantity".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double quantity = documentField.getValueAsDouble();
                  System.out.printf("Quantity: %f, confidence: %.2f%n",
                    quantity, documentField.getConfidence());
                }
              }
              if ("UnitPrice".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double unitPrice = documentField.getValueAsDouble();
                  System.out.printf("Unit Price: %f, confidence: %.2f%n",
                    unitPrice, documentField.getConfidence());
                }
              }
              if ("ProductCode".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double productCode = documentField.getValueAsDouble();
                  System.out.printf("Product Code: %f, confidence: %.2f%n",
                    productCode, documentField.getConfidence());
                }
              }
            }));
        }
      }
    }
  }
}

Membangun dan menjalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—doc-intel-app.

  1. Bangun aplikasi Anda dengan build perintah :

    gradle build
    
  2. Jalankan aplikasi Anda dengan run perintah :

    gradle run
    

Output model bawaan

Berikut adalah cuplikan output yang diharapkan:

  ----------- Analyzing invoice  0 -----------
  Analyzed document has doc type invoice with confidence : 1.00
  Vendor Name: CONTOSO LTD., confidence: 0.92
  Vendor address: 123 456th St New York, NY, 10001, confidence: 0.91
  Customer Name: MICROSOFT CORPORATION, confidence: 0.84
  Customer Address Recipient: Microsoft Corp, confidence: 0.92
  Invoice ID: INV-100, confidence: 0.97
  Invoice Date: 2019-11-15, confidence: 0.97

Untuk melihat seluruh output, kunjungi repositori sampel Azure di GitHub untuk melihat output model faktur prabangun.

Tambahkan sampel kode berikut ke FormRecognizer.java file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:


import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzedDocument;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentField;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentFieldType;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;

public class FormRecognizer {

  // set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
  private static final String endpoint = "<your-endpoint>";
  private static final String key = "<your-key>";

  public static void main(String[] args) {

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

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

    SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

    for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
      AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
      Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
      System.out.printf("----------- Analyzing invoice  %d -----------%n", i);
      DocumentField vendorNameField = invoiceFields.get("VendorName");
      if (vendorNameField != null) {
        if (DocumentFieldType.STRING == vendorNameField.getType()) {
          String merchantName = vendorNameField.getValueAsString();
          System.out.printf("Vendor Name: %s, confidence: %.2f%n",
            merchantName, vendorNameField.getConfidence());
        }
      }

      DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
      if (vendorAddressField != null) {
        if (DocumentFieldType.STRING == vendorAddressField.getType()) {
          String merchantAddress = vendorAddressField.getValueAsString();
          System.out.printf("Vendor address: %s, confidence: %.2f%n",
            merchantAddress, vendorAddressField.getConfidence());
        }
      }

      DocumentField customerNameField = invoiceFields.get("CustomerName");
      if (customerNameField != null) {
        if (DocumentFieldType.STRING == customerNameField.getType()) {
          String merchantAddress = customerNameField.getValueAsString();
          System.out.printf("Customer Name: %s, confidence: %.2f%n",
            merchantAddress, customerNameField.getConfidence());
        }
      }

      DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
          String customerAddr = customerAddressRecipientField.getValueAsString();
          System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
            customerAddr, customerAddressRecipientField.getConfidence());
        }
      }

      DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
      if (invoiceIdField != null) {
        if (DocumentFieldType.STRING == invoiceIdField.getType()) {
          String invoiceId = invoiceIdField.getValueAsString();
          System.out.printf("Invoice ID: %s, confidence: %.2f%n",
            invoiceId, invoiceIdField.getConfidence());
        }
      }

      DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
      if (customerNameField != null) {
        if (DocumentFieldType.DATE == invoiceDateField.getType()) {
          LocalDate invoiceDate = invoiceDateField.getValueAsDate();
          System.out.printf("Invoice Date: %s, confidence: %.2f%n",
            invoiceDate, invoiceDateField.getConfidence());
        }
      }

      DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
      if (customerAddressRecipientField != null) {
        if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
          Double invoiceTotal = invoiceTotalField.getValueAsDouble();
          System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
            invoiceTotal, invoiceTotalField.getConfidence());
        }
      }

      DocumentField invoiceItemsField = invoiceFields.get("Items");
      if (invoiceItemsField != null) {
        System.out.printf("Invoice Items: %n");
        if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
          List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
          invoiceItems.stream()
            .filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
            .map(documentField -> documentField.getValueAsMap())
            .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {

              // See a full list of fields found on an invoice here:
              // https://aka.ms/formrecognizer/invoicefields

              if ("Description".equals(key)) {
                if (DocumentFieldType.STRING == documentField.getType()) {
                  String name = documentField.getValueAsString();
                  System.out.printf("Description: %s, confidence: %.2fs%n",
                    name, documentField.getConfidence());
                }
              }
              if ("Quantity".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double quantity = documentField.getValueAsDouble();
                  System.out.printf("Quantity: %f, confidence: %.2f%n",
                    quantity, documentField.getConfidence());
                }
              }
              if ("UnitPrice".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double unitPrice = documentField.getValueAsDouble();
                  System.out.printf("Unit Price: %f, confidence: %.2f%n",
                    unitPrice, documentField.getConfidence());
                }
              }
              if ("ProductCode".equals(key)) {
                if (DocumentFieldType.DOUBLE == documentField.getType()) {
                  Double productCode = documentField.getValueAsDouble();
                  System.out.printf("Product Code: %f, confidence: %.2f%n",
                    productCode, documentField.getConfidence());
                }
              }
            }));
        }
      }
    }
  }
}

Membangun dan menjalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi, navigasikan kembali ke direktori proyek utama Anda—doc-intel-app.

  1. Bangun aplikasi Anda dengan build perintah :

    gradle build
    
  2. Jalankan aplikasi Anda dengan run perintah :

    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, garis, kata, dan tanda pilihan seperti tombol radio dan kotak centang dalam dokumen, tanpa perlu melatih model.

  • Faktur Bawaan—Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model faktur yang telah dilatih sebelumnya.

Prasyarat

  • langganan Azure - Buat langganan secara gratis.

  • Versi terbaru Visual Studio Code atau IDE pilihan Anda. Untuk informasi selengkapnya, seeNode.js di Visual Studio Code.

  • Versi terbaru LTSNode.js.

  • Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat single-service atau multi-service layanan sumber daya Document Intelligence di portal Azure, untuk memperoleh kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.

    Tips

    Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.

  • Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.

    Cuplikan layar dari kunci dan lokasi titik akhir di portal Azure.

Mengatur

  1. Membuat aplikasi Node.js Express baru: Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat dan navigasikan ke direktori baru untuk aplikasi Anda bernama doc-intel-app.

    mkdir doc-intel-app && cd doc-intel-app
    
  2. Jalankan perintah npm init untuk menginisialisasi aplikasi dan membangun kerangka proyek Anda.

    npm init
    
  3. Tentukan atribut proyek Anda menggunakan perintah 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—mereka dapat dilewati untuk proyek ini.
    • Terima saran dalam tanda kurung dengan memilih Kembalikan atau Masukkan.
    • Setelah Anda menyelesaikan perintah, package.json file akan dibuat di direktori doc-intel-app Anda.
  1. ai-document-intelligence Instal pustaka klien dan azure/identity paket npm:

    npm i @azure-rest/ai-document-intelligence@1.1.0
    

    File aplikasi package.json Anda diperbarui dengan dependensi.

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

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

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. Buat file bernama index.js di direktori aplikasi.

    Tips

    • Anda dapat membuat file baru menggunakan PowerShell.
    • Buka jendela PowerShell di direktori proyek Anda dengan menahan tombol Shift dan mengklik kanan folder.
    • Ketik perintah berikut New-Item index.js.

Membangun aplikasi Anda

Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentIntelligenceClient kelas. Untuk melakukannya, Anda membuat AzureKeyCredential dengan key dari portal Azure dan instans DocumentIntelligenceClient dengan AzureKeyCredential dan Inteligensi Dokumen milik Anda endpoint.

Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentAnalysisClient kelas. Untuk melakukannya, Anda membuat sebuah AzureKeyCredential dengan key dari portal Azure dan sebuah instans DocumentAnalysisClient dengan AzureKeyCredential serta Form Recognizer endpoint Anda.

  1. Buka file index.js di Visual Studio Code atau IDE favorit Anda. Salin dan tempel salah satu sampel kode berikut ke dalam aplikasi Anda:

Penting

Sebaiknya autentikasi Microsoft Entra ID dengan identitas terkelola untuk sumber daya Azure untuk menghindari penyimpanan kredensial pada aplikasi Anda yang berjalan di cloud.

Gunakan kunci API dengan hati-hati. Jangan sertakan kunci API langsung dalam kode Anda, dan jangan pernah mempostingnya secara publik. Jika menggunakan kunci API, simpan dengan aman di Azure Key Vault, putar kunci secara teratur, dan batasi akses ke Azure Key Vault menggunakan kontrol akses berbasis peran dan pembatasan akses jaringan. Untuk informasi selengkapnya tentang menggunakan kunci API dengan aman di aplikasi Anda, lihat kunci API dengan Azure Key Vault.

Untuk informasi selengkapnya tentang keamanan layanan AI, lihat cara mengotentikasi permintaan ke layanan Azure AI.

Model tata letak

Ekstrak teks, tanda pilihan, gaya teks, struktur tabel, dan koordinat wilayah pembatas dari dokumen.

  • Untuk contoh ini, Anda memerlukan file dokumen dari URL. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
  • Kami telah menambahkan nilai URL file ke variabel di formUrl dekat bagian atas file.
  • Untuk menganalisis file tertentu dari URL, Anda akan menggunakan metode beginAnalyzeDocuments dan meneruskan prebuilt-layout sebagai Id model.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";

// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

async function main() {
  const client = DocumentIntelligence(endpoint, { key });

  const initialResponse = await client
    .path("/documentModels/{modelId}:analyze", "prebuilt-layout")
    .post({
      contentType: "application/json",
      body: {
        urlSource: formUrl
      },
    });

  if (isUnexpected(initialResponse)) {
    throw initialResponse.body.error;
  }

  const poller = getLongRunningPoller(client, initialResponse);
  const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;

  const pages = analyzeResult?.pages;
  const tables = analyzeResult?.tables;

  if (pages && pages.length > 0) {
    console.log("Pages:");
    for (const page of pages) {
      console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
      console.log(`  ${page.width}x${page.height}`);
      console.log(`  ${page.lines?.length || 0} lines, ${page.words?.length || 0} words`);
    }
  } else {
    console.log("No pages were extracted from the document.");
  }

  if (tables && tables.length > 0) {
    console.log("Tables:");
    for (const table of tables) {
      console.log(
        `- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
      );
    }
  } else {
    console.log("No tables were extracted from the document.");
  }
}

main().catch((error) => {
  console.error("An error occurred:", error);
  process.exit(1);
});

Jalankan aplikasi Anda

Setelah Anda menambahkan sampel kode ke aplikasi, jalankan program Anda:

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

  2. Ketik perintah berikut di terminal Anda:

    node index.js
    

Tambahkan sampel kode berikut ke index.js file. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:


 const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");

    // set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
    const key = "<your-key>";
    const endpoint = "<your-endpoint>";

    // sample document
  const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

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

    const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-layout", formUrl);

    const {
        pages,
        tables
    } = await poller.pollUntilDone();

    if (pages.length <= 0) {
        console.log("No pages were extracted from the document.");
    } else {
        console.log("Pages:");
        for (const page of pages) {
            console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
            console.log(`  ${page.width}x${page.height}, angle: ${page.angle}`);
            console.log(`  ${page.lines.length} lines, ${page.words.length} words`);
        }
    }

    if (tables.length <= 0) {
        console.log("No tables were extracted from the document.");
    } else {
        console.log("Tables:");
        for (const table of tables) {
            console.log(
                `- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
            );
        }
    }
}

main().catch((error) => {
    console.error("An error occurred:", error);
    process.exit(1);
});

Jalankan aplikasi Anda

Setelah Anda menambahkan sampel kode ke aplikasi, jalankan program Anda:

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

  2. Ketik perintah berikut di terminal Anda:

    node index.js
    

Output model tata letak

Berikut adalah cuplikan output yang diharapkan:

Pages:
- Page 1 (unit: inch)
  8.5x11, angle: 0
  69 lines, 425 words
Tables:
- Extracted table: 3 columns, 5 rows (15 cells)

Untuk melihat seluruh output, kunjungi repositori sampel Azure pada GitHub untuk melihat output model layout.

Model bawaan

Dalam contoh ini, kami menganalisis faktur menggunakan model faktur bawaan.

Tips

Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat pengambilan data model.

  • Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
  • Kami telah menambahkan nilai URL file ke invoiceUrl variabel di bagian atas file.
  • Untuk menganalisis file tertentu di URI, Anda akan menggunakan beginAnalyzeDocuments metode dan meneruskan PrebuiltModels.Invoice sebagai Id model. Nilai yang dikembalikan adalah objek yang result berisi data tentang dokumen yang dikirimkan.
  • Untuk kesederhanaan, pasangan kunci-nilai yang dikembalikan oleh layanan tidak semuanya ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";

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

async function main() {
  const client = DocumentIntelligence(endpoint, { key });

  const initialResponse = await client
    .path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
    .post({
      contentType: "application/json",
      body: {
        urlSource: invoiceUrl,
      },
    });

  if (isUnexpected(initialResponse)) {
    throw initialResponse.body.error;
  }

  const poller = getLongRunningPoller(client, initialResponse);
  const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;

  const documents = analyzeResult?.documents;

  const invoice = documents && documents[0];
  if (!invoice) {
    throw new Error("Expected at least one invoice in the result.");
  }

  console.log(
    "Extracted invoice:",
    invoice.docType,
    `(confidence: ${invoice.confidence || "<undefined>"})`
  );
  console.log("Fields:", invoice.fields);
}

main().catch((error) => {
  console.error("An error occurred:", error);
  process.exit(1);
});

Jalankan aplikasi Anda

Setelah Anda menambahkan sampel kode ke aplikasi, jalankan program Anda:

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

  2. Ketik perintah berikut di terminal Anda:

    node index.js
    

 const {
    AzureKeyCredential,
    DocumentAnalysisClient
} = require("@azure/ai-form-recognizer");

// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

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

    const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-invoice", invoiceUrl);

    const {
        pages,
        tables
    } = await poller.pollUntilDone();

    if (pages.length <= 0) {
        console.log("No pages were extracted from the document.");
    } else {
        console.log("Pages:");
        for (const page of pages) {
            console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
            console.log(`  ${page.width}x${page.height}, angle: ${page.angle}`);
            console.log(`  ${page.lines.length} lines, ${page.words.length} words`);

            if (page.lines && page.lines.length > 0) {
                console.log("  Lines:");

                for (const line of page.lines) {
                    console.log(`  - "${line.content}"`);

                    // The words of the line can also be iterated independently. The words are computed based on their
                    // corresponding spans.
                    for (const word of line.words()) {
                        console.log(`    - "${word.content}"`);
                    }
                }
            }
        }
    }

    if (tables.length <= 0) {
        console.log("No tables were extracted from the document.");
    } else {
        console.log("Tables:");
        for (const table of tables) {
            console.log(
                `- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
            );
        }
    }
}

main().catch((error) => {
    console.error("An error occurred:", error);
    process.exit(1);
});

Jalankan aplikasi Anda

Setelah Anda menambahkan sampel kode ke aplikasi, jalankan program Anda:

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

  2. Ketik perintah berikut di terminal Anda:

    node index.js
    

Output model bawaan

Berikut adalah cuplikan output yang diharapkan:

  Vendor Name: CONTOSO LTD.
  Customer Name: MICROSOFT CORPORATION
  Invoice Date: 2019-11-15T00:00:00.000Z
  Due Date: 2019-12-15T00:00:00.000Z
  Items:
  - <no product code>
    Description: Test for 23 fields
    Quantity: 1
    Date: undefined
    Unit: undefined
    Unit Price: 1
    Tax: undefined
    Amount: 100

Untuk melihat seluruh output, kunjungi repositori sampel Azure di GitHub untuk melihat output model faktur prabangun.

const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");

  // set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
      const key = "<your-key>";
      const endpoint = "<your-endpoint>";
// sample document
    invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"

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

    const poller = await client.beginAnalyzeDocument("prebuilt-invoice", invoiceUrl);

    const {
    documents: [document],
  } = await poller.pollUntilDone();


  if (document) {
    const {
      vendorName,
      customerName,
      invoiceDate,
      dueDate,
      items,
      subTotal,
      previousUnpaidBalance,
      totalTax,
      amountDue,
    } = document.fields;

    // The invoice model has many fields. For details, *see* [Invoice model field extraction](../../prebuilt/invoice.md#field-extraction)
    console.log("Vendor Name:", vendorName && vendorName.value);
    console.log("Customer Name:", customerName && customerName.value);
    console.log("Invoice Date:", invoiceDate && invoiceDate.value);
    console.log("Due Date:", dueDate && dueDate.value);

    console.log("Items:");
    for (const item of (items && items.values) || []) {
      const { productCode, description, quantity, date, unit, unitPrice, tax, amount } =
        item.properties;

      console.log("-", (productCode && productCode.value) || "<no product code>");
      console.log("  Description:", description && description.value);
      console.log("  Quantity:", quantity && quantity.value);
      console.log("  Date:", date && date.value);
      console.log("  Unit:", unit && unit.value);
      console.log("  Unit Price:", unitPrice && unitPrice.value);
      console.log("  Tax:", tax && tax.value);
      console.log("  Amount:", amount && amount.value);
    }

    console.log("Subtotal:", subTotal && subTotal.value);
    console.log("Previous Unpaid Balance:", previousUnpaidBalance && previousUnpaidBalance.value);
    console.log("Tax:", totalTax && totalTax.value);
    console.log("Amount Due:", amountDue && amountDue.value);
  } else {
    throw new Error("Expected at least one receipt in the result.");
  }
}


main().catch((error) => {
    console.error("An error occurred:", error);
    process.exit(1);
});

Jalankan aplikasi Anda

Setelah Anda menambahkan sampel kode ke aplikasi, jalankan program Anda:

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

  2. Ketik perintah berikut di terminal Anda:

    node index.js
    

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

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

  • Faktur Prabangun—Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model yang sudah dilatih sebelumnya.

Prasyarat

  • langganan Azure - Buat langganan secara gratis.

  • Python 3.7 atau yang lebih baru.

    • Penginstalan Python Anda harus menyertakan pip. Anda dapat memeriksa apakah Anda telah menginstal pip dengan menjalankan pip --version pada baris perintah. Untuk mendapatkan pip, pasanglah versi terbaru dari Python.
  • Versi terbaru Visual Studio Code atau IDE pilihan Anda. Untuk informasi selengkapnya, seeMulai dengan Python di Visual Studio Code.

  • Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat single-service atau multi-service layanan sumber daya Document Intelligence di portal Azure, untuk memperoleh kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.

Tips

Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.

  • Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.

    Cuplikan layar dari kunci dan lokasi titik akhir di portal Azure.

Mengatur

Buka jendela terminal di lingkungan lokal Anda dan instal pustaka klien Foundry Tools Azure Document Intelligence untuk Python menggunakan pip:

pip install azure-ai-documentintelligence==1.0.2

pip install azure-ai-formrecognizer==3.3.0

pip install azure-ai-formrecognizer==3.2.0b6

Membuat aplikasi Python Anda

Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans DocumentIntelligenceClient kelas. Untuk melakukannya, Anda membuat AzureKeyCredential dengan key dari portal Azure dan instans DocumentIntelligenceClient dengan AzureKeyCredential dan Inteligensi Dokumen milik Anda endpoint.

  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 instans DocumentAnalysisClient dengan AzureKeyCredential dan Inteligensi Dokumen milik Anda endpoint.

  1. Buat file Python baru yang disebut 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 ditempelkan ke dalam aplikasi Anda:

Penting

Sebaiknya autentikasi Microsoft Entra ID dengan identitas terkelola untuk sumber daya Azure untuk menghindari penyimpanan kredensial pada aplikasi Anda yang berjalan di cloud.

Gunakan kunci API dengan hati-hati. Jangan sertakan kunci API langsung dalam kode Anda, dan jangan pernah mempostingnya secara publik. Jika menggunakan kunci API, simpan dengan aman di Azure Key Vault, putar kunci secara teratur, dan batasi akses ke Azure Key Vault menggunakan kontrol akses berbasis peran dan pembatasan akses jaringan. Untuk informasi selengkapnya tentang menggunakan kunci API dengan aman di aplikasi Anda, lihat kunci API dengan Azure Key Vault.

Untuk informasi selengkapnya tentang keamanan layanan AI, lihat cara mengotentikasi permintaan ke layanan Azure AI.

Model tata letak

Ekstrak teks, tanda pilihan, gaya teks, struktur tabel, dan koordinat wilayah pembatas dari dokumen.

  • Untuk contoh ini, Anda memerlukan file dokumen dari URL. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
  • Kami telah menambahkan nilai URL file ke formUrl variabel dalam analyze_layout fungsi .

Tambahkan sampel kode berikut ke aplikasi doc_intel_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:


# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"

# helper functions

def get_words(page, line):
    result = []
    for word in page.words:
        if _in_span(word, line.spans):
            result.append(word)
    return result


def _in_span(word, spans):
    for span in spans:
        if word.span.offset >= span.offset and (
            word.span.offset + word.span.length
        ) <= (span.offset + span.length):
            return True
    return False


def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_intelligence_client = DocumentIntelligenceClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_intelligence_client.begin_analyze_document(
        "prebuilt-layout", AnalyzeDocumentRequest(url_source=formUrl
    ))

    result: AnalyzeResult = poller.result()

    if result.styles and any([style.is_handwritten for style in result.styles]):
        print("Document contains handwritten content")
    else:
        print("Document does not contain handwritten content")

    for page in result.pages:
        print(f"----Analyzing layout from page #{page.page_number}----")
        print(
            f"Page has width: {page.width} and height: {page.height}, measured with unit: {page.unit}"
        )

        if page.lines:
            for line_idx, line in enumerate(page.lines):
                words = get_words(page, line)
                print(
                    f"...Line # {line_idx} has word count {len(words)} and text '{line.content}' "
                    f"within bounding polygon '{line.polygon}'"
                )

                for word in words:
                    print(
                        f"......Word '{word.content}' has a confidence of {word.confidence}"
                    )

        if page.selection_marks:
            for selection_mark in page.selection_marks:
                print(
                    f"Selection mark is '{selection_mark.state}' within bounding polygon "
                    f"'{selection_mark.polygon}' and has a confidence of {selection_mark.confidence}"
                )

    if result.tables:
        for table_idx, table in enumerate(result.tables):
            print(
                f"Table # {table_idx} has {table.row_count} rows and "
                f"{table.column_count} columns"
            )
            if table.bounding_regions:
                for region in table.bounding_regions:
                    print(
                        f"Table # {table_idx} location on page: {region.page_number} is {region.polygon}"
                    )
            for cell in table.cells:
                print(
                    f"...Cell[{cell.row_index}][{cell.column_index}] has text '{cell.content}'"
                )
                if cell.bounding_regions:
                    for region in cell.bounding_regions:
                        print(
                            f"...content on page {region.page_number} is within bounding polygon '{region.polygon}'"
                        )

    print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()

Jalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:

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

  2. Ketik perintah berikut di terminal Anda:

    python doc_intel_quickstart.py
    

Untuk menganalisis file tertentu di URL, gunakan metode begin_analyze_document_from_url dan gunakan prebuilt-layout sebagai ID model. Nilai yang dikembalikan adalah objek yang result berisi data tentang dokumen yang dikirimkan.

Tambahkan sampel kode berikut ke aplikasi form_recognizer_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.


# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"

def format_polygon(polygon):
    if not polygon:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])

def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
            "prebuilt-layout", formUrl)
    result = poller.result()

    for idx, style in enumerate(result.styles):
        print(
            "Document contains {} content".format(
                "handwritten" if style.is_handwritten else "no handwritten"
            )
        )

    for page in result.pages:
        print("----Analyzing layout from page #{}----".format(page.page_number))
        print(
            "Page has width: {} and height: {}, measured with unit: {}".format(
                page.width, page.height, page.unit
            )
        )

        for line_idx, line in enumerate(page.lines):
            words = line.get_words()
            print(
                "...Line # {} has word count {} and text '{}' within bounding box '{}'".format(
                    line_idx,
                    len(words),
                    line.content,
                    format_polygon(line.polygon),
                )
            )

            for word in words:
                print(
                    "......Word '{}' has a confidence of {}".format(
                        word.content, word.confidence
                    )
                )

        for selection_mark in page.selection_marks:
            print(
                "...Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
                    selection_mark.state,
                    format_polygon(selection_mark.polygon),
                    selection_mark.confidence,
                )
            )

    for table_idx, table in enumerate(result.tables):
        print(
            "Table # {} has {} rows and {} columns".format(
                table_idx, table.row_count, table.column_count
            )
        )
        for region in table.bounding_regions:
            print(
                "Table # {} location on page: {} is {}".format(
                    table_idx,
                    region.page_number,
                    format_polygon(region.polygon),
                )
            )
        for cell in table.cells:
            print(
                "...Cell[{}][{}] has content '{}'".format(
                    cell.row_index,
                    cell.column_index,
                    cell.content,
                )
            )
            for region in cell.bounding_regions:
                print(
                    "...content on page {} is within bounding box '{}'".format(
                        region.page_number,
                        format_polygon(region.polygon),
                    )
                )

    print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()

Jalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:

  1. Navigasikan ke folder tempat Anda memiliki file form_recognizer_quickstart.py .

  2. Ketik perintah berikut di terminal Anda:

    python form_recognizer_quickstart.py
    

Output model tata letak

Berikut adalah cuplikan output yang diharapkan:

  ----Analyzing layout from page #1----
  Page has width: 8.5 and height: 11.0, measured with unit: inch
  ...Line # 0 has word count 2 and text 'UNITED STATES' within bounding box '[3.4915, 0.6828], [5.0116, 0.6828], [5.0116, 0.8265], [3.4915, 0.8265]'
  ......Word 'UNITED' has a confidence of 1.0
  ......Word 'STATES' has a confidence of 1.0
  ...Line # 1 has word count 4 and text 'SECURITIES AND EXCHANGE COMMISSION' within bounding box '[2.1937, 0.9061], [6.297, 0.9061], [6.297, 1.0498], [2.1937, 1.0498]'
  ......Word 'SECURITIES' has a confidence of 1.0
  ......Word 'AND' has a confidence of 1.0
  ......Word 'EXCHANGE' has a confidence of 1.0
  ......Word 'COMMISSION' has a confidence of 1.0
  ...Line # 2 has word count 3 and text 'Washington, D.C. 20549' within bounding box '[3.4629, 1.1179], [5.031, 1.1179], [5.031, 1.2483], [3.4629, 1.2483]'
  ......Word 'Washington,' has a confidence of 1.0
  ......Word 'D.C.' has a confidence of 1.0

Untuk melihat seluruh output, kunjungi repositori sampel Azure pada GitHub untuk melihat output model layout.

Tambahkan sampel kode berikut ke aplikasi form_recognizer_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.


# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"


def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-layout", formUrl
    )
    result = poller.result()

    for idx, style in enumerate(result.styles):
        print(
            "Document contains {} content".format(
                "handwritten" if style.is_handwritten else "no handwritten"
            )
        )

    for page in result.pages:
        print("----Analyzing layout from page #{}----".format(page.page_number))
        print(
            "Page has width: {} and height: {}, measured with unit: {}".format(
                page.width, page.height, page.unit
            )
        )

        for line_idx, line in enumerate(page.lines):
            words = line.get_words()
            print(
                "...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
                    line_idx,
                    len(words),
                    line.content,
                    format_polygon(line.polygon),
                )
            )

            for word in words:
                print(
                    "......Word '{}' has a confidence of {}".format(
                        word.content, word.confidence
                    )
                )

        for selection_mark in page.selection_marks:
            print(
                "...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
                    selection_mark.state,
                    format_polygon(selection_mark.polygon),
                    selection_mark.confidence,
                )
            )

    for table_idx, table in enumerate(result.tables):
        print(
            "Table # {} has {} rows and {} columns".format(
                table_idx, table.row_count, table.column_count
            )
        )
        for region in table.bounding_regions:
            print(
                "Table # {} location on page: {} is {}".format(
                    table_idx,
                    region.page_number,
                    format_polygon(region.polygon),
                )
            )
        for cell in table.cells:
            print(
                "...Cell[{}][{}] has content '{}'".format(
                    cell.row_index,
                    cell.column_index,
                    cell.content,
                )
            )
            for region in cell.bounding_regions:
                print(
                    "...content on page {} is within bounding polygon '{}'".format(
                        region.page_number,
                        format_polygon(region.polygon),
                    )
                )

    print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()


Jalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:

  1. Navigasikan ke folder tempat Anda memiliki file form_recognizer_quickstart.py .

  2. Ketik perintah berikut di terminal Anda:

    python form_recognizer_quickstart.py
    

Model bawaan

Menganalisis dan mengekstrak bidang umum dari jenis dokumen tertentu menggunakan model bawaan. Dalam contoh ini, kami menganalisis faktur menggunakan model faktur bawaan.

Tips

Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Lihat pengambilan data model.

  • Analisis faktur menggunakan model faktur bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
  • Kami telah menambahkan nilai URL file ke invoiceUrl variabel di bagian atas file.
  • Untuk kesederhanaan, pasangan kunci-nilai yang dikembalikan oleh layanan tidak semuanya ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.

Tambahkan sampel kode berikut ke aplikasi doc_intel_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda:


# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest



# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"

def analyze_invoice():
    # sample document

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

    document_intelligence_client = DocumentIntelligenceClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_intelligence_client.begin_analyze_document(
        "prebuilt-invoice", AnalyzeDocumentRequest(url_source=invoiceUrl)
    )
    invoices = poller.result()

    if invoices.documents:
        for idx, invoice in enumerate(invoices.documents):
            print(f"--------Analyzing invoice #{idx + 1}--------")
            vendor_name = invoice.fields.get("VendorName")
            if vendor_name:
                print(
                    f"Vendor Name: {vendor_name.get('content')} has confidence: {vendor_name.get('confidence')}"
                )
            vendor_address = invoice.fields.get("VendorAddress")
            if vendor_address:
                print(
                    f"Vendor Address: {vendor_address.get('content')} has confidence: {vendor_address.get('confidence')}"
                )
            vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
            if vendor_address_recipient:
                print(
                    f"Vendor Address Recipient: {vendor_address_recipient.get('content')} has confidence: {vendor_address_recipient.get('confidence')}"
                )
            customer_name = invoice.fields.get("CustomerName")
            if customer_name:
                print(
                    f"Customer Name: {customer_name.get('content')} has confidence: {customer_name.get('confidence')}"
                )
            customer_id = invoice.fields.get("CustomerId")
            if customer_id:
                print(
                    f"Customer Id: {customer_id.get('content')} has confidence: {customer_id.get('confidence')}"
                )
            customer_address = invoice.fields.get("CustomerAddress")
            if customer_address:
                print(
                    f"Customer Address: {customer_address.get('content')} has confidence: {customer_address.get('confidence')}"
                )
            customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
            if customer_address_recipient:
                print(
                    f"Customer Address Recipient: {customer_address_recipient.get('content')} has confidence: {customer_address_recipient.get('confidence')}"
                )
            invoice_id = invoice.fields.get("InvoiceId")
            if invoice_id:
                print(
                    f"Invoice Id: {invoice_id.get('content')} has confidence: {invoice_id.get('confidence')}"
                )
            invoice_date = invoice.fields.get("InvoiceDate")
            if invoice_date:
                print(
                    f"Invoice Date: {invoice_date.get('content')} has confidence: {invoice_date.get('confidence')}"
                )
            invoice_total = invoice.fields.get("InvoiceTotal")
            if invoice_total:
                print(
                    f"Invoice Total: {invoice_total.get('content')} has confidence: {invoice_total.get('confidence')}"
                )
            due_date = invoice.fields.get("DueDate")
            if due_date:
                print(
                    f"Due Date: {due_date.get('content')} has confidence: {due_date.get('confidence')}"
                )
            purchase_order = invoice.fields.get("PurchaseOrder")
            if purchase_order:
                print(
                    f"Purchase Order: {purchase_order.get('content')} has confidence: {purchase_order.get('confidence')}"
                )
            billing_address = invoice.fields.get("BillingAddress")
            if billing_address:
                print(
                    f"Billing Address: {billing_address.get('content')} has confidence: {billing_address.get('confidence')}"
                )
            billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
            if billing_address_recipient:
                print(
                    f"Billing Address Recipient: {billing_address_recipient.get('content')} has confidence: {billing_address_recipient.get('confidence')}"
                )
            shipping_address = invoice.fields.get("ShippingAddress")
            if shipping_address:
                print(
                    f"Shipping Address: {shipping_address.get('content')} has confidence: {shipping_address.get('confidence')}"
                )
            shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
            if shipping_address_recipient:
                print(
                    f"Shipping Address Recipient: {shipping_address_recipient.get('content')} has confidence: {shipping_address_recipient.get('confidence')}"
                )
            print("Invoice items:")
            for idx, item in enumerate(invoice.fields.get("Items").get("valueArray")):
                print(f"...Item #{idx + 1}")
                item_description = item.get("valueObject").get("Description")
                if item_description:
                    print(
                        f"......Description: {item_description.get('content')} has confidence: {item_description.get('confidence')}"
                    )
                item_quantity = item.get("valueObject").get("Quantity")
                if item_quantity:
                    print(
                        f"......Quantity: {item_quantity.get('content')} has confidence: {item_quantity.get('confidence')}"
                    )
                unit = item.get("valueObject").get("Unit")
                if unit:
                    print(
                        f"......Unit: {unit.get('content')} has confidence: {unit.get('confidence')}"
                    )
                unit_price = item.get("valueObject").get("UnitPrice")
                if unit_price:
                    unit_price_code = (
                        unit_price.get("valueCurrency").get("currencyCode")
                        if unit_price.get("valueCurrency").get("currencyCode")
                        else ""
                    )
                    print(
                        f"......Unit Price: {unit_price.get('content')}{unit_price_code} has confidence: {unit_price.get('confidence')}"
                    )
                product_code = item.get("valueObject").get("ProductCode")
                if product_code:
                    print(
                        f"......Product Code: {product_code.get('content')} has confidence: {product_code.get('confidence')}"
                    )
                item_date = item.get("valueObject").get("Date")
                if item_date:
                    print(
                        f"......Date: {item_date.get('content')} has confidence: {item_date.get('confidence')}"
                    )
                tax = item.get("valueObject").get("Tax")
                if tax:
                    print(
                        f"......Tax: {tax.get('content')} has confidence: {tax.get('confidence')}"
                    )
                amount = item.get("valueObject").get("Amount")
                if amount:
                    print(
                        f"......Amount: {amount.get('content')} has confidence: {amount.get('confidence')}"
                    )
            subtotal = invoice.fields.get("SubTotal")
            if subtotal:
                print(
                    f"Subtotal: {subtotal.get('content')} has confidence: {subtotal.get('confidence')}"
                )
            total_tax = invoice.fields.get("TotalTax")
            if total_tax:
                print(
                    f"Total Tax: {total_tax.get('content')} has confidence: {total_tax.get('confidence')}"
                )
            previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
            if previous_unpaid_balance:
                print(
                    f"Previous Unpaid Balance: {previous_unpaid_balance.get('content')} has confidence: {previous_unpaid_balance.get('confidence')}"
                )
            amount_due = invoice.fields.get("AmountDue")
            if amount_due:
                print(
                    f"Amount Due: {amount_due.get('content')} has confidence: {amount_due.get('confidence')}"
                )
            service_start_date = invoice.fields.get("ServiceStartDate")
            if service_start_date:
                print(
                    f"Service Start Date: {service_start_date.get('content')} has confidence: {service_start_date.get('confidence')}"
                )
            service_end_date = invoice.fields.get("ServiceEndDate")
            if service_end_date:
                print(
                    f"Service End Date: {service_end_date.get('content')} has confidence: {service_end_date.get('confidence')}"
                )
            service_address = invoice.fields.get("ServiceAddress")
            if service_address:
                print(
                    f"Service Address: {service_address.get('content')} has confidence: {service_address.get('confidence')}"
                )
            service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
            if service_address_recipient:
                print(
                    f"Service Address Recipient: {service_address_recipient.get('content')} has confidence: {service_address_recipient.get('confidence')}"
                )
            remittance_address = invoice.fields.get("RemittanceAddress")
            if remittance_address:
                print(
                    f"Remittance Address: {remittance_address.get('content')} has confidence: {remittance_address.get('confidence')}"
                )
            remittance_address_recipient = invoice.fields.get(
                "RemittanceAddressRecipient"
            )
            if remittance_address_recipient:
                print(
                    f"Remittance Address Recipient: {remittance_address_recipient.get('content')} has confidence: {remittance_address_recipient.get('confidence')}"
                )

            print("----------------------------------------")


if __name__ == "__main__":
    analyze_invoice()


Jalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:

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

  2. Ketik perintah berikut di terminal Anda:

    python doc_intel_quickstart.py
    

Untuk menganalisis file pada URI, gunakan begin_analyze_document_from_url dan berikan prebuilt-invoice sebagai ID model. Nilai yang dikembalikan adalah objek yang result berisi data tentang dokumen yang dikirimkan.

Tambahkan sampel kode berikut ke aplikasi form_recognizer_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.

# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"


def format_bounding_region(bounding_regions):
    if not bounding_regions:
        return "N/A"
    return ", ".join(
        "Page #{}: {}".format(region.page_number, format_polygon(region.polygon))
        for region in bounding_regions
    )


def format_polygon(polygon):
    if not polygon:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])


def analyze_invoice():

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

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-invoice", invoiceUrl
    )
    invoices = poller.result()

    for idx, invoice in enumerate(invoices.documents):
        print("--------Recognizing invoice #{}--------".format(idx + 1))
        vendor_name = invoice.fields.get("VendorName")
        if vendor_name:
            print(
                "Vendor Name: {} has confidence: {}".format(
                    vendor_name.value, vendor_name.confidence
                )
            )
        vendor_address = invoice.fields.get("VendorAddress")
        if vendor_address:
            print(
                "Vendor Address: {} has confidence: {}".format(
                    vendor_address.value, vendor_address.confidence
                )
            )
        vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
        if vendor_address_recipient:
            print(
                "Vendor Address Recipient: {} has confidence: {}".format(
                    vendor_address_recipient.value, vendor_address_recipient.confidence
                )
            )
        customer_name = invoice.fields.get("CustomerName")
        if customer_name:
            print(
                "Customer Name: {} has confidence: {}".format(
                    customer_name.value, customer_name.confidence
                )
            )
        customer_id = invoice.fields.get("CustomerId")
        if customer_id:
            print(
                "Customer Id: {} has confidence: {}".format(
                    customer_id.value, customer_id.confidence
                )
            )
        customer_address = invoice.fields.get("CustomerAddress")
        if customer_address:
            print(
                "Customer Address: {} has confidence: {}".format(
                    customer_address.value, customer_address.confidence
                )
            )
        customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
        if customer_address_recipient:
            print(
                "Customer Address Recipient: {} has confidence: {}".format(
                    customer_address_recipient.value,
                    customer_address_recipient.confidence,
                )
            )
        invoice_id = invoice.fields.get("InvoiceId")
        if invoice_id:
            print(
                "Invoice Id: {} has confidence: {}".format(
                    invoice_id.value, invoice_id.confidence
                )
            )
        invoice_date = invoice.fields.get("InvoiceDate")
        if invoice_date:
            print(
                "Invoice Date: {} has confidence: {}".format(
                    invoice_date.value, invoice_date.confidence
                )
            )
        invoice_total = invoice.fields.get("InvoiceTotal")
        if invoice_total:
            print(
                "Invoice Total: {} has confidence: {}".format(
                    invoice_total.value, invoice_total.confidence
                )
            )
        due_date = invoice.fields.get("DueDate")
        if due_date:
            print(
                "Due Date: {} has confidence: {}".format(
                    due_date.value, due_date.confidence
                )
            )
        purchase_order = invoice.fields.get("PurchaseOrder")
        if purchase_order:
            print(
                "Purchase Order: {} has confidence: {}".format(
                    purchase_order.value, purchase_order.confidence
                )
            )
        billing_address = invoice.fields.get("BillingAddress")
        if billing_address:
            print(
                "Billing Address: {} has confidence: {}".format(
                    billing_address.value, billing_address.confidence
                )
            )
        billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
        if billing_address_recipient:
            print(
                "Billing Address Recipient: {} has confidence: {}".format(
                    billing_address_recipient.value,
                    billing_address_recipient.confidence,
                )
            )
        shipping_address = invoice.fields.get("ShippingAddress")
        if shipping_address:
            print(
                "Shipping Address: {} has confidence: {}".format(
                    shipping_address.value, shipping_address.confidence
                )
            )
        shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
        if shipping_address_recipient:
            print(
                "Shipping Address Recipient: {} has confidence: {}".format(
                    shipping_address_recipient.value,
                    shipping_address_recipient.confidence,
                )
            )
        print("Invoice items:")
        for idx, item in enumerate(invoice.fields.get("Items").value):
            print("...Item #{}".format(idx + 1))
            item_description = item.value.get("Description")
            if item_description:
                print(
                    "......Description: {} has confidence: {}".format(
                        item_description.value, item_description.confidence
                    )
                )
            item_quantity = item.value.get("Quantity")
            if item_quantity:
                print(
                    "......Quantity: {} has confidence: {}".format(
                        item_quantity.value, item_quantity.confidence
                    )
                )
            unit = item.value.get("Unit")
            if unit:
                print(
                    "......Unit: {} has confidence: {}".format(
                        unit.value, unit.confidence
                    )
                )
            unit_price = item.value.get("UnitPrice")
            if unit_price:
                print(
                    "......Unit Price: {} has confidence: {}".format(
                        unit_price.value, unit_price.confidence
                    )
                )
            product_code = item.value.get("ProductCode")
            if product_code:
                print(
                    "......Product Code: {} has confidence: {}".format(
                        product_code.value, product_code.confidence
                    )
                )
            item_date = item.value.get("Date")
            if item_date:
                print(
                    "......Date: {} has confidence: {}".format(
                        item_date.value, item_date.confidence
                    )
                )
            tax = item.value.get("Tax")
            if tax:
                print(
                    "......Tax: {} has confidence: {}".format(tax.value, tax.confidence)
                )
            amount = item.value.get("Amount")
            if amount:
                print(
                    "......Amount: {} has confidence: {}".format(
                        amount.value, amount.confidence
                    )
                )
        subtotal = invoice.fields.get("SubTotal")
        if subtotal:
            print(
                "Subtotal: {} has confidence: {}".format(
                    subtotal.value, subtotal.confidence
                )
            )
        total_tax = invoice.fields.get("TotalTax")
        if total_tax:
            print(
                "Total Tax: {} has confidence: {}".format(
                    total_tax.value, total_tax.confidence
                )
            )
        previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
        if previous_unpaid_balance:
            print(
                "Previous Unpaid Balance: {} has confidence: {}".format(
                    previous_unpaid_balance.value, previous_unpaid_balance.confidence
                )
            )
        amount_due = invoice.fields.get("AmountDue")
        if amount_due:
            print(
                "Amount Due: {} has confidence: {}".format(
                    amount_due.value, amount_due.confidence
                )
            )
        service_start_date = invoice.fields.get("ServiceStartDate")
        if service_start_date:
            print(
                "Service Start Date: {} has confidence: {}".format(
                    service_start_date.value, service_start_date.confidence
                )
            )
        service_end_date = invoice.fields.get("ServiceEndDate")
        if service_end_date:
            print(
                "Service End Date: {} has confidence: {}".format(
                    service_end_date.value, service_end_date.confidence
                )
            )
        service_address = invoice.fields.get("ServiceAddress")
        if service_address:
            print(
                "Service Address: {} has confidence: {}".format(
                    service_address.value, service_address.confidence
                )
            )
        service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
        if service_address_recipient:
            print(
                "Service Address Recipient: {} has confidence: {}".format(
                    service_address_recipient.value,
                    service_address_recipient.confidence,
                )
            )
        remittance_address = invoice.fields.get("RemittanceAddress")
        if remittance_address:
            print(
                "Remittance Address: {} has confidence: {}".format(
                    remittance_address.value, remittance_address.confidence
                )
            )
        remittance_address_recipient = invoice.fields.get("RemittanceAddressRecipient")
        if remittance_address_recipient:
            print(
                "Remittance Address Recipient: {} has confidence: {}".format(
                    remittance_address_recipient.value,
                    remittance_address_recipient.confidence,
                )
            )

        print("----------------------------------------")

if __name__ == "__main__":
    analyze_invoice()


Jalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:

  1. Navigasikan ke folder tempat Anda memiliki file form_recognizer_quickstart.py .

  2. Ketik perintah berikut di terminal Anda:

    python form_recognizer_quickstart.py
    

Output model bawaan

Berikut adalah cuplikan output yang diharapkan:

  --------Recognizing invoice #1--------
  Vendor Name: CONTOSO LTD. has confidence: 0.919
  Vendor Address: 123 456th St New York, NY, 10001 has confidence: 0.907
  Vendor Address Recipient: Contoso Headquarters has confidence: 0.919
  Customer Name: MICROSOFT CORPORATION has confidence: 0.84
  Customer Id: CID-12345 has confidence: 0.956
  Customer Address: 123 Other St, Redmond WA, 98052 has confidence: 0.909
  Customer Address Recipient: Microsoft Corp has confidence: 0.917
  Invoice Id: INV-100 has confidence: 0.972
  Invoice Date: 2019-11-15 has confidence: 0.971
  Invoice Total: CurrencyValue(amount=110.0, symbol=$) has confidence: 0.97
  Due Date: 2019-12-15 has confidence: 0.973

Untuk melihat seluruh output, kunjungi repositori sampel Azure di GitHub untuk melihat output model faktur prabangun.

Tambahkan sampel kode berikut ke aplikasi form_recognizer_quickstart.py Anda. Pastikan Anda memperbarui variabel kunci dan titik akhir dengan nilai dari instans Form Recognizer di portal Azure Anda.


# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"


def format_polygon(polygon):
    if not polygon:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])


def analyze_layout():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-layout", formUrl
    )
    result = poller.result()

    for idx, style in enumerate(result.styles):
        print(
            "Document contains {} content".format(
                "handwritten" if style.is_handwritten else "no handwritten"
            )
        )


for page in result.pages:
    print("----Analyzing layout from page #{}----".format(page.page_number))
    print(
        "Page has width: {} and height: {}, measured with unit: {}".format(
            page.width, page.height, page.unit
        )
    )

    for line_idx, line in enumerate(page.lines):
        words = line.get_words()
        print(
            "...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
                line_idx,
                len(words),
                line.content,
                format_polygon(line.polygon),
            )
        )

        for word in words:
            print(
                "......Word '{}' has a confidence of {}".format(
                    word.content, word.confidence
                )
            )

    for selection_mark in page.selection_marks:
        print(
            "...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
                selection_mark.state,
                format_polygon(selection_mark.polygon),
                selection_mark.confidence,
            )
        )

for table_idx, table in enumerate(result.tables):
    print(
        "Table # {} has {} rows and {} columns".format(
            table_idx, table.row_count, table.column_count
        )
    )
    for region in table.bounding_regions:
        print(
            "Table # {} location on page: {} is {}".format(
                table_idx,
                region.page_number,
                format_polygon(region.polygon),
            )
        )
    for cell in table.cells:
        print(
            "...Cell[{}][{}] has content '{}'".format(
                cell.row_index,
                cell.column_index,
                cell.content,
            )
        )
        for region in cell.bounding_regions:
            print(
                "...content on page {} is within bounding polygon '{}'".format(
                    region.page_number,
                    format_polygon(region.polygon),
                )
            )

print("----------------------------------------")


if __name__ == "__main__":
    analyze_layout()


Jalankan aplikasi

Setelah Anda menambahkan sampel kode ke aplikasi Anda, buat dan jalankan program Anda:

  1. Navigasikan ke folder tempat Anda memiliki file form_recognizer_quickstart.py .

  2. Ketik perintah berikut di terminal Anda:

    python form_recognizer_quickstart.py
    

Dalam panduan singkat ini, belajarlah cara menggunakan REST API Kecerdasan Dokumen untuk menganalisis dan mengekstrak data dan nilai dari dokumen.

Prasyarat

  • langganan Azure - Buat langganan secara gratis

  • Alat baris perintah 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 Foundry Tools (multi-layanan). Setelah Anda memiliki langganan Azure, buat single-service atau multi-service layanan sumber daya Document Intelligence di portal Azure, untuk memperoleh kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.

Tips

Buat sumber daya Microsoft Foundry jika Anda berencana mengakses beberapa Foundry Tools di bawah satu titik akhir/kunci. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Anda memerlukan sumber daya layanan tunggal jika Anda ingin menggunakan autentikasi Microsoft Entra.

  • Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.

    Cuplikan layar dari kunci dan lokasi titik akhir di portal Azure.

Menganalisis dokumen dan mendapatkan hasil

Permintaan POST digunakan untuk menganalisis dokumen dengan model bawaan atau kustom. Permintaan GET digunakan untuk mengambil hasil panggilan analisis dokumen. modelId digunakan dengan POST dan resultId dengan operasi GET.

Analisis dokumen (Permintaan POST)

Sebelum Anda menjalankan perintah cURL, buat perubahan berikut pada permintaan posting:

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

  2. Ganti {key} dengan nilai kunci dari instans Kecerdasan Dokumen portal Azure 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} {your-document-url}
Membaca prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Tata letak prebuilt-layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Kartu asuransi kesehatan prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
W-2 prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Faktur prebuilt-invoice https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Tanda terima prebuilt-receipt https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Dokumen Identitas prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

Contoh dokumen

Fitur {modelID} {your-document-url}
Dokumen Umum prebuilt-document https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Membaca prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Tata letak prebuilt-layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Kartu asuransi kesehatan prebuilt-healthInsuranceCard.us https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png
W-2 prebuilt-tax.us.w2 https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png
Faktur prebuilt-invoice https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Tanda terima prebuilt-receipt https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Dokumen Identitas prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png
Kartu nama prebuilt-businessCard https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg

Penting

Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihatKeamanan Foundry Tools.

Permintaan POST

curl -v -i -X POST "{endpoint}/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-11-30" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelID}:analyze?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelId}:analyze?api-version=2022-08-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"

Respons POST (resultID)

Anda menerima 202 (Success) respons yang menyertakan header Operation-Location yang hanya dapat dibaca. Nilai header ini berisi resultID yang dapat dikueri untuk mendapatkan status operasi asinkron dan mengambil hasilnya menggunakan permintaan GET dengan kunci langganan sumber daya yang sama:

{alt-text}

Mendapatkan hasil analisis (Permintaan GET)

Setelah Anda memanggil Analyze document API, panggil Get analyze result API untuk mendapatkan status operasi dan data yang diekstrak. Sebelum Anda menjalankan perintah, buat perubahan ini:

Setelah Anda memanggil Analyze document API, panggil Get analyze result API untuk mendapatkan status operasi dan data yang diekstrak. Sebelum Anda menjalankan perintah, buat perubahan ini:

Setelah Anda memanggil Analyze document API, panggil Get analyze result API untuk mendapatkan status operasi dan data yang diekstrak. Sebelum Anda menjalankan perintah, buat perubahan ini:

  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-11-30" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2023-07-31" -H "Ocp-Apim-Subscription-Key: {key}"

curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2022-08-31" -H "Ocp-Apim-Subscription-Key: {key}"

Memeriksa respons

Anda menerima 200 (Success) respons dengan output JSON. Bidang pertama, "status", menunjukkan status operasi. Jika operasi tidak selesai, nilainya "status" adalah "running" atau "notStarted", dan Anda harus memanggil API lagi, baik secara manual atau melalui skrip. Kami merekomendasikan interval satu detik atau lebih antara panggilan.

Sampel respons untuk faktur bawaan

{
    "status": "succeeded",
    "createdDateTime": "2024-03-25T19:31:37Z",
    "lastUpdatedDateTime": "2024-03-25T19:31:43Z",
    "analyzeResult": {
        "apiVersion": "2024-11-30",
        "modelId": "prebuilt-invoice",
        "stringIndexType": "textElements"...
    ..."pages": [
            {
                "pageNumber": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "words": [
                    {
                        "content": "CONTOSO",
                        "boundingBox": [
                            0.5911,
                            0.6857,
                            1.7451,
                            0.6857,
                            1.7451,
                            0.8664,
                            0.5911,
                            0.8664
                        ],
                        "confidence": 1,
                        "span": {
                            "offset": 0,
                            "length": 7
                                }
                      }],
              }]
      }
}
{
    "status": "succeeded",
    "createdDateTime": "2023-08-25T19:31:37Z",
    "lastUpdatedDateTime": "2023-08-25T19:31:43Z",
    "analyzeResult": {
        "apiVersion": "2023-07-31",
        "modelId": "prebuilt-invoice",
        "stringIndexType": "textElements"...
    ..."pages": [
            {
                "pageNumber": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "words": [
                    {
                        "content": "CONTOSO",
                        "boundingBox": [
                            0.5911,
                            0.6857,
                            1.7451,
                            0.6857,
                            1.7451,
                            0.8664,
                            0.5911,
                            0.8664
                        ],
                        "confidence": 1,
                        "span": {
                            "offset": 0,
                            "length": 7
                                }
                      }],
              }]
      }
}
{
    "status": "succeeded",
    "createdDateTime": "2022-09-25T19:31:37Z",
    "lastUpdatedDateTime": "2022-09-25T19:31:43Z",
    "analyzeResult": {
        "apiVersion": "2022-08-31",
        "modelId": "prebuilt-invoice",
        "stringIndexType": "textElements"...
    ..."pages": [
            {
                "pageNumber": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "words": [
                    {
                        "content": "CONTOSO",
                        "boundingBox": [
                            0.5911,
                            0.6857,
                            1.7451,
                            0.6857,
                            1.7451,
                            0.8664,
                            0.5911,
                            0.8664
                        ],
                        "confidence": 1,
                        "span": {
                            "offset": 0,
                            "length": 7
                                }
                      }],
              }]
      }
}

Bidang dokumen yang didukung

Model bawaan mengekstrak set bidang dokumen yang telah ditentukan sebelumnya. Lihat Ekstraksi data model untuk nama bidang, jenis, deskripsi, dan contoh yang diekstrak.

Itu saja, selamat!

Dalam panduan kilat ini, Anda menggunakan model kecerdasan dokumen untuk menganalisis berbagai formulir dan dokumen. Selanjutnya, jelajahi Studio Kecerdasan Dokumen dan dokumentasi referensi untuk mempelajari TENTANG API Kecerdasan Dokumen secara mendalam.

Langkah berikutnya

Konten ini berlaku untuk:red-checkmarkv2.1 | Versi terbaru:blue-checkmarkv4.0 (GA)

Mulai menggunakan Azure Kecerdasan Dokumen menggunakan bahasa pemrograman pilihan Anda atau REST API. Kecerdasan Dokumen adalah layanan Foundry Tools berbasis cloud yang menggunakan pembelajaran mesin untuk mengekstrak pasangan kunci-nilai, teks, dan tabel dari dokumen Anda. Kami menyarankan agar Anda menggunakan layanan gratis saat mempelajari teknologi. Ingatlah bahwa jumlah halaman gratis dibatasi hingga 500 per bulan.

Untuk mempelajari selengkapnya tentang fitur Dan opsi pengembangan Kecerdasan Dokumen, kunjungi halaman Gambaran Umum kami.

Dokumentasi referensi | Kode sumber pustaka | Paket (NuGet) | Contoh-contoh

Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:

Prasyarat

  • langganan Azure - Buat langganan secara gratis.

  • Versi saat ini Visual Studio IDE.

  • Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau layanan multi di portal Azure untuk mendapatkan kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.

    Tips

    Buat sumber daya foundry jika Anda berencana untuk mengakses beberapa Foundry Tools dengan satu kunci/titik akhir. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda berniat menggunakan autentikasi Microsoft Entra.

  • Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.

    Cuplikan layar dari kunci dan lokasi titik akhir di portal Azure.

Mengatur

  1. Mulai Visual Studio 2019.

  2. Pada halaman mulai, pilih Buat proyek baru.

    Tangkapan 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 pembuatan proyek baru di Visual Studio.

  4. Di jendela dialog Konfigurasi project baru Anda, masukkan formRecognizer_quickstart di kotak nama Project. Lalu 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.

    Screenshot Visual Studio jendela dialog informasi tambahan.

Menginstal pustaka klien dengan NuGet

  1. Klik kanan pada 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 dari menu dropdown dan pilih Instal.

Membangun aplikasi Anda

Untuk berinteraksi dengan layanan Kecerdasan Dokumen, Anda perlu membuat instans FormRecognizerClient kelas. Untuk melakukannya, Anda membuat sebuah AzureKeyCredential dengan kunci Anda dan sebuah instance FormRecognizerClient dengan AzureKeyCredential dan Dokumen Kecerdasan endpoint Anda.

Catatan

  • Dimulai dengan .NET 6, proyek baru yang menggunakan templat console menghasilkan gaya program baru yang berbeda dari versi sebelumnya.
  • Output baru menggunakan fitur C# terbaru yang menyederhanakan kode yang perlu Anda tulis.
  • Ketika Anda menggunakan versi yang lebih baru, Anda hanya perlu menulis isi Main metode . Anda tidak perlu menyertakan pernyataan tingkat teratas, direktif menggunakan global, atau direktif menggunakan implisit.
  • Untuk informasi selengkapnya, lihatTemplat C# baru menghasilkan pernyataan tingkat atas.
  1. Buka file Program.cs .

  2. Sertakan berikut ini menggunakan direktif:

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("Halo Dunia!"); , dan tambahkan salah satu sampel kode Try It ke file Program.cs:

    Cuplikan layar tambahkan kode sampel ke metode Utama.

  2. Pilih sampel kode untuk disalin dan ditempelkan ke metode Utama aplikasi Anda:

Penting

Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat artikel keamanan Foundry Tools.

Coba: Model tata letak

Ekstrak teks, tanda pilihan, gaya teks, dan struktur tabel, bersama dengan koordinat wilayah pembatasnya dari dokumen.

  • Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
  • Kami telah menambahkan nilai URI file ke formUri variabel .
  • Untuk mengekstrak tata letak dari file yang ditentukan di URI, gunakan metode StartRecognizeContentFromUriAsync.

Tambahkan kode berikut ke file Program.cs aplikasi tata letak Anda:


FormRecognizerClient recognizerClient = AuthenticateClient();

Task recognizeContent = RecognizeContent(recognizerClient);
Task.WaitAll(recognizeContent);

private static FormRecognizerClient AuthenticateClient()
            {
                var credential = new AzureKeyCredential(key);
                var client = new FormRecognizerClient(new Uri(endpoint), credential);
                return client;
            }

            private static async Task RecognizeContent(FormRecognizerClient recognizerClient)
        {
            string formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
            FormPageCollection formPages = await recognizerClient
        .StartRecognizeContentFromUri(new Uri(formUrl))
        .WaitForCompletionAsync();

            foreach (FormPage page in formPages)
            {
                Console.WriteLine($"Form Page {page.PageNumber} has {page.Lines.Count} lines.");

                for (int i = 0; i < page.Lines.Count; i++)
                {
                    FormLine line = page.Lines[i];
                    Console.WriteLine($"    Line {i} has {line.Words.Count} word{(line.Words.Count > 1 ? "s" : "")}, and text: '{line.Text}'.");
                }

                for (int i = 0; i < page.Tables.Count; i++)
                {
                    FormTable table = page.Tables[i];
                    Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
                    foreach (FormTableCell cell in table.Cells)
                    {
                        Console.WriteLine($"    Cell ({cell.RowIndex}, {cell.ColumnIndex}) contains text: '{cell.Text}'.");
                    }
                }
            }
        }
    }
}

Coba: Model bawaan

Sampel ini menunjukkan cara menganalisis data dari jenis dokumen umum tertentu dengan model yang telah dilatih sebelumnya, menggunakan faktur sebagai contoh.

  • Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
  • Kami telah menambahkan nilai URI file ke invoiceUri variabel di bagian atas metode Utama.
  • Untuk menganalisis file tertentu di URI, gunakan StartRecognizeInvoicesFromUriAsync metode .
  • Untuk kesederhanaan, tidak semua field yang dikembalikan oleh layanan ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.

Pilih model bawaan

Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan untuk operasi analisis tergantung pada jenis dokumen yang akan dianalisis. Berikut adalah model bawaan yang saat ini didukung oleh layanan Kecerdasan Dokumen:

  • Faktur: mengekstrak teks, tanda pilihan, tabel, bidang, dan informasi utama dari faktur.
  • Tanda terima: mengekstrak teks dan informasi kunci dari tanda terima.
  • Dokumen ID: mengekstrak teks dan informasi utama dari SIM dan paspor internasional.
  • Kartu nama: mengekstrak teks dan informasi utama dari kartu nama.

Tambahkan kode berikut ke dalam metode file Program.cs aplikasi faktur bawaan Anda

FormRecognizerClient recognizerClient = AuthenticateClient();

  Task analyzeinvoice = AnalyzeInvoice(recognizerClient, invoiceUrl);
  Task.WaitAll(analyzeinvoice);

   private static FormRecognizerClient AuthenticateClient() {
     var credential = new AzureKeyCredential(key);
     var client = new FormRecognizerClient(new Uri(endpoint), credential);
     return client;
   }

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

   private static async Task AnalyzeInvoice(FormRecognizerClient recognizerClient, string invoiceUrl) {
     var options = new RecognizeInvoicesOptions() {
       Locale = "en-US"
     };
     RecognizedFormCollection invoices = await recognizerClient.StartRecognizeInvoicesFromUriAsync(new Uri(invoiceUrl), options).WaitForCompletionAsync();

     RecognizedForm invoice = invoices[0];

     FormField invoiceIdField;
     if (invoice.Fields.TryGetValue("InvoiceId", out invoiceIdField)) {
       if (invoiceIdField.Value.ValueType == FieldValueType.String) {
         string invoiceId = invoiceIdField.Value.AsString();
         Console.WriteLine($"    Invoice Id: '{invoiceId}', with confidence {invoiceIdField.Confidence}");
       }
     }

     FormField invoiceDateField;
     if (invoice.Fields.TryGetValue("InvoiceDate", out invoiceDateField)) {
       if (invoiceDateField.Value.ValueType == FieldValueType.Date) {
         DateTime invoiceDate = invoiceDateField.Value.AsDate();
         Console.WriteLine($"    Invoice Date: '{invoiceDate}', with confidence {invoiceDateField.Confidence}");
       }
     }

     FormField dueDateField;
     if (invoice.Fields.TryGetValue("DueDate", out dueDateField)) {
       if (dueDateField.Value.ValueType == FieldValueType.Date) {
         DateTime dueDate = dueDateField.Value.AsDate();
         Console.WriteLine($"    Due Date: '{dueDate}', with confidence {dueDateField.Confidence}");
       }
     }

     FormField vendorNameField;
     if (invoice.Fields.TryGetValue("VendorName", out vendorNameField)) {
       if (vendorNameField.Value.ValueType == FieldValueType.String) {
         string vendorName = vendorNameField.Value.AsString();
         Console.WriteLine($"    Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
       }
     }

     FormField vendorAddressField;
     if (invoice.Fields.TryGetValue("VendorAddress", out vendorAddressField)) {
       if (vendorAddressField.Value.ValueType == FieldValueType.String) {
         string vendorAddress = vendorAddressField.Value.AsString();
         Console.WriteLine($"    Vendor Address: '{vendorAddress}', with confidence {vendorAddressField.Confidence}");
       }
     }

     FormField customerNameField;
     if (invoice.Fields.TryGetValue("CustomerName", out customerNameField)) {
       if (customerNameField.Value.ValueType == FieldValueType.String) {
         string customerName = customerNameField.Value.AsString();
         Console.WriteLine($"    Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
       }
     }

     FormField customerAddressField;
     if (invoice.Fields.TryGetValue("CustomerAddress", out customerAddressField)) {
       if (customerAddressField.Value.ValueType == FieldValueType.String) {
         string customerAddress = customerAddressField.Value.AsString();
         Console.WriteLine($"    Customer Address: '{customerAddress}', with confidence {customerAddressField.Confidence}");
       }
     }

     FormField customerAddressRecipientField;
     if (invoice.Fields.TryGetValue("CustomerAddressRecipient", out customerAddressRecipientField)) {
       if (customerAddressRecipientField.Value.ValueType == FieldValueType.String) {
         string customerAddressRecipient = customerAddressRecipientField.Value.AsString();
         Console.WriteLine($"    Customer address recipient: '{customerAddressRecipient}', with confidence {customerAddressRecipientField.Confidence}");
       }
     }

     FormField invoiceTotalField;
     if (invoice.Fields.TryGetValue("InvoiceTotal", out invoiceTotalField)) {
       if (invoiceTotalField.Value.ValueType == FieldValueType.Float) {
         float invoiceTotal = invoiceTotalField.Value.AsFloat();
         Console.WriteLine($"    Invoice Total: '{invoiceTotal}', with confidence {invoiceTotalField.Confidence}");
       }
     }
   }
 }
}

Jalankan aplikasi Anda

Pilih tombol Mulai hijau di samping formRecognizer_quickstart untuk membangun dan menjalankan program Anda, atau tekan F5.

Screenshot menjalankan program Visual Studio Anda.

Dokumentasi Referensi | Kode sumber pustaka | Package (Maven) | Contoh

Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:

Prasyarat

  • langganan Azure - Buat langganan secara gratis.

  • Kit Pengembangan Java (JDK) versi 8 atau yang lebih baru. Untuk informasi selengkapnya, lihatVersi Java yang didukung dan jadwal pembaruan.

  • Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau layanan multi di portal Azure untuk mendapatkan kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.

  • Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.

    Cuplikan layar dari kunci dan lokasi titik akhir di portal Azure.

Mengatur

Membuat proyek Gradle baru

Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat direktori baru untuk aplikasi Anda yang disebut form-recognizer-app, dan navigasikan ke dalamnya.

mkdir form-recognizer-app && form-recognizer-app
  1. Jalankan gradle init perintah dari direktori kerja Anda. Perintah ini membuat file build penting untuk Gradle, termasuk build.gradle.kts, yang digunakan pada runtime untuk membuat dan mengonfigurasi aplikasi Anda.

    gradle init --type basic
    
  2. Saat diminta untuk memilih DSL, pilih Kotlin.

  3. Terima nama proyek default (form-recognizer-app)

Menginstal pustaka klien

Panduan cepat ini menggunakan manajer dependensi Gradle. Anda dapat menemukan pustaka klien dan informasi untuk manajer dependensi lain di Repositori Pusat Maven.

Dalam file build.gradle.kts proyek Anda, sertakan pustaka klien sebagai implementation pernyataan, bersama dengan plugin dan pengaturan yang diperlukan.

plugins {
    java
    application
}
application {
    mainClass.set("FormRecognizer")
}
repositories {
    mavenCentral()
}
dependencies {
    implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}

Membuat file Java

Dari direktori kerja Anda, jalankan perintah berikut:

mkdir -p src/main/java

Anda membuat struktur direktori berikut:

Screenshot dari struktur direktori Java aplikasi.

Navigasi ke direktori Java dan buat file yang disebut FormRecognizer.java. Buka di editor atau IDE pilihan Anda dan tambahkan deklarasi dan import pernyataan paket berikut:

import com.azure.ai.formrecognizer.*;
import com.azure.ai.formrecognizer.models.*;

import java.util.concurrent.atomic.AtomicReference;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.Context;
import com.azure.core.util.polling.SyncPoller;

Pilih sampel kode untuk disalin dan ditempelkan ke metode utama aplikasi Anda:

Penting

Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihatKeamanan Foundry Tools.

Coba: Model tata letak

Ekstrak teks, tanda pilihan, gaya teks, dan struktur tabel, bersama dengan koordinat wilayah pembatasnya dari dokumen.

  • Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
  • Untuk menganalisis file tertentu di URI, Anda akan menggunakan metode .beginRecognizeContentFromUrl
  • Kami telah menambahkan nilai URI file ke formUrl variabel dalam metode utama.

Perbarui kelas FormRecognizer aplikasi Anda, dengan kode berikut (pastikan untuk memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda):


static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";

public static void main(String[] args) {FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder()
                .credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();

    String formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";

    System.out.println("Get form content...");
        GetContent(recognizerClient, formUrl);
  }
    private static void GetContent(FormRecognizerClient recognizerClient, String invoiceUri) {
        String analyzeFilePath = invoiceUri;
        SyncPoller<FormRecognizerOperationResult, List<FormPage>> recognizeContentPoller = recognizerClient
                .beginRecognizeContentFromUrl(analyzeFilePath);

        List<FormPage> contentResult = recognizeContentPoller.getFinalResult();
        // </snippet_getcontent_call>
        // <snippet_getcontent_print>
        contentResult.forEach(formPage -> {
            // Table information
            System.out.println("----Recognizing content ----");
            System.out.printf("Has width: %f and height: %f, measured with unit: %s.%n", formPage.getWidth(),
                    formPage.getHeight(), formPage.getUnit());
            formPage.getTables().forEach(formTable -> {
                System.out.printf("Table has %d rows and %d columns.%n", formTable.getRowCount(),
                        formTable.getColumnCount());
                formTable.getCells().forEach(formTableCell -> {
                    System.out.printf("Cell has text %s.%n", formTableCell.getText());
                });
                System.out.println();
            });
        });
    }

Coba: Model bawaan

Sampel ini menunjukkan cara menganalisis data dari jenis dokumen umum tertentu dengan model yang telah dilatih sebelumnya, menggunakan faktur sebagai contoh.

  • Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
  • Untuk menganalisis file tertentu di URI, Anda akan menggunakan beginRecognizeInvoicesFromUrl .
  • Kami telah menambahkan nilai URI file ke invoiceUrl variabel dalam metode utama.
  • Untuk kesederhanaan, tidak semua field yang dikembalikan oleh layanan ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.

Pilih model bawaan

Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Berikut adalah model bawaan yang saat ini didukung oleh layanan Kecerdasan Dokumen:

  • Faktur: mengekstrak teks, tanda pilihan, tabel, bidang, dan informasi utama dari faktur.
  • Tanda terima: mengekstrak teks dan informasi kunci dari tanda terima.
  • Dokumen ID: mengekstrak teks dan informasi utama dari SIM dan paspor internasional.
  • Kartu nama: mengekstrak teks dan informasi utama dari kartu nama.

Perbarui kelas FormRecognizer aplikasi Anda, dengan kode berikut (pastikan untuk memperbarui variabel kunci dan titik akhir dengan nilai dari instans Kecerdasan Dokumen portal Azure Anda):


static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";

public static void main(String[] args) {
    FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder().credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();

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

    System.out.println("Analyze invoice...");
        AnalyzeInvoice(recognizerClient, invoiceUrl);
  }
    private static void AnalyzeInvoice(FormRecognizerClient recognizerClient, String invoiceUrl) {
      SyncPoller < FormRecognizerOperationResult,
        List < RecognizedForm >> recognizeInvoicesPoller = recognizerClient.beginRecognizeInvoicesFromUrl(invoiceUrl);
      List < RecognizedForm > recognizedInvoices = recognizeInvoicesPoller.getFinalResult();

      for (int i = 0; i < recognizedInvoices.size(); i++) {
        RecognizedForm recognizedInvoice = recognizedInvoices.get(i);
        Map < String,
        FormField > recognizedFields = recognizedInvoice.getFields();
        System.out.printf("----------- Recognized invoice info for page %d -----------%n", i);
        FormField vendorNameField = recognizedFields.get("VendorName");
        if (vendorNameField != null) {
            if (FieldValueType.STRING == vendorNameField.getValue().getValueType()) {
                String merchantName = vendorNameField.getValue().asString();
                System.out.printf("Vendor Name: %s, confidence: %.2f%n", merchantName, vendorNameField.getConfidence());
            }
        }

        FormField vendorAddressField = recognizedFields.get("VendorAddress");
        if (vendorAddressField != null) {
            if (FieldValueType.STRING == vendorAddressField.getValue().getValueType()) {
                String merchantAddress = vendorAddressField.getValue().asString();
                System.out.printf("Vendor address: %s, confidence: %.2f%n", merchantAddress, vendorAddressField.getConfidence());
            }
        }

        FormField customerNameField = recognizedFields.get("CustomerName");
        if (customerNameField != null) {
            if (FieldValueType.STRING == customerNameField.getValue().getValueType()) {
                String merchantAddress = customerNameField.getValue().asString();
                System.out.printf("Customer Name: %s, confidence: %.2f%n", merchantAddress, customerNameField.getConfidence());
            }
        }

        FormField customerAddressRecipientField = recognizedFields.get("CustomerAddressRecipient");
        if (customerAddressRecipientField != null) {
            if (FieldValueType.STRING == customerAddressRecipientField.getValue().getValueType()) {
                String customerAddr = customerAddressRecipientField.getValue().asString();
                System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n", customerAddr, customerAddressRecipientField.getConfidence());
            }
        }

        FormField invoiceIdField = recognizedFields.get("InvoiceId");
        if (invoiceIdField != null) {
            if (FieldValueType.STRING == invoiceIdField.getValue().getValueType()) {
                String invoiceId = invoiceIdField.getValue().asString();
                System.out.printf("Invoice Id: %s, confidence: %.2f%n", invoiceId, invoiceIdField.getConfidence());
            }
        }

        FormField invoiceDateField = recognizedFields.get("InvoiceDate");
        if (customerNameField != null) {
            if (FieldValueType.DATE == invoiceDateField.getValue().getValueType()) {
                LocalDate invoiceDate = invoiceDateField.getValue().asDate();
                System.out.printf("Invoice Date: %s, confidence: %.2f%n", invoiceDate, invoiceDateField.getConfidence());
            }
        }

        FormField invoiceTotalField = recognizedFields.get("InvoiceTotal");
        if (customerAddressRecipientField != null) {
            if (FieldValueType.FLOAT == invoiceTotalField.getValue().getValueType()) {
                Float invoiceTotal = invoiceTotalField.getValue().asFloat();
                System.out.printf("Invoice Total: %.2f, confidence: %.2f%n", invoiceTotal, invoiceTotalField.getConfidence());
            }
        }
    }
}

Membangun dan menjalankan aplikasi Anda

Navigasikan kembali ke direktori proyek utama Anda—form-recognizer-app.

  1. Bangun aplikasi Anda dengan build perintah :
gradle build
  1. Jalankan aplikasi Anda dengan run perintah :
gradle run

Dokumentasi Referensi | Kode Sumber Pustaka | Package (npm) | Sampel

Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:

Prasyarat

  • langganan Azure - Buat langganan secara gratis.

  • Versi terbaru Visual Studio Code atau IDE pilihan Anda.

  • Versi terbaru LTSNode.js

  • Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau layanan multi di portal Azure untuk mendapatkan kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.

    Tips

    Buat sumber daya foundry jika Anda berencana untuk mengakses beberapa Foundry Tools dengan satu kunci/titik akhir. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda berniat menggunakan autentikasi Microsoft Entra.

  • Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.

    Cuplikan layar dari kunci dan lokasi titik akhir di portal Azure.

Mengatur

  1. Buat aplikasi Node.js baru. Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat direktori baru untuk aplikasi Anda, dan navigasikan ke dalamnya.

    mkdir form-recognizer-app && cd form-recognizer-app
    
  2. Jalankan perintah npm init untuk membuat aplikasi Node menggunakan file package.json.

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

    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:

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. Buat variabel untuk titik akhir dan kunci Azure sumber daya Anda:

    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    
  6. Pada titik ini, aplikasi JavaScript Anda harus berisi baris kode berikut:

    
    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    

Pilih sampel kode untuk disalin dan ditempelkan ke aplikasi Anda:

Penting

Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihatKeamanan Foundry Tools.

Coba: Model tata letak

  • Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
  • Kami telah menambahkan nilai URI file ke variabel di formUrl 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 key variabel

const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";

async function recognizeContent() {
    const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));
    const poller = await client.beginRecognizeContentFromUrl(formUrl);
    const pages = await poller.pollUntilDone();

    if (!pages || pages.length === 0) {
        throw new Error("Expecting non-empty list of pages!");
    }

    for (const page of pages) {
        console.log(
            `Page ${page.pageNumber}: width ${page.width} and height ${page.height} with unit ${page.unit}`
        );
        for (const table of page.tables) {
            for (const cell of table.cells) {
                console.log(`cell [${cell.rowIndex},${cell.columnIndex}] has text ${cell.text}`);
            }
        }
    }
}

recognizeContent().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Coba: Model bawaan

Sampel ini menunjukkan cara menganalisis data dari jenis dokumen umum tertentu dengan model yang telah dilatih sebelumnya, menggunakan faktur sebagai contoh. Lihat halaman konsep bawaan kami untuk daftar lengkap bidang faktur

  • Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
  • Kami telah menambahkan nilai URI file ke invoiceUrl variabel di bagian atas file.
  • Untuk menganalisis file tertentu di URI, Anda akan menggunakan metode .beginRecognizeInvoices
  • Untuk kesederhanaan, tidak semua field yang dikembalikan oleh layanan ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.

Pilih model bawaan

Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Berikut adalah model bawaan yang saat ini didukung oleh layanan Kecerdasan Dokumen:

  • Faktur: mengekstrak teks, tanda pilihan, tabel, bidang, dan informasi utama dari faktur.
  • Tanda terima: mengekstrak teks dan informasi kunci dari tanda terima.
  • Dokumen ID: mengekstrak teks dan informasi utama dari SIM dan paspor internasional.
  • Kartu nama: mengekstrak teks dan informasi utama dari kartu nama.

Tambahkan kode berikut ke aplikasi faktur bawaan Anda di key bawah variabel


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

async function recognizeInvoices() {

    const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));

    const poller = await client.beginRecognizeInvoicesFromUrl(invoiceUrl);
    const [invoice] = await poller.pollUntilDone();

    if (invoice === undefined) {
        throw new Error("Failed to extract data from at least one invoice.");
    }

    /**
     * This is a helper function for printing a simple field with an elemental type.
     */
    function fieldToString(field) {
        const {
            name,
            valueType,
            value,
            confidence
        } = field;
        return `${name} (${valueType}): '${value}' with confidence ${confidence}'`;
    }

    console.log("Invoice fields:");

    /**
     * Invoices contain a lot of optional fields, but they are all of elemental types
     * such as strings, numbers, and dates, so we will just enumerate them all.
     */
    for (const [name, field] of Object.entries(invoice.fields)) {
        if (field.valueType !== "array" && field.valueType !== "object") {
            console.log(`- ${name} ${fieldToString(field)}`);
        }
    }

    // Invoices also support nested line items, so we can iterate over them.
    let idx = 0;

    console.log("- Items:");

    const items = invoice.fields["Items"]?.value;
    for (const item of items ?? []) {
        const value = item.value;

        // Each item has several subfields that are nested within the item. We'll
        // map over this list of the subfields and filter out any fields that
        // weren't found. Not all fields will be returned every time, only those
        // that the service identified for the particular document in question.

        const subFields = [
                "Description",
                "Quantity",
                "Unit",
                "UnitPrice",
                "ProductCode",
                "Date",
                "Tax",
                "Amount"
            ]
            .map((fieldName) => value[fieldName])
            .filter((field) => field !== undefined);

        console.log(
            [
                `  - Item #${idx}`,
                // Now we will convert those fields into strings to display
                ...subFields.map((field) => `    - ${fieldToString(field)}`)
            ].join("\n")
        );
    }
}

recognizeInvoices().catch((err) => {
    console.error("The sample encountered an error:", err);
});

Dokumentasi Referensi | Kode sumber pustaka | Paket (PyPi) | Contoh

Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:

Prasyarat

  • langganan Azure - Buat langganan secara gratis

  • Python 3.x

    • Penginstalan Python Anda harus menyertakan pip. Anda dapat memeriksa apakah Anda telah menginstal pip dengan menjalankan pip --version pada baris perintah. Untuk mendapatkan pip, pasanglah versi terbaru dari Python.
  • Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau layanan multi di portal Azure untuk mendapatkan kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.

    Tips

    Buat sumber daya foundry jika Anda berencana untuk mengakses beberapa Foundry Tools dengan satu kunci/titik akhir. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda berniat menggunakan autentikasi Microsoft Entra.

  • Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.

    Cuplikan layar dari kunci dan lokasi titik akhir di portal Azure.

Mengatur

Buka jendela terminal di lingkungan lokal Anda dan instal pustaka klien Foundry Tools Azure Document Intelligence untuk Python menggunakan pip:

pip install azure-ai-formrecognizer

Membuat aplikasi Python baru

Buat aplikasi Python baru yang disebut form_recognizer_quickstart.py di editor atau IDE pilihan Anda. Kemudian impor pustaka berikut:

import os
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential

Membuat variabel untuk titik akhir dan kunci sumber daya Azure Anda

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

Pada titik ini, aplikasi Python Anda harus berisi baris kode berikut:

import os
from azure.core.exceptions import ResourceNotFoundError
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

Pilih sampel kode untuk disalin dan ditempelkan ke aplikasi Anda:

Penting

Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihatKeamanan Foundry Tools.

Coba: Model tata letak

  • Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
  • Kami telah menambahkan nilai URI file ke variabel di formUrl 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 key variabel


  def format_bounding_box(bounding_box):
    if not bounding_box:
        return "N/A"
    return ", ".join(["[{}, {}]".format(p.x, p.y) for p in bounding_box])

 def recognize_content():
    # sample document
    formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"

    form_recognizer_client = FormRecognizerClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = form_recognizer_client.begin_recognize_content_from_url(formUrl)
    form_pages = poller.result()

    for idx, content in enumerate(form_pages):
        print(
            "Page has width: {} and height: {}, measured with unit: {}".format(
                content.width, content.height, content.unit
            )
        )
        for table_idx, table in enumerate(content.tables):
            print(
                "Table # {} has {} rows and {} columns".format(
                    table_idx, table.row_count, table.column_count
                )
            )
            print(
                "Table # {} location on page: {}".format(
                    table_idx, format_bounding_box(table.bounding_box)
                )
            )
            for cell in table.cells:
                print(
                    "...Cell[{}][{}] has text '{}' within bounding box '{}'".format(
                        cell.row_index,
                        cell.column_index,
                        cell.text,
                        format_bounding_box(cell.bounding_box),
                    )
                )

        for line_idx, line in enumerate(content.lines):
            print(
                "Line # {} has word count '{}' and text '{}' within bounding box '{}'".format(
                    line_idx,
                    len(line.words),
                    line.text,
                    format_bounding_box(line.bounding_box),
                )
            )
            if line.appearance:
                if (
                    line.appearance.style_name == "handwriting"
                    and line.appearance.style_confidence > 0.8
                ):
                    print(
                        "Text line '{}' is handwritten and might be a signature.".format(
                            line.text
                        )
                    )
            for word in line.words:
                print(
                    "...Word '{}' has a confidence of {}".format(
                        word.text, word.confidence
                    )
                )

        for selection_mark in content.selection_marks:
            print(
                "Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
                    selection_mark.state,
                    format_bounding_box(selection_mark.bounding_box),
                    selection_mark.confidence,
                )
            )
        print("----------------------------------------")


if __name__ == "__main__":
    recognize_content()

Coba: Model bawaan

Sampel ini menunjukkan cara menganalisis data dari jenis dokumen umum tertentu dengan model yang telah dilatih sebelumnya, menggunakan faktur sebagai contoh. Lihat halaman konsep bawaan kami untuk daftar lengkap bidang faktur

  • Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.
  • Kami telah menambahkan nilai URI file ke variabel ''formUrl' di bagian atas file.
  • Untuk menganalisis file tertentu pada sebuah URI, Anda akan menggunakan metode ``begin_recognize_invoices_from_url``.
  • Untuk kesederhanaan, semua kolom yang dikembalikan oleh layanan tidak ditampilkan di sini. Untuk melihat daftar semua bidang yang didukung dan jenis terkait, lihat halaman konsep Faktur kami.

Pilih model bawaan

Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Berikut adalah model bawaan yang saat ini didukung oleh layanan Kecerdasan Dokumen:

  • Faktur: mengekstrak teks, tanda pilihan, tabel, bidang, dan informasi utama dari faktur.
  • Tanda terima: mengekstrak teks dan informasi kunci dari tanda terima.
  • Dokumen ID: mengekstrak teks dan informasi utama dari SIM dan paspor internasional.
  • Kartu nama: mengekstrak teks dan informasi utama dari kartu nama.

Tambahkan kode berikut ke aplikasi faktur bawaan Anda di key bawah variabel


def recognize_invoice():

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

    form_recognizer_client = FormRecognizerClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )

    poller = form_recognizer_client.begin_recognize_invoices_from_url(
        invoiceUrl, locale="en-US"
    )
    invoices = poller.result()

    for idx, invoice in enumerate(invoices):
        vendor_name = invoice.fields.get("VendorName")
        if vendor_name:
            print(
                "Vendor Name: {} has confidence: {}".format(
                    vendor_name.value, vendor_name.confidence
                )
            )
        vendor_address = invoice.fields.get("VendorAddress")
        if vendor_address:
            print(
                "Vendor Address: {} has confidence: {}".format(
                    vendor_address.value, vendor_address.confidence
                )
            )
        vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
        if vendor_address_recipient:
            print(
                "Vendor Address Recipient: {} has confidence: {}".format(
                    vendor_address_recipient.value, vendor_address_recipient.confidence
                )
            )
        customer_name = invoice.fields.get("CustomerName")
        if customer_name:
            print(
                "Customer Name: {} has confidence: {}".format(
                    customer_name.value, customer_name.confidence
                )
            )
        customer_id = invoice.fields.get("CustomerId")
        if customer_id:
            print(
                "Customer Id: {} has confidence: {}".format(
                    customer_id.value, customer_id.confidence
                )
            )
        customer_address = invoice.fields.get("CustomerAddress")
        if customer_address:
            print(
                "Customer Address: {} has confidence: {}".format(
                    customer_address.value, customer_address.confidence
                )
            )
        customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
        if customer_address_recipient:
            print(
                "Customer Address Recipient: {} has confidence: {}".format(
                    customer_address_recipient.value,
                    customer_address_recipient.confidence,
                )
            )
        invoice_id = invoice.fields.get("InvoiceId")
        if invoice_id:
            print(
                "Invoice Id: {} has confidence: {}".format(
                    invoice_id.value, invoice_id.confidence
                )
            )
        invoice_date = invoice.fields.get("InvoiceDate")
        if invoice_date:
            print(
                "Invoice Date: {} has confidence: {}".format(
                    invoice_date.value, invoice_date.confidence
                )
            )
        invoice_total = invoice.fields.get("InvoiceTotal")
        if invoice_total:
            print(
                "Invoice Total: {} has confidence: {}".format(
                    invoice_total.value, invoice_total.confidence
                )
            )
        due_date = invoice.fields.get("DueDate")
        if due_date:
            print(
                "Due Date: {} has confidence: {}".format(
                    due_date.value, due_date.confidence
                )
            )
        purchase_order = invoice.fields.get("PurchaseOrder")
        if purchase_order:
            print(
                "Purchase Order: {} has confidence: {}".format(
                    purchase_order.value, purchase_order.confidence
                )
            )
        billing_address = invoice.fields.get("BillingAddress")
        if billing_address:
            print(
                "Billing Address: {} has confidence: {}".format(
                    billing_address.value, billing_address.confidence
                )
            )
        billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
        if billing_address_recipient:
            print(
                "Billing Address Recipient: {} has confidence: {}".format(
                    billing_address_recipient.value,
                    billing_address_recipient.confidence,
                )
            )
        shipping_address = invoice.fields.get("ShippingAddress")
        if shipping_address:
            print(
                "Shipping Address: {} has confidence: {}".format(
                    shipping_address.value, shipping_address.confidence
                )
            )
        shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
        if shipping_address_recipient:
            print(
                "Shipping Address Recipient: {} has confidence: {}".format(
                    shipping_address_recipient.value,
                    shipping_address_recipient.confidence,
                )
            )
        print("Invoice items:")
        for idx, item in enumerate(invoice.fields.get("Items").value):
            item_description = item.value.get("Description")
            if item_description:
                print(
                    "......Description: {} has confidence: {}".format(
                        item_description.value, item_description.confidence
                    )
                )
            item_quantity = item.value.get("Quantity")
            if item_quantity:
                print(
                    "......Quantity: {} has confidence: {}".format(
                        item_quantity.value, item_quantity.confidence
                    )
                )
            unit = item.value.get("Unit")
            if unit:
                print(
                    "......Unit: {} has confidence: {}".format(
                        unit.value, unit.confidence
                    )
                )
            unit_price = item.value.get("UnitPrice")
            if unit_price:
                print(
                    "......Unit Price: {} has confidence: {}".format(
                        unit_price.value, unit_price.confidence
                    )
                )
            product_code = item.value.get("ProductCode")
            if product_code:
                print(
                    "......Product Code: {} has confidence: {}".format(
                        product_code.value, product_code.confidence
                    )
                )
            item_date = item.value.get("Date")
            if item_date:
                print(
                    "......Date: {} has confidence: {}".format(
                        item_date.value, item_date.confidence
                    )
                )
            tax = item.value.get("Tax")
            if tax:
                print(
                    "......Tax: {} has confidence: {}".format(tax.value, tax.confidence)
                )
            amount = item.value.get("Amount")
            if amount:
                print(
                    "......Amount: {} has confidence: {}".format(
                        amount.value, amount.confidence
                    )
                )
        subtotal = invoice.fields.get("SubTotal")
        if subtotal:
            print(
                "Subtotal: {} has confidence: {}".format(
                    subtotal.value, subtotal.confidence
                )
            )
        total_tax = invoice.fields.get("TotalTax")
        if total_tax:
            print(
                "Total Tax: {} has confidence: {}".format(
                    total_tax.value, total_tax.confidence
                )
            )
        previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
        if previous_unpaid_balance:
            print(
                "Previous Unpaid Balance: {} has confidence: {}".format(
                    previous_unpaid_balance.value, previous_unpaid_balance.confidence
                )
            )
        amount_due = invoice.fields.get("AmountDue")
        if amount_due:
            print(
                "Amount Due: {} has confidence: {}".format(
                    amount_due.value, amount_due.confidence
                )
            )
        service_start_date = invoice.fields.get("ServiceStartDate")
        if service_start_date:
            print(
                "Service Start Date: {} has confidence: {}".format(
                    service_start_date.value, service_start_date.confidence
                )
            )
        service_end_date = invoice.fields.get("ServiceEndDate")
        if service_end_date:
            print(
                "Service End Date: {} has confidence: {}".format(
                    service_end_date.value, service_end_date.confidence
                )
            )
        service_address = invoice.fields.get("ServiceAddress")
        if service_address:
            print(
                "Service Address: {} has confidence: {}".format(
                    service_address.value, service_address.confidence
                )
            )
        service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
        if service_address_recipient:
            print(
                "Service Address Recipient: {} has confidence: {}".format(
                    service_address_recipient.value,
                    service_address_recipient.confidence,
                )
            )
        remittance_address = invoice.fields.get("RemittanceAddress")
        if remittance_address:
            print(
                "Remittance Address: {} has confidence: {}".format(
                    remittance_address.value, remittance_address.confidence
                )
            )
        remittance_address_recipient = invoice.fields.get("RemittanceAddressRecipient")
        if remittance_address_recipient:
            print(
                "Remittance Address Recipient: {} has confidence: {}".format(
                    remittance_address_recipient.value,
                    remittance_address_recipient.confidence,
                )
            )


if __name__ == "__main__":
    recognize_invoice()

Jalankan aplikasi Anda

  1. Navigasikan ke folder tempat Anda memiliki file form_recognizer_quickstart.py .

  2. Ketik perintah berikut di terminal Anda:

python form_recognizer_quickstart.py

| Document Intelligence REST API | Referensi Azure REST API |

Dalam mulai cepat ini, Anda menggunakan API berikut untuk mengekstrak data terstruktur dari formulir dan dokumen:

Prasyarat

  • langganan Azure - Buat langganan secara gratis

  • cURL terinstal.

  • PowerShell versi 6.0+, atau aplikasi baris perintah serupa.

  • Perangkat Lunak Foundry atau sumber daya kecerdasan dokumen. Setelah Anda memiliki langganan Azure, buat sumber daya Kecerdasan Dokumen layanan tunggal atau layanan multi di portal Azure untuk mendapatkan kunci dan titik akhir. Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanan, dan meningkatkannya nanti ke tingkat berbayar untuk produksi.

    Tips

    Buat sumber daya foundry jika Anda berencana untuk mengakses beberapa Foundry Tools dengan satu kunci/titik akhir. Hanya untuk akses Kecerdasan Dokumen, buat sumber daya Kecerdasan Dokumen. Harap dicatat bahwa Anda memerlukan sumber daya layanan tunggal jika Anda berniat menggunakan autentikasi Microsoft Entra.

  • Setelah sumber daya Anda diluncurkan, pilih Akses sumber daya. Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke API Kecerdasan Dokumen. Anda menempelkan kunci dan titik akhir ke kode di panduan cepat setelahnya.

    Cuplikan layar dari kunci dan lokasi titik akhir di portal Azure.

Pilih sampel kode untuk disalin dan ditempelkan ke aplikasi Anda:

Penting

Ingatlah untuk menghapus kunci dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihatKeamanan Foundry Tools.

Coba: Model tata letak

  • Untuk contoh ini, Anda memerlukan file dokumen di URI. Anda dapat menggunakan dokumen sampel kami untuk panduan memulai cepat ini.
  1. Ganti {endpoint} dengan titik akhir yang Anda peroleh melalui langganan Kecerdasan Dokumen.
  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

Permintaan

curl -v -i POST "https://{endpoint}/formrecognizer/v2.1/layout/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{​​​​​​​'urlSource': '{your-document-url}'}​​​​​​​​"

Lokasi-Operasi

Anda menerima respons 202 (Success) yang menyertakan header Operation-Location. Nilai header ini berisi ID hasil yang bisa Anda gunakan untuk mengkueri status operasi asinkron dan mendapatkan hasilnya:

https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.

Dalam contoh berikut, sebagai bagian dari URL, string setelah analyzeResults/ adalah ID hasil.

https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Dapatkan hasil tata letak

Setelah memanggil Analyze Layout API, Anda memanggil Get Analyze Layout Result API untuk mendapatkan status operasi dan data yang diekstrak. Sebelum Anda menjalankan perintah, buat perubahan ini:

  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.

Permintaan

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"

Memeriksa hasilnya

Anda menerima 200 (success) respons dengan konten JSON.

Lihat gambar faktur berikut dan output JSON yang sesuai.

  • Simpul "readResults" berisi setiap baris teks dengan letak kotak pembatas masing-masing di halaman.
  • Simpul selectionMarks menunjukkan setiap opsi pilihan (kotak centang, tanda radio) dan apakah statusnya adalah selected atau unselected.
  • Bagian "pageResults" ini mencakup tabel-tabel yang telah diekstrak. Untuk setiap tabel, indeks teks, baris, dan kolom, rentang baris dan kolom, kotak pembatas, dan lainnya diekstrak.

Dokumen pernyataan proyek Contoso dengan tabel.

Isi respons

Anda dapat melihat output sampel full pada GitHub.

Coba: Model bawaan

  • Untuk contoh ini, kami akan menganalisis dokumen faktur menggunakan model bawaan. Anda dapat menggunakan dokumen faktur sampel kami untuk panduan cepat ini.

Pilih model bawaan

Anda tidak terbatas pada faktur—ada beberapa model bawaan yang dapat dipilih, yang masing-masing memiliki serangkaian bidang yang didukung sendiri. Model yang digunakan analyze untuk operasi tergantung pada jenis dokumen yang akan dianalisis. Berikut adalah model bawaan yang saat ini didukung oleh layanan Kecerdasan Dokumen:

  • Faktur: mengekstrak teks, tanda pilihan, tabel, bidang, dan informasi utama dari faktur.
  • Tanda terima: mengekstrak teks dan informasi kunci dari tanda terima.
  • Dokumen ID: mengekstrak teks dan informasi utama dari SIM dan paspor internasional.
  • Kartu nama: mengekstrak teks dan informasi utama dari kartu nama.

Sebelum Anda menjalankan perintah, buat perubahan ini:

  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
    

Permintaan

curl -v -i POST https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key:  {key}" --data-ascii "{​​​​​​​'urlSource': '{your invoice URL}'}​​​​​​​​"

Lokasi-Operasi

Anda menerima respons 202 (Success) yang menyertakan header Operation-Location. Nilai header ini berisi ID hasil yang bisa Anda gunakan untuk mengkueri status operasi asinkron dan mendapatkan hasilnya:

https://cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}

Dalam contoh berikut, sebagai bagian dari URL, string setelah analyzeResults/ adalah ID hasil:

https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb

Mendapatkan hasil faktur

Setelah memanggil Analyze Invoice API, Anda memanggil Get Analyze Invoice Result API untuk mendapatkan status operasi dan data yang diekstrak. Sebelum Anda menjalankan perintah, buat perubahan ini:

  1. Ganti {endpoint} dengan titik akhir yang Anda peroleh dengan kunci Document Intelligence Anda. Anda dapat menemukannya di tab Gambaran Umum sumber daya Kecerdasan Dokumen Anda.
  2. Ganti {resultId} dengan ID hasil dari langkah sebelumnya.
  3. Ganti {key} dengan kunci Anda.

Permintaan

curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"

Memeriksa respons

Anda menerima 200 (Success) respons dengan output JSON.

  • Bidang "readResults" berisi setiap baris teks yang diekstrak dari faktur.
  • menyertakan "pageResults" tabel dan tanda pilihan yang diekstrak dari faktur.
  • Bidang "documentResults" berisi informasi kunci/nilai untuk bagian faktur yang paling relevan.

Lihat dokumen faktur Sample.

Isi respons

Lihat output sampel lengkap di GitHub.

Itu saja, bagus!

Langkah berikutnya

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

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

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