Aracılığıyla paylaş


Belge Zekası'yla çalışmaya başlama

Önemli

  • Azure Bilişsel Hizmetler Form Tanıma artık Azure AI Belge Zekası'dır.
  • Bazı platformlar hala yeniden adlandırma güncelleştirmesini bekliyor.
  • Belgelerimizdeki Form Tanıma veya Belge Zekası'nın tüm ifadeleri aynı Azure hizmetini ifade eder.

Bu içerik şunlar için geçerlidir: Checkmark v4.0 (önizleme) Önceki sürümler: mavi onay işareti v3.1 (GA) mavi onay işareti v3.0 (GA)

  • Azure AI Document Intelligence en son önizleme sürümünü (2024-07-31-preview) kullanmaya başlayın.

Bu içerik şunlar için geçerlidir: Checkmark v3.1 (GA) Önceki sürümler: mavi onay işareti v3.0 mavi onay işareti v2.1

  • Azure Form Tanıma en son GA sürümünü (2023-07-31 ) kullanmaya başlayın.

Bu içerik şunlar için geçerlidir: Checkmark v3.0 (GA) Daha yeni sürüm: mavi onay işareti v3.1mavi onay işareti v2.1

  • Azure Form Tanıma eski GA sürümünü (2022-08-31 ) kullanmaya başlayın.
  • Azure AI Belge Zekası / Form Tanıma, belgelerinizden anahtar-değer çiftlerini, metinleri, tabloları ve anahtar verilerini ayıklamak için makine öğrenmesini kullanan bulut tabanlı bir Azure yapay zeka hizmetidir.

  • Programlama dili SDK'sını kullanarak veya REST API'yi çağırarak belge işleme modellerini iş akışlarınızla ve uygulamalarınızla kolayca tümleştirebilirsiniz.

  • Bu hızlı başlangıçta, teknolojiyi öğrenirken ücretsiz hizmeti kullanmanızı öneririz. Ücretsiz sayfa sayısının ayda 500 ile sınırlı olduğunu unutmayın.

API özellikleri ve geliştirme seçenekleri hakkında daha fazla bilgi edinmek için Genel Bakış sayfamızı ziyaret edin.

Bu hızlı başlangıçta, formlardan ve belgelerden veri ve değerleri analiz etmek ve ayıklamak için aşağıdaki özellikleri kullanın:

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.

  • Visual Studio IDE'nin geçerli sürümü.

  • Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya Azure AI çok hizmetli bir kaynak oluşturun.

  • Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

İpucu

Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.

  • Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:

    Azure portalında anahtarların ve uç nokta konumunun ekran görüntüsü.

  • Azure AI hizmetleri veya Form Tanıma kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya Azure AI çok hizmetli bir kaynak oluşturun.

  • Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

İpucu

Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Form Tanıma erişim için bir Form Tanıma kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.

  • Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Form Tanıma API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:

    Azure portalında anahtarların ve uç nokta konumunun ekran görüntüsü.

Ayarlama

  1. Visual Studio'yu başlatın.

  2. Başlangıç sayfasında Yeni proje oluştur'u seçin.

    Visual Studio başlangıç penceresinin ekran görüntüsü.

  3. Yeni proje oluştur sayfasında, arama kutusuna konsol yazın. Konsol Uygulaması şablonunu ve ardından İleri'yi seçin.

    Visual Studio'nun yeni proje oluşturma sayfasının ekran görüntüsü.

  1. Yeni projenizi yapılandırın iletişim penceresinde Proje adı kutusuna girindoc_intel_quickstart. Ardından İleri'yi seçin.
  1. Yeni projenizi yapılandırın iletişim penceresinde Proje adı kutusuna girinform_recognizer_quickstart. Ardından İleri'yi seçin.
  1. Ek bilgiler iletişim kutusunda .NET 8.0 (uzun süreli destek) öğesini ve ardından Oluştur'u seçin.

    Visual Studio'nun ek bilgi iletişim kutusunun ekran görüntüsü.

NuGet ile istemci kitaplığını yükleme

  1. doc_intel_quickstart projenize sağ tıklayın ve NuGet Paketlerini Yönet... öğesini seçin.

    Visual Studio'da NuGet ön sürüm paketi penceresinin ekran görüntüsü.

  2. Gözat sekmesini seçin ve Azure.AI.DocumentIntelligence yazın.

  3. Include prerelease Onay kutusunu seçin.

    Visual Studio'da ön sürüm NuGet paketini seçmenin ekran görüntüsü.

  4. Açılan menüden bir sürüm seçin ve paketi projenize yükleyin.

  1. form_recognizer_quickstart projenize sağ tıklayın ve NuGet Paketlerini Yönet... öğesini seçin.

    Visual Studio'da NuGet paketi bul penceresinin ekran görüntüsü.

  2. Gözat sekmesini seçin ve Azure.AI.FormRecognizer yazın. Açılan menüden sürüm 4.1.0'ı seçin

    Visual Studio'da NuGet Form Tanıma paketini seçmenin ekran görüntüsü.

  1. form_recognizer_quickstart projenize sağ tıklayın ve NuGet Paketlerini Yönet... öğesini seçin.

    Visual Studio'da NuGet paket penceresinin ekran görüntüsü.

  2. Gözat sekmesini seçin ve Azure.AI.FormRecognizer yazın. Açılan menüden sürüm 4.0.0'ı seçin

    Visual Studio'da NuGet eski paketini seçmenin ekran görüntüsü.

Uygulamanızı derleme

Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentIntelligenceClient oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key bir ve ve Belge Zekanız endpointile AzureKeyCredential bir DocumentIntelligenceClient örnek oluşturursunuzAzureKeyCredential.

Form Tanıma hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentAnalysisClient oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key ve ile bir örnek endpointAzureKeyCredential Form Tanıma oluşturursunuzAzureKeyCredential.DocumentAnalysisClient

Not

  • .NET 6'dan başlayarak, şablonu kullanan console yeni projeler önceki sürümlerden farklı yeni bir program stili oluşturur.
  • Yeni çıkış, yazmanız gereken kodu basitleştiren son C# özelliklerini kullanır.
  • Daha yeni sürümü kullandığınızda, yalnızca yönteminin gövdesini Main yazmanız gerekir. Üst düzey deyimleri, genel using yönergelerini veya örtük using yönergelerini eklemeniz gerekmez.
  • Daha fazla bilgi için bkz. Yeni C# şablonları üst düzey deyimler oluşturma.
  1. Program.cs dosyasını açın.

  2. satırı Console.Writeline("Hello World!")da dahil olmak üzere önceden var olan kodu silin ve uygulamanızın Program.cs dosyasına kopyalayıp yapıştırmak için aşağıdaki kod örneklerinden birini seçin:

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.

Düzen modeli

Belgelerden metin, seçim işaretleri, metin stilleri, tablo yapıları ve sınırlayıcı bölge koordinatlarını ayıklayın.

  • Bu örnekte, URI'den bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
  • Dosya URI değerini betiğin Uri fileUri en üstündeki değişkene ekledik.
  • URI'deki belirli bir dosyadan düzeni ayıklamak için yöntemini kullanın StartAnalyzeDocumentFromUri ve model kimliği olarak geçirin prebuilt-layout . Döndürülen değer, gönderilen belgedeki verileri içeren bir AnalyzeResult nesnedir.

aşağıdaki kod örneğini Program.cs dosyasına ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


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}");
    }
}

Uygulamanızı çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.

Visual Studio programınızı çalıştırma düğmesinin ekran görüntüsü.

aşağıdaki kod örneğini Program.cs dosyasına ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:

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

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

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

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

AnalyzeResult result = operation.Value;

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

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

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

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

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

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

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

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

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

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

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

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

Uygulamanızı çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.

Visual Studio program düğmesi konumunuzu çalıştırma işleminin ekran görüntüsü.

Düzen modeli çıkışı

Beklenen çıkışın kod parçacığı aşağıdadır:

  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

Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve düzen modeli çıkışını görüntüleyin.

aşağıdaki kod örneğini Program.cs dosyasına ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:

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

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

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

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

AnalyzeResult result = operation.Value;

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

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

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

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

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

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

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

Console.WriteLine("Paragraphs:");

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Console.WriteLine("Paragraphs:");

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

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

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

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

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

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

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

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

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

Uygulamanızı çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.

Visual Studio programınızı çalıştırma işleminin ekran görüntüsü.

Önceden oluşturulmuş model

Önceden oluşturulmuş bir model kullanarak belirli belge türlerinden ortak alanları analiz edin ve ayıklayın. Bu örnekte, önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz ediyoruz.

İpucu

Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. İşlem için analyze kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Bkz. model veri ayıklama.

  • Önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz edin. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
  • Dosya URI değerini Uri invoiceUri Program.cs dosyasının en üstündeki değişkene ekledik.
  • URI'de belirli bir dosyayı analiz etmek için yöntemini kullanın StartAnalyzeDocumentFromUri ve model kimliği olarak geçirin prebuilt-invoice . Döndürülen değer, gönderilen belgedeki verileri içeren bir AnalyzeResult nesnedir.
  • Kolaylık olması için, hizmetin döndürdüğü tüm anahtar-değer çiftleri burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.

aşağıdaki kod örneğini Program.cs dosyanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


using Azure;
using Azure.AI.DocumentIntelligence;

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

//sample invoice document

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

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

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

AnalyzeResult result = operation.Value;

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

    AnalyzedDocument document = result.Documents[i];

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

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

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

            if (itemField.Type == DocumentFieldType.Object)
            {
                IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueObject;

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

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

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

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

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

Uygulamanızı çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.

Visual Studio programınızı çalıştırma düğmesinin ekran görüntüsü.

aşağıdaki kod örneğini Program.cs dosyanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


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}");
        }
    }
}

Uygulamanızı çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.

Visual Studio program düğmesi konumunuzu çalıştırma işleminin ekran görüntüsü.

Önceden oluşturulmuş model çıkışı

Beklenen çıkışın kod parçacığı aşağıdadır:

  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

Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve önceden oluşturulmuş fatura modeli çıkışını görüntüleyin.

aşağıdaki kod örneğini Program.cs dosyanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


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}");
        }
    }
}

Uygulamanızı çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.

Visual Studio programınızı çalıştırma işleminin ekran görüntüsü.

Bu hızlı başlangıçta, formlardan ve belgelerden veri ve değerleri analiz etmek ve ayıklamak için aşağıdaki özellikleri kullanın:

  • Düzen— Model eğitmeye gerek kalmadan belgelerdeki radyo düğmeleri ve onay kutuları gibi tabloları, çizgileri, sözcükleri ve seçim işaretlerini analiz edin ve ayıklayın.

  • Önceden oluşturulmuş Fatura— Önceden eğitilmiş bir model kullanarak belirli belge türlerinde ortak alanları analiz edin ve ayıklayın.

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.

  • Visual Studio Code'un en son sürümü veya tercih ettiğiniz IDE. Bkz. Visual Studio Code'da Java.

    İpucu

    • Visual Studio Code, Windows ve macOS için Java için bir Kodlama Paketi sunar.Kodlama paketi, BIR VS Code paketi, Java Geliştirme Seti (JDK) ve Microsoft tarafından önerilen uzantılardan oluşan bir koleksiyondur. Kodlama Paketi, mevcut geliştirme ortamını düzeltmek için de kullanılabilir.
    • VS Code ve Java için Kodlama Paketi kullanıyorsanız Java için Gradle uzantısını yükleyin.
  • Visual Studio Code kullanmıyorsanız, geliştirme ortamınızda aşağıdakilerin yüklü olduğundan emin olun:

  • Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

    İpucu

    Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.

  • Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Daha sonra anahtarınızı ve uç noktanızı koda yapıştırırsınız:

    Azure portalında anahtarların ve uç nokta konumunun ekran görüntüsü.

Ayarlama

Yeni Gradle projesi oluşturma

  1. Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için doc-intel-app adlı yeni bir dizin oluşturun ve bu dizine gidin.

    mkdir doc-intel-app && doc-intel-app
    
    mkdir doc-intel-app; cd doc-intel-app
    
  2. gradle init Komutunu çalışma dizininizden çalıştırın. Bu komut, uygulamanızı oluşturmak ve yapılandırmak için çalışma zamanında kullanılan build.gradle.kts dahil olmak üzere Gradle için temel derleme dosyaları oluşturur.

    gradle init --type basic
    
  3. DSL seçmeniz istendiğinde Kotlin'i seçin.

  4. İade veya Enter'ı seçerek varsayılan proje adını (doc-intel-app) kabul edin.

  1. Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için form-recognize-app adlı yeni bir dizin oluşturun ve bu dizine gidin.

    mkdir form-recognize-app && form-recognize-app
    
    mkdir form-recognize-app; cd form-recognize-app
    
  2. gradle init Komutunu çalışma dizininizden çalıştırın. Bu komut, uygulamanızı oluşturmak ve yapılandırmak için çalışma zamanında kullanılan build.gradle.kts dahil olmak üzere Gradle için temel derleme dosyaları oluşturur.

    gradle init --type basic
    
  3. DSL seçmeniz istendiğinde Kotlin'i seçin.

  4. İade veya Enter'ı seçerek varsayılan proje adını (form-recognize-app) kabul edin.

İstemci kitaplığını yükleme

Bu hızlı başlangıçta Gradle bağımlılık yöneticisi kullanılır. Maven Central Repository'de diğer bağımlılık yöneticilerinin istemci kitaplığını ve bilgilerini bulabilirsiniz.

IDE'nizde projenin build.gradle.kts dosyasını açın. İstemci kitaplığını gerekli eklentiler ve ayarlarla birlikte bir implementation deyim olarak eklemek için aşağıdaki kodu birlikte ödenin ve yapıştırın.

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

   }

Bu hızlı başlangıçta Gradle bağımlılık yöneticisi kullanılır. Maven Central Repository'de diğer bağımlılık yöneticilerinin istemci kitaplığını ve bilgilerini bulabilirsiniz.

IDE'nizde projenin build.gradle.kts dosyasını açın. İstemci kitaplığını gerekli eklentiler ve ayarlarla birlikte bir implementation deyim olarak eklemek için aşağıdaki kodu birlikte ödenin ve yapıştırın.

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

   }

Bu hızlı başlangıçta Gradle bağımlılık yöneticisi kullanılır. Maven Central Repository'de diğer bağımlılık yöneticilerinin istemci kitaplığını ve bilgilerini bulabilirsiniz.

IDE'nizde projenin build.gradle.kts dosyasını açın. İstemci kitaplığını gerekli eklentiler ve ayarlarla birlikte bir implementation deyim olarak eklemek için aşağıdaki kodu birlikte ödenin ve yapıştırın.

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


   }

Java uygulaması oluşturma

Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentIntelligenceClient oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key bir ve ve Belge Zekanız endpointile AzureKeyCredential bir DocumentIntelligenceClient örnek oluşturursunuzAzureKeyCredential.

Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentAnalysisClient oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key bir ve ve Belge Zekanız endpointile AzureKeyCredential bir DocumentAnalysisClient örnek oluşturursunuzAzureKeyCredential.

  1. doc-intel-app dizininden aşağıdaki komutu çalıştırın:

    mkdir -p src/main/java
    

    Aşağıdaki dizin yapısını oluşturursunuz:

    Java dizin yapısının ekran görüntüsü

  1. dizinine java gidin ve adlı DocIntelligence.javabir dosya oluşturun.

    İpucu

    • PowerShell kullanarak yeni bir dosya oluşturabilirsiniz.
    • Shift tuşunu basılı tutarak ve klasöre sağ tıklayarak proje dizininizde bir PowerShell penceresi açın.
    • Yeni Öğe DocIntelligence.java aşağıdaki komutu yazın.
  2. DocIntelligence.java dosyasını açın. Aşağıdaki kod örneklerinden birini kopyalayıp uygulamanıza yapıştırın:

  1. dizinine java gidin ve adlı FormRecognizer.javabir dosya oluşturun.

    İpucu

    • PowerShell kullanarak yeni bir dosya oluşturabilirsiniz.
    • Shift tuşunu basılı tutarak ve klasöre sağ tıklayarak proje dizininizde bir PowerShell penceresi açın.
    • Yeni Öğe FormRecognizer.java aşağıdaki komutu yazın.
  2. FormRecognizer.java dosyasını açın. Aşağıdaki kod örneklerinden birini kopyalayıp uygulamanıza yapıştırın:

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.

Düzen modeli

Belgelerden metin, seçim işaretleri, metin stilleri, tablo yapıları ve sınırlayıcı bölge koordinatlarını ayıklayın.

  • Bu örnekte, URI'de bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
  • Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacak beginAnalyzeDocumentFromUrl ve model kimliği olarak geçireceksiniz prebuilt-layout . Döndürülen değer, gönderilen belgeyle ilgili verileri içeren bir AnalyzeResult nesnedir.
  • Main yöntemindeki değişkene documentUrl dosya URI değerini ekledik.

Aşağıdaki kod örneğini dosyaya DocIntelligence.java ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
import com.azure.ai.documentintelligence.models.DocumentTable;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

import java.util.List;

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

    SyncPoller <AnalyzeResultOperation, AnalyzeResultOperation> analyzeLayoutPoller =
      client.beginAnalyzeDocument(modelId,
          null,
          null,
          null,
          null,
          null,
          null,
          new AnalyzeDocumentRequest().setUrlSource(documentUrl));

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult().getAnalyzeResult();

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

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

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

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

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

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

Uygulamayı derleme ve çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (doc-intel-app) geri gidin.

  1. Uygulamanızı şu komutla build oluşturun:

    gradle build
    
  2. Uygulamanızı şu komutla run çalıştırın:

    gradle run
    

Aşağıdaki kod örneğini dosyaya FormRecognizer.java ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


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

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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();

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

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

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

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

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

Uygulamayı derleme ve çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (form-recognize-app) geri gidin.

  1. Uygulamanızı şu komutla build oluşturun:

    gradle build
    
  2. Uygulamanızı şu komutla run çalıştırın:

    gradle run
    

Düzen modeli çıkışı

Beklenen çıkışın kod parçacığı aşağıdadır:

  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.

Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve düzen modeli çıkışını görüntüleyin.

Aşağıdaki kod örneğini dosyaya FormRecognizer.java ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();

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

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

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

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

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

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

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

Uygulamayı derleme ve çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (form-recognize-app) geri gidin.

  1. Uygulamanızı şu komutla build oluşturun:

    gradle build
    
  2. Uygulamanızı şu komutla run çalıştırın:

    gradle run
    

Önceden oluşturulmuş model

Önceden oluşturulmuş bir model kullanarak belirli belge türlerinden ortak alanları analiz edin ve ayıklayın. Bu örnekte, önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz ediyoruz.

İpucu

Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. İşlem için analyze kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Bkz. model veri ayıklama.

  • Önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz edin. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
  • Dosyanın üst kısmındaki değişkene invoiceUrl dosya URL'si değerini ekledik.
  • Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacak beginAnalyzeDocuments ve model kimliği olarak geçireceksiniz PrebuiltModels.Invoice . Döndürülen değer, gönderilen belgeyle ilgili verileri içeren bir result nesnedir.
  • Kolaylık olması için, hizmetin döndürdüğü tüm anahtar-değer çiftleri burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.

Aşağıdaki kod örneğini dosyaya DocIntelligence.java ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
import com.azure.ai.documentintelligence.models.Document;
import com.azure.ai.documentintelligence.models.DocumentField;
import com.azure.ai.documentintelligence.models.DocumentFieldType;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;

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

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

      // Instantiate a client that will be used to call the service.
      DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
        .credential(new AzureKeyCredential(key))
        .endpoint(endpoint)
        .buildClient();

      SyncPoller<AnalyzeResultOperation, AnalyzeResultOperation > analyzeInvoicesPoller =
        client.beginAnalyzeDocument(modelId, 
            null,
            null,
            null,
            null,
            null,
            null,
            new AnalyzeDocumentRequest().setUrlSource(invoiceUrl));

      AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult().getAnalyzeResult();

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

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

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

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

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

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

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

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

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

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

Uygulamayı derleme ve çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (doc-intel-app) geri gidin.

  1. Uygulamanızı şu komutla build oluşturun:

    gradle build
    
  2. Uygulamanızı şu komutla run çalıştırın:

    gradle run
    

Aşağıdaki kod örneğini dosyaya FormRecognizer.java ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


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());
                }
              }
            }));
        }
      }
    }
  }
}

Uygulamayı derleme ve çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (doc-intel-app) geri gidin.

  1. Uygulamanızı şu komutla build oluşturun:

    gradle build
    
  2. Uygulamanızı şu komutla run çalıştırın:

    gradle run
    

Önceden oluşturulmuş model çıkışı

Beklenen çıkışın kod parçacığı aşağıdadır:

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

Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve önceden oluşturulmuş fatura modeli çıkışını görüntüleyin.

Aşağıdaki kod örneğini dosyaya FormRecognizer.java ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


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());
                }
              }
            }));
        }
      }
    }
  }
}

Uygulamayı derleme ve çalıştırma

Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (doc-intel-app) geri gidin.

  1. Uygulamanızı şu komutla build oluşturun:

    gradle build
    
  2. Uygulamanızı şu komutla run çalıştırın:

    gradle run
    

Bu hızlı başlangıçta, formlardan ve belgelerden veri ve değerleri analiz etmek ve ayıklamak için aşağıdaki özellikleri kullanın:

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.

  • Visual Studio Code'un en son sürümü veya tercih ettiğiniz IDE. Daha fazla bilgi için bkz. Visual Studio Code'da Node.js.

  • Node.js'nin en son LTS sürümü.

  • Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

    İpucu

    Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.

  • Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:

    Azure portalında anahtarların ve uç nokta konumunun ekran görüntüsü.

Ayarlama

  1. Yeni Node.js Express uygulaması oluşturma: Bir konsol penceresinde (cmd, PowerShell veya Bash gibi) uygulamanız için adlı doc-intel-appyeni bir dizin oluşturun ve bu dizine gidin.

    mkdir doc-intel-app && cd doc-intel-app
    
  2. npm init Uygulamayı başlatmak ve projenizin iskelesini yapmak için komutunu çalıştırın.

    npm init
    
  3. Terminalde sunulan istemleri kullanarak projenizin özniteliklerini belirtin.

    • En önemli öznitelikler ad, sürüm numarası ve giriş noktasıdır.
    • Giriş noktası adı için saklamanızı index.js öneririz. Açıklama, test komutu, GitHub deposu, anahtar sözcükler, yazar ve lisans bilgileri isteğe bağlı özniteliklerdir; bunlar bu proje için atlanabilir.
    • İade veya Enter'ı seçerek önerileri parantez içinde kabul edin.
    • İstemleri tamamladıktan sonra doc-intel-app dizininizde bir package.json dosya oluşturulur.
  1. İstemci kitaplığını ai-document-intelligence ve azure/identity npm paketlerini yükleyin:

    npm i @azure-rest/ai-document-intelligence@1.0.0-beta.3 @azure/core-auth
    

    Uygulamanızın package.json dosyası bağımlılıklarla güncelleştirilir.

  1. İstemci kitaplığını ai-form-recognizer ve azure/identity npm paketlerini yükleyin:

    npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
    
    • Uygulamanızın package.json dosyası bağımlılıklarla güncelleştirilir.
  1. İstemci kitaplığını ai-form-recognizer ve azure/identity npm paketlerini yükleyin:

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. Uygulama dizininde adlı index.js bir dosya oluşturun.

    İpucu

    • PowerShell kullanarak yeni bir dosya oluşturabilirsiniz.
    • Shift tuşunu basılı tutarak ve klasöre sağ tıklayarak proje dizininizde bir PowerShell penceresi açın.
    • Yeni Öğe index.js aşağıdaki komutu yazın.

Uygulamanızı derleme

Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentIntelligenceClient oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key bir ve ve Belge Zekanız endpointile AzureKeyCredential bir DocumentIntelligenceClient örnek oluşturursunuzAzureKeyCredential.

Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentAnalysisClient oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key ve ile bir örnek endpointAzureKeyCredential Form Tanıma oluşturursunuzAzureKeyCredential.DocumentAnalysisClient

  1. index.js Dosyayı Visual Studio Code'da veya sık kullandığınız IDE'de açın. Aşağıdaki kod örneklerinden birini kopyalayıp uygulamanıza yapıştırın:

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.

Düzen modeli

Belgelerden metin, seçim işaretleri, metin stilleri, tablo yapıları ve sınırlayıcı bölge koordinatlarını ayıklayın.

  • Bu örnekte, URL'den bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
  • Dosyanın üst kısmındaki değişkene formUrl dosya URL'si değerini ekledik.
  • Url'den belirli bir dosyayı analiz etmek için yöntemini kullanır beginAnalyzeDocuments ve model kimliği olarak geçirirsiniz prebuilt-layout .
    const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
  { getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

  const { AzureKeyCredential } = require("@azure/core-auth");

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

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

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


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

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

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

    const documents = analyzeResult?.documents;

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

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

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

Uygulamanızı çalıştırma

Uygulamanıza kod örneği ekledikten sonra programınızı çalıştırın:

  1. Belge Yönetim Bilgileri uygulamanızın (doc-intel-app) bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

    node index.js
    

Aşağıdaki kod örneğini dosyaya index.js ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


 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);
});

Uygulamanızı çalıştırma

Uygulamanıza kod örneği ekledikten sonra programınızı çalıştırın:

  1. Belge Yönetim Bilgileri uygulamanızın (doc-intel-app) bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

    node index.js
    

Düzen modeli çıkışı

Beklenen çıkışın kod parçacığı aşağıdadır:

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

Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve düzen modeli çıkışını görüntüleyin.

Önceden oluşturulmuş model

Bu örnekte, önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz ediyoruz.

İpucu

Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. İşlem için analyze kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Bkz. model veri ayıklama.

  • Önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz edin. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
  • Dosyanın üst kısmındaki değişkene invoiceUrl dosya URL'si değerini ekledik.
  • Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacak beginAnalyzeDocuments ve model kimliği olarak geçireceksiniz PrebuiltModels.Invoice . Döndürülen değer, gönderilen belgeyle ilgili verileri içeren bir result nesnedir.
  • Kolaylık olması için, hizmetin döndürdüğü tüm anahtar-değer çiftleri burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.

const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
  { getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");

const { AzureKeyCredential } = require("@azure/core-auth");

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

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

async function main() {

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

    const initialResponse = await client
    .path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
    .post({
      contentType: "application/json",
      body: {
        // The Document Intelligence service will access the URL to the invoice image and extract data from it
        urlSource: invoiceUrl,
      },
    });

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

    const poller = await getLongRunningPoller(client, initialResponse);

    poller.onProgress((state) => console.log("Operation:", state.result, state.status));
    const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;

    const documents = analyzeResult?.documents;

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

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


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

Uygulamanızı çalıştırma

Uygulamanıza kod örneği ekledikten sonra programınızı çalıştırın:

  1. Belge Yönetim Bilgileri uygulamanızın (doc-intel-app) bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

    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);
});

Uygulamanızı çalıştırma

Uygulamanıza kod örneği ekledikten sonra programınızı çalıştırın:

  1. Belge Yönetim Bilgileri uygulamanızın (doc-intel-app) bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

    node index.js
    

Önceden oluşturulmuş model çıkışı

Beklenen çıkışın kod parçacığı aşağıdadır:

  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

Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve önceden oluşturulmuş fatura modeli çıkışını görüntüleyin.

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);
});

Uygulamanızı çalıştırma

Uygulamanıza kod örneği ekledikten sonra programınızı çalıştırın:

  1. Belge Yönetim Bilgileri uygulamanızın (doc-intel-app) bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

    node index.js
    

Bu hızlı başlangıçta, form ve belgelerden verileri analiz etmek ve ayıklamak için aşağıdaki özellikleri kullanın:

  • Düzen— Model eğitmeye gerek kalmadan radyo düğmeleri, onay kutuları ve anahtar-değer çiftleri gibi tabloları, çizgileri, sözcükleri ve seçim işaretlerini analiz edip ayıklayın.

  • Önceden oluşturulmuş Fatura— Önceden eğitilmiş bir model kullanarak belirli belge türlerinde ortak alanları analiz edin ve ayıklayın.

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.

  • Python 3.7 veya üzeri.

    • Python yüklemeniz pip içermelidir. Pip'in yüklü olup olmadığını denetlemek için komut satırında komutunu çalıştırabilirsiniz pip --version . Python'ın en son sürümünü yükleyerek pip alın.
  • Visual Studio Code'un en son sürümü veya tercih ettiğiniz IDE. Daha fazla bilgi için bkz. Visual Studio Code'da Python'ı Kullanmaya Başlama.

  • Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

İpucu

Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.

  • Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:

    Azure portalında anahtarların ve uç nokta konumunun ekran görüntüsü.

Ayarlama

Yerel ortamınızda bir terminal penceresi açın ve pip ile Python için Azure AI Document Intelligence istemci kitaplığını yükleyin:

pip install azure-ai-documentintelligence==1.0.0b4

pip install azure-ai-formrecognizer==3.3.0

pip install azure-ai-formrecognizer==3.2.0b6

Python uygulamanızı oluşturma

Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentIntelligenceClient oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key bir ve ve Belge Zekanız endpointile AzureKeyCredential bir DocumentIntelligenceClient örnek oluşturursunuzAzureKeyCredential.

  1. Tercih ettiğiniz düzenleyicide veya IDE'de doc_intel_quickstart.py adlı yeni bir Python dosyası oluşturun.

  2. doc_intel_quickstart.py dosyasını açın ve aşağıdaki kod örneklerinden birini seçerek kopyalayıp uygulamanıza yapıştırın:

Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentAnalysisClient oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key bir ve ve Belge Zekanız endpointile AzureKeyCredential bir DocumentAnalysisClient örnek oluşturursunuzAzureKeyCredential.

  1. Tercih ettiğiniz düzenleyicide veya IDE'de form_recognizer_quickstart.py adlı yeni bir Python dosyası oluşturun.

  2. form_recognizer_quickstart.py dosyasını açın ve aşağıdaki kod örneklerinden birini seçerek kopyalayıp uygulamanıza yapıştırın:

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.

Düzen modeli

Belgelerden metin, seçim işaretleri, metin stilleri, tablo yapıları ve sınırlayıcı bölge koordinatlarını ayıklayın.

  • Bu örnekte, URL'den bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
  • İşlevdeki değişkene formUrl dosya URL'si değerini ekledik analyze_layout .

aşağıdaki kod örneğini doc_intel_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


# 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()

Uygulamayı çalıştırma

Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:

  1. doc_intel_quickstart.py dosyanızın bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

    python doc_intel_quickstart.py
    

Belirli bir dosyayı URL'de analiz etmek için yöntemini kullanacaksınız begin_analyze_document_from_url ve model kimliği olarak geçiş yapacaksınız prebuilt-layout . Döndürülen değer, gönderilen belgeyle ilgili verileri içeren bir result nesnedir.

aşağıdaki kod örneğini form_recognizer_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


# 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()

Uygulamayı çalıştırma

Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:

  1. form_recognizer_quickstart.py dosyanızın bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

    python form_recognizer_quickstart.py
    

Düzen modeli çıkışı

Beklenen çıkışın kod parçacığı aşağıdadır:

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

Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve düzen modeli çıkışını görüntüleyin.

aşağıdaki kod örneğini form_recognizer_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


# 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()


Uygulamayı çalıştırma

Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:

  1. form_recognizer_quickstart.py dosyanızın bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

    python form_recognizer_quickstart.py
    

Önceden oluşturulmuş model

Önceden oluşturulmuş bir model kullanarak belirli belge türlerinden ortak alanları analiz edin ve ayıklayın. Bu örnekte, önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz ediyoruz.

İpucu

Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. İşlem için analyze kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Bkz. model veri ayıklama.

  • Önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz edin. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
  • Dosyanın üst kısmındaki değişkene invoiceUrl dosya URL'si değerini ekledik.
  • Kolaylık olması için, hizmetin döndürdüğü tüm anahtar-değer çiftleri burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.

aşağıdaki kod örneğini doc_intel_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


# 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()


Uygulamayı çalıştırma

Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:

  1. doc_intel_quickstart.py dosyanızın bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

    python doc_intel_quickstart.py
    

Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacak begin_analyze_document_from_url ve model kimliği olarak geçireceksiniz prebuilt-invoice . Döndürülen değer, gönderilen belgeyle ilgili verileri içeren bir result nesnedir.

aşağıdaki kod örneğini form_recognizer_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:

# 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()


Uygulamayı çalıştırma

Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:

  1. form_recognizer_quickstart.py dosyanızın bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

    python form_recognizer_quickstart.py
    

Önceden oluşturulmuş model çıkışı

Beklenen çıkışın kod parçacığı aşağıdadır:

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

Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve önceden oluşturulmuş fatura modeli çıkışını görüntüleyin.

aşağıdaki kod örneğini form_recognizer_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:


# 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()


Uygulamayı çalıştırma

Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:

  1. form_recognizer_quickstart.py dosyanızın bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

    python form_recognizer_quickstart.py
    

Bu hızlı başlangıçta, belgelerdeki verileri ve değerleri analiz etmek ve ayıklamak için Belge Zekası REST API'sini kullanmayı öğrenin:

Önkoşullar

  • Azure aboneliği - Ücretsiz olarak oluşturun

  • curl komut satırı aracı yüklendi.

  • PowerShell sürüm 7.*+ (veya benzer bir komut satırı uygulaması).):

  • PowerShell sürümünüzü denetlemek için işletim sisteminize göre aşağıdaki komutu yazın:

    • Windows: Get-Host | Select-Object Version
    • macOS veya Linux: $PSVersionTable
  • Belge Zekası (tek hizmetli) veya Azure AI hizmetleri (çok hizmetli) kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

İpucu

Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.

  • Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:

    Azure portalında anahtarların ve uç nokta konumunun ekran görüntüsü.

Belgeleri analiz etme ve sonuç alma

POST isteği, belgeleri önceden oluşturulmuş veya özel bir modelle analiz etmek için kullanılır. Get isteği, belge çözümleme çağrısının sonucunu almak için kullanılır. , modelId POST ve resultId GET işlemleriyle birlikte kullanılır.

Belgeyi analiz etme (POST İsteği)

cURL komutunu çalıştırmadan önce, istek sonrası için aşağıdaki değişiklikleri yapın:

  1. değerini Azure portal Belge Zekası örneğinizdeki uç nokta değeriyle değiştirin {endpoint} .

  2. değerini Azure portal Belge Zekası örneğinizdeki anahtar değeriyle değiştirin {key} .

  3. Başvuru olarak aşağıdaki tabloyu kullanarak ve {your-document-url} değerlerini istediğiniz değerlerle değiştirin{modelID}.

  4. URL'de bir belge dosyası gerekir. Bu hızlı başlangıç için, her özellik için aşağıdaki tabloda sağlanan örnek formları kullanabilirsiniz:

Örnek belgeler

Özellik {modelID} {your-document-url}
Okuma önceden oluşturulmuş okuma https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Düzen önceden oluşturulmuş düzen https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Sağlık sigortası kartı 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
Fatura önceden oluşturulmuş fatura https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Makbuz önceden oluşturulmuş makbuz https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Kimlik belgesi prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

Örnek belgeler

Özellik {modelID} {your-document-url}
Genel Belge önceden oluşturulmuş belge https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Okuma önceden oluşturulmuş okuma https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
Düzen önceden oluşturulmuş düzen https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
Sağlık sigortası kartı 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
Fatura önceden oluşturulmuş fatura https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
Makbuz önceden oluşturulmuş makbuz https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
Kimlik belgesi prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png
Kartvizit önceden oluşturulmuş businessCard https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.

POST isteği

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

POST yanıtı (resultID)

Salt okunur operation-location 202 (Success) üst bilgisi içeren bir yanıt alırsınız. Bu üst bilginin değeri, zaman uyumsuz işlemin durumunu almak ve aynı kaynak abonelik anahtarınızla bir GET isteği kullanarak sonuçları almak için sorgulanabilen bir içerir resultID :

{alt-text}

Sonuçları analiz etme (GET İsteği)

API'yi Analyze document çağırdıktan sonra, işlemin ve ayıklanan verilerin durumunu almak için Çözümle sonuç API'sini çağırın. Komutu çalıştırmadan önce şu değişiklikleri yapın:

API'yi Analyze document çağırdıktan sonra, işlemin ve ayıklanan verilerin durumunu almak için Çözümle sonuç API'sini çağırın. Komutu çalıştırmadan önce şu değişiklikleri yapın:

API'yi Analyze document çağırdıktan sonra, işlemin ve ayıklanan verilerin durumunu almak için Çözümle sonuç API'sini çağırın. Komutu çalıştırmadan önce şu değişiklikleri yapın:

  1. POST yanıtından Operation-Location üst bilgisini değiştirin{resultID}.

  2. değerini Azure portalındaki Belge Zekası örneğinizdeki anahtar değeriyle değiştirin {key} .

GET isteği

curl -v -X GET "{endpoint}/documentintelligence/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2024-07-31-preview" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2023-07-31" -H "Ocp-Apim-Subscription-Key: {key}"

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

Yanıtı inceleme

JSON çıkışıyla bir 200 (Success) yanıt alırsınız. İlk alan olan "status", işlemin durumunu gösterir. İşlem tamamlanmazsa veya "notStarted"değeridir "status" "running" ve API'yi el ile veya bir betik aracılığıyla yeniden çağırmalısınız. Aramalar arasında bir saniyelik veya daha fazla bir aralık öneririz.

Önceden oluşturulmuş fatura için örnek yanıt

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

Desteklenen belge alanları

Önceden oluşturulmuş modeller, önceden tanımlanmış belge alanı kümelerini ayıklar. Ayıklanan alan adları, türleri, açıklamaları ve örnekler için bkz . Model veri ayıklama .

İşte bu kadar, tebrikler!

Bu hızlı başlangıçta, çeşitli formları ve belgeleri analiz etmek için bir belge Yönetim Bilgileri modeli kullandınız. Ardından, Belge Zekası API'sini ayrıntılı olarak öğrenmek için Document Intelligence Studio'yu inceleyin ve belgelere başvurun.

Sonraki adımlar

  • Gelişmiş bir deneyim ve gelişmiş model kalitesi için Document Intelligence Studio'yu deneyin

  • v3.1 ile v4.0 arasında geçiş için bkz . Changelog Geçişi kılavuzları.

Bu içerik şunlar için geçerlidir: Checkmark v2.1 | En son sürüm: mavi onay işareti v4.0 (önizleme)

İstediğiniz programlama dilini veya REST API'yi kullanarak Azure AI Belge Zekası'nı kullanmaya başlayın. Belge Zekası, belgelerinizden anahtar-değer çiftlerini, metinleri ve tabloları ayıklamak için makine öğrenmesini kullanan bulut tabanlı bir Azure yapay zeka hizmetidir. Teknolojiyi öğrenirken ücretsiz hizmeti kullanmanızı öneririz. Ücretsiz sayfa sayısının ayda 500 ile sınırlı olduğunu unutmayın.

Belge Zekası özellikleri ve geliştirme seçenekleri hakkında daha fazla bilgi edinmek için Genel Bakış sayfamızı ziyaret edin.

Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (NuGet)Örnekleri |

Bu hızlı başlangıçta, formlardan ve belgelerden yapılandırılmış verileri ayıklamak için aşağıdaki API'leri kullanacaksınız:

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.

  • Visual Studio IDE'nin geçerli sürümü.

  • Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

    İpucu

    Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.

  • Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:

    Azure portalında anahtarların ve uç nokta konumunun ekran görüntüsü.

Ayarlama

  1. Visual Studio 2019'u başlatın.

  2. Başlangıç sayfasında Yeni proje oluştur'u seçin.

    Visual Studio başlangıç penceresinin ekran görüntüsü.

  3. Yeni proje oluştur sayfasında, arama kutusuna konsol yazın. Konsol Uygulaması şablonunu ve ardından İleri'yi seçin.

    Visual Studio yeni proje oluştur sayfasının ekran görüntüsü.

  4. Yeni projenizi yapılandırın iletişim penceresinde Proje adı kutusuna girinformRecognizer_quickstart. Ardından İleri'yi seçin.

    Visual Studios yeni projeyi yapılandır iletişim penceresinin ekran görüntüsü.

  5. Ek bilgiler iletişim kutusunda .NET 5.0 (Geçerli) öğesini ve ardından Oluştur'u seçin.

    Visual Studio ek bilgi iletişim kutusunun ekran görüntüsü.

NuGet ile istemci kitaplığını yükleme

  1. formRecognizer_quickstart projenize sağ tıklayın ve NuGet Paketlerini Yönet... öğesini seçin.

    NuGet paketi seç penceresini gösteren ekran görüntüsü.

  2. Gözat sekmesini seçin ve Azure.AI.FormRecognizer yazın.

    Belge Yönetim Bilgileri paketi seç açılan menüsünü gösteren ekran görüntüsü.

  3. Açılan menüden sürüm 3.1.1'i ve ardından Yükle'yi seçin.

Uygulamanızı derleme

Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini FormRecognizerClient oluşturmanız gerekir. Bunu yapmak için anahtarınız ile bir AzureKeyCredential ve ve Belge Zekası endpointile AzureKeyCredential bir FormRecognizerClient örnek oluşturursunuz.

Not

  • .NET 6'dan başlayarak, şablonu kullanan console yeni projeler önceki sürümlerden farklı yeni bir program stili oluşturur.
  • Yeni çıkış, yazmanız gereken kodu basitleştiren son C# özelliklerini kullanır.
  • Daha yeni sürümü kullandığınızda, yalnızca yönteminin gövdesini Main yazmanız gerekir. Üst düzey deyimleri, genel using yönergelerini veya örtük using yönergelerini eklemeniz gerekmez.
  • Daha fazla bilgi için bkz. Yeni C# şablonları üst düzey deyimler oluşturma.
  1. Program.cs dosyasını açın.

  2. Aşağıdaki kullanım yönergelerini ekleyin:

using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
  1. ve ortam değişkenlerinizi endpoint ayarlayın ve ve FormRecognizerClient örneğinizi AzureKeyCredential oluşturun:key
private static readonly string endpoint = "your-form-recognizer-endpoint";
private static readonly string key = "your-api-key";
private static readonly AzureKeyCredential credential = new AzureKeyCredential(key);
  1. satırını Console.Writeline("Hello World!"); silin ve Try It kod örneklerinden birini Program.cs dosyasına ekleyin:

    Main yöntemine örnek kodu ekleme işleminin ekran görüntüsü.

  2. Uygulamanızın Main yöntemine kopyalayıp yapıştırmak için bir kod örneği seçin:

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

Deneyin: Düzen modeli

Belgelerden sınırlayıcı bölge koordinatlarıyla birlikte metin, seçim işaretleri, metin stilleri ve tablo yapılarını ayıklayın.

  • Bu örnekte, URI'de bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
  • Değişkene dosya URI değerini ekledik formUri .
  • URI'deki belirli bir dosyadan düzeni ayıklamak StartRecognizeContentFromUriAsync için yöntemini kullanın.

Düzen uygulama Program.cs dosyanıza aşağıdaki kodu ekleyin:


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}'.");
                    }
                }
            }
        }
    }
}

Deneyin: Önceden oluşturulmuş model

Bu örnek, örnek olarak fatura kullanarak önceden eğitilmiş modellerle belirli ortak belge türlerindeki verilerin nasıl çözümlendiğini gösterir.

  • Bu örnekte, önceden oluşturulmuş bir model kullanarak bir fatura belgesini analiz edeceğiz. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
  • Main yönteminin en üstündeki değişkene invoiceUri dosya URI değerini ekledik.
  • URI'de belirli bir dosyayı analiz etmek için yöntemini kullanın StartRecognizeInvoicesFromUriAsync .
  • Kolaylık olması için, hizmetin döndürdüğü tüm alanlar burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.

Önceden oluşturulmuş bir model seçin

Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. Analiz işlemi için kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Belge Yönetim Bilgileri hizmeti tarafından şu anda desteklenen önceden oluşturulmuş modeller şunlardır:

  • Fatura: Faturalardan metin, seçim işaretleri, tablolar, alanlar ve anahtar bilgilerini ayıklar.
  • Alındı bilgisi: Makbuzlardan metin ve anahtar bilgilerini ayıklar.
  • Kimlik belgesi: Sürücü belgelerinden ve uluslararası pasaportlardan metin ve anahtar bilgilerini ayıklar.
  • Kartvizit: Kartvizitlerden metin ve önemli bilgileri ayıklar.

Aşağıdaki kodu önceden oluşturulmuş fatura uygulamanıza Program.cs dosya yönteminize ekleyin

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}");
       }
     }
   }
 }
}

Uygulamanızı çalıştırma

Programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.

Visual Studio programınızı çalıştırma işleminin ekran görüntüsü.

Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (Maven)Örnekler |

Bu hızlı başlangıçta, formlardan ve belgelerden yapılandırılmış verileri ayıklamak için aşağıdaki API'leri kullanacaksınız:

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.

  • Java Geliştirme Seti (JDK) sürüm 8 veya üzeri. Daha fazla bilgi için bkz. Desteklenen Java Sürümleri ve güncelleştirme zamanlaması.

  • Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

  • Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:

    Azure portalında anahtarların ve uç nokta konumunun ekran görüntüsü.

Ayarlama

Yeni Gradle projesi oluşturma

Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için form-recognizer-app adlı yeni bir dizin oluşturun ve bu dizine gidin.

mkdir form-recognizer-app && form-recognizer-app
  1. gradle init Komutunu çalışma dizininizden çalıştırın. Bu komut, uygulamanızı oluşturmak ve yapılandırmak için çalışma zamanında kullanılan build.gradle.kts dahil olmak üzere Gradle için temel derleme dosyaları oluşturur.

    gradle init --type basic
    
  2. DSL seçmeniz istendiğinde Kotlin'i seçin.

  3. Varsayılan proje adını kabul edin (form-recognizer-app)

İstemci kitaplığını yükleme

Bu hızlı başlangıçta Gradle bağımlılık yöneticisi kullanılır. Maven Central Repository'de diğer bağımlılık yöneticilerinin istemci kitaplığını ve bilgilerini bulabilirsiniz.

Projenizin build.gradle.kts dosyasında, istemci kitaplığını gerekli eklentiler ve ayarlarla birlikte bir implementation deyim olarak ekleyin.

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

Java dosyası oluşturma

Çalışma dizininizden aşağıdaki komutu çalıştırın:

mkdir -p src/main/java

Aşağıdaki dizin yapısını oluşturursunuz:

Uygulamanın Java dizin yapısının ekran görüntüsü.

Java dizinine gidin ve FormRecognizer.java adlı bir dosya oluşturun. Bunu tercih ettiğiniz düzenleyicide veya IDE'de açın ve aşağıdaki paket bildirimini ve import deyimlerini ekleyin:

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;

Uygulamanızın ana yöntemine kopyalayıp yapıştırmak için bir kod örneği seçin:

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.

Deneyin: Düzen modeli

Belgelerden sınırlayıcı bölge koordinatlarıyla birlikte metin, seçim işaretleri, metin stilleri ve tablo yapılarını ayıklayın.

  • Bu örnekte, URI'de bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
  • Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacaksınız beginRecognizeContentFromUrl .
  • Main yöntemindeki değişkene formUrl dosya URI değerini ekledik.

Uygulamanızın FormRecognizer sınıfını aşağıdaki kodla güncelleştirin (anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirin):


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();
            });
        });
    }

Deneyin: Önceden oluşturulmuş model

Bu örnek, örnek olarak fatura kullanarak önceden eğitilmiş modellerle belirli ortak belge türlerindeki verilerin nasıl çözümlendiğini gösterir.

  • Bu örnekte, önceden oluşturulmuş bir model kullanarak bir fatura belgesini analiz edeceğiz. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
  • Belirli bir dosyayı URI'de analiz etmek için kullanacaksınız beginRecognizeInvoicesFromUrl .
  • Main yöntemindeki değişkene invoiceUrl dosya URI değerini ekledik.
  • Kolaylık olması için, hizmetin döndürdüğü tüm alanlar burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.

Önceden oluşturulmuş bir model seçin

Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. Analiz işlemi için kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Belge Yönetim Bilgileri hizmeti tarafından şu anda desteklenen önceden oluşturulmuş modeller şunlardır:

  • Fatura: Faturalardan metin, seçim işaretleri, tablolar, alanlar ve anahtar bilgilerini ayıklar.
  • Alındı bilgisi: Makbuzlardan metin ve anahtar bilgilerini ayıklar.
  • Kimlik belgesi: Sürücü belgelerinden ve uluslararası pasaportlardan metin ve anahtar bilgilerini ayıklar.
  • Kartvizit: Kartvizitlerden metin ve önemli bilgileri ayıklar.

Uygulamanızın FormRecognizer sınıfını aşağıdaki kodla güncelleştirin (anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirin):


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());
            }
        }
    }
}

Uygulamanızı derleme ve çalıştırma

Ana proje dizininize (form-recognizer-app) geri dönün.

  1. Uygulamanızı şu komutla build oluşturun:
gradle build
  1. Uygulamanızı şu komutla run çalıştırın:
gradle run

Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (npm)Örnekler |

Bu hızlı başlangıçta, formlardan ve belgelerden yapılandırılmış verileri ayıklamak için aşağıdaki API'leri kullanacaksınız:

Önkoşullar

  • Azure aboneliği - Ücretsiz bir abonelik oluşturun.

  • Visual Studio Code'un en son sürümü veya tercih ettiğiniz IDE.

  • Node.js'nin en son LTS sürümü

  • Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

    İpucu

    Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.

  • Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:

    Azure portalında anahtarların ve uç nokta konumunun ekran görüntüsü.

Ayarlama

  1. Yeni bir Node.js uygulaması oluşturun. Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için yeni bir dizin oluşturun ve bu dizine gidin.

    mkdir form-recognizer-app && cd form-recognizer-app
    
  2. Bir package.json dosyası ile bir düğüm uygulaması oluşturmak için npm init komutunu çalıştırın.

    npm init
    
  3. ai-form-recognizer İstemci kitaplığı npm paketini yükleyin:

    npm install @azure/ai-form-recognizer
    

    Uygulamanızın package.json dosyası bağımlılıklarla güncelleştirilir.

  4. adlı index.jsbir dosya oluşturun, dosyayı açın ve aşağıdaki kitaplıkları içeri aktarın:

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. Kaynağınızın Azure uç noktası ve anahtarı için değişkenler oluşturun:

    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    
  6. Bu noktada JavaScript uygulamanız aşağıdaki kod satırlarını içermelidir:

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

Kopyalayıp uygulamanıza yapıştırmak için bir kod örneği seçin:

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.

Deneyin: Düzen modeli

  • Bu örnekte, URI'de bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
  • Dosyanın üst kısmındaki değişkene formUrl dosya URI değerini ekledik.
  • Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacaksınız beginRecognizeContent .

Aşağıdaki kodu değişkenin altındaki key satıra düzen uygulamanıza ekleyin

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);
});

Deneyin: Önceden oluşturulmuş model

Bu örnek, örnek olarak fatura kullanarak önceden eğitilmiş modellerle belirli ortak belge türlerindeki verilerin nasıl çözümlendiğini gösterir. Fatura alanlarının tam listesi için önceden oluşturulmuş kavram sayfamıza bakın

  • Bu örnekte, önceden oluşturulmuş bir model kullanarak bir fatura belgesini analiz edeceğiz. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
  • Dosyanın üst kısmındaki değişkene invoiceUrl dosya URI değerini ekledik.
  • Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacaksınız beginRecognizeInvoices .
  • Kolaylık olması için, hizmetin döndürdüğü tüm alanlar burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.

Önceden oluşturulmuş bir model seçin

Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. Analiz işlemi için kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Belge Yönetim Bilgileri hizmeti tarafından şu anda desteklenen önceden oluşturulmuş modeller şunlardır:

  • Fatura: Faturalardan metin, seçim işaretleri, tablolar, alanlar ve anahtar bilgilerini ayıklar.
  • Alındı bilgisi: Makbuzlardan metin ve anahtar bilgilerini ayıklar.
  • Kimlik belgesi: Sürücü belgelerinden ve uluslararası pasaportlardan metin ve anahtar bilgilerini ayıklar.
  • Kartvizit: Kartvizitlerden metin ve önemli bilgileri ayıklar.

Önceden oluşturulmuş fatura uygulamanıza aşağıdaki kodu değişkeninin key altına ekleyin


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);
});

Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (PyPi)Örnekleri |

Bu hızlı başlangıçta, formlardan ve belgelerden yapılandırılmış verileri ayıklamak için aşağıdaki API'leri kullanacaksınız:

Önkoşullar

  • Azure aboneliği - Ücretsiz olarak oluşturun

  • Python 3.x

    • Python yüklemeniz pip içermelidir. Pip'in yüklü olup olmadığını denetlemek için komut satırında komutunu çalıştırabilirsiniz pip --version . Python'ın en son sürümünü yükleyerek pip alın.
  • Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

    İpucu

    Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.

  • Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:

    Azure portalında anahtarların ve uç nokta konumunun ekran görüntüsü.

Ayarlama

Yerel ortamınızda bir terminal penceresi açın ve pip ile Python için Azure AI Document Intelligence istemci kitaplığını yükleyin:

pip install azure-ai-formrecognizer

Yeni Python uygulaması oluşturma

Tercih ettiğiniz düzenleyicide veya IDE'de form_recognizer_quickstart.py adlı yeni bir Python uygulaması oluşturun. Ardından aşağıdaki kitaplıkları içeri aktarın:

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

Azure kaynak uç noktanız ve anahtarınız için değişkenler oluşturma

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

Bu noktada Python uygulamanız aşağıdaki kod satırlarını içermelidir:

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"

Kopyalayıp uygulamanıza yapıştırmak için bir kod örneği seçin:

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.

Deneyin: Düzen modeli

  • Bu örnekte, URI'de bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
  • Dosyanın üst kısmındaki değişkene formUrl dosya URI değerini ekledik.
  • Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacaksınız begin_recognize_content_from_url .

Aşağıdaki kodu değişkenin altındaki key satıra düzen uygulamanıza ekleyin


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

Deneyin: Önceden oluşturulmuş model

Bu örnek, örnek olarak fatura kullanarak önceden eğitilmiş modellerle belirli ortak belge türlerindeki verilerin nasıl çözümlendiğini gösterir. Fatura alanlarının tam listesi için önceden oluşturulmuş kavram sayfamıza bakın

  • Bu örnekte, önceden oluşturulmuş bir model kullanarak bir fatura belgesini analiz edeceğiz. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
  • Dosyanın en üstündeki ''formUrl' değişkenine dosya URI değerini ekledik.
  • Belirli bir dosyayı URI'de analiz etmek için ''begin_recognize_invoices_from_url' yöntemini kullanacaksınız.
  • Kolaylık olması için, hizmetin döndürdüğü tüm alanlar burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.

Önceden oluşturulmuş bir model seçin

Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. Analiz işlemi için kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Belge Yönetim Bilgileri hizmeti tarafından şu anda desteklenen önceden oluşturulmuş modeller şunlardır:

  • Fatura: Faturalardan metin, seçim işaretleri, tablolar, alanlar ve anahtar bilgilerini ayıklar.
  • Alındı bilgisi: Makbuzlardan metin ve anahtar bilgilerini ayıklar.
  • Kimlik belgesi: Sürücü belgelerinden ve uluslararası pasaportlardan metin ve anahtar bilgilerini ayıklar.
  • Kartvizit: Kartvizitlerden metin ve önemli bilgileri ayıklar.

Önceden oluşturulmuş fatura uygulamanıza aşağıdaki kodu değişkeninin key altına ekleyin


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

Uygulamanızı çalıştırma

  1. form_recognizer_quickstart.py dosyanızın bulunduğu klasöre gidin.

  2. Terminalinize aşağıdaki komutu yazın:

python form_recognizer_quickstart.py

| Belge Zekası REST API'si | Azure REST API başvurusu |

Bu hızlı başlangıçta, formlardan ve belgelerden yapılandırılmış verileri ayıklamak için aşağıdaki API'leri kullanacaksınız:

Önkoşullar

  • Azure aboneliği - Ücretsiz olarak oluşturun

  • cURL yüklü.

  • PowerShell sürüm 6.0+ veya benzer bir komut satırı uygulaması.

  • Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

    İpucu

    Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.

  • Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:

    Azure portalında anahtarların ve uç nokta konumunun ekran görüntüsü.

Kopyalayıp uygulamanıza yapıştırmak için bir kod örneği seçin:

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.

Deneyin: Düzen modeli

  • Bu örnekte, URI'de bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
  1. değerini, elde ettiğiniz uç noktayla Belge Yönetim Bilgileri aboneliğinizle değiştirin {endpoint} .
  2. değerini önceki adımda kopyaladığınız anahtarla değiştirin {key} .
  3. değerini örnek belge URL'si ile değiştirin \"{your-document-url} :
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf

İstek

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}'}​​​​​​​​"

İşlem Konumu

Operation-Location üst bilgisi içeren bir yanıt alırsınız202 (Success). Bu üst bilginin değeri, zaman uyumsuz işlemin durumunu sorgulamak ve sonuçları almak için kullanabileceğiniz bir sonuç kimliği içerir:

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

Aşağıdaki örnekte URL'nin bir parçası olarak, sonrasındaki dize analyzeResults/ sonuç kimliğidir.

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

Düzen sonuçlarını alma

Çözümle Düzeni API'sini çağırdıktan sonra, işlemin durumunu ve ayıklanan verileri almak için Çözümle Düzeni Sonuç API'sini çağırırsınız. Komutu çalıştırmadan önce şu değişiklikleri yapın:

  1. değerini, elde ettiğiniz uç noktayla Belge Yönetim Bilgileri aboneliğinizle değiştirin {endpoint} .
  2. değerini önceki adımda kopyaladığınız anahtarla değiştirin {key} .
  3. değerini önceki adımdaki sonuç kimliğiyle değiştirin {resultId} .

İstek

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

Sonuçları inceleme

JSON içeriğiyle bir 200 (success) yanıt alırsınız.

Aşağıdaki fatura görüntüsüne ve buna karşılık gelen JSON çıkışına bakın.

  • Düğüm, "readResults" sayfada ilgili sınırlayıcı kutu yerleşimine sahip her metin satırını içerir.
  • Düğüm her selectionMarks seçim işaretini (onay kutusu, radyo işareti) ve durumunun veya unselectedolup selected olmadığını gösterir.
  • bölümü "pageResults" ayıklanan tabloları içerir. Her tablo için metin, satır ve sütun dizini, yayılan satır ve sütun, sınırlayıcı kutu ve daha fazlası ayıklanır.

Tablo içeren Contoso proje deyimi belgesi.

Yanıt gövdesi

GitHub'da tam örnek çıktısını görüntüleyebilirsiniz.

Deneyin: Önceden oluşturulmuş model

  • Bu örnekte, önceden oluşturulmuş bir model kullanarak bir fatura belgesini analiz edeceğiz. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.

Önceden oluşturulmuş bir model seçin

Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. Analiz işlemi için kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Belge Yönetim Bilgileri hizmeti tarafından şu anda desteklenen önceden oluşturulmuş modeller şunlardır:

  • Fatura: Faturalardan metin, seçim işaretleri, tablolar, alanlar ve anahtar bilgilerini ayıklar.
  • Alındı bilgisi: Makbuzlardan metin ve anahtar bilgilerini ayıklar.
  • Kimlik belgesi: Sürücü belgelerinden ve uluslararası pasaportlardan metin ve anahtar bilgilerini ayıklar.
  • Kartvizit: Kartvizitlerden metin ve önemli bilgileri ayıklar.

Komutu çalıştırmadan önce şu değişiklikleri yapın:

  1. değerini, elde ettiğiniz uç noktayla Belge Yönetim Bilgileri aboneliğinizle değiştirin {endpoint} .

  2. değerini önceki adımda kopyaladığınız anahtarla değiştirin {key} .

  3. değerini örnek fatura URL'si ile değiştirin \"{your-document-url} :

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

İstek

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}'}​​​​​​​​"

İşlem Konumu

Operation-Location üst bilgisi içeren bir yanıt alırsınız202 (Success). Bu üst bilginin değeri, zaman uyumsuz işlemin durumunu sorgulamak ve sonuçları almak için kullanabileceğiniz bir sonuç kimliği içerir:

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

Aşağıdaki örnekte URL'nin bir parçası olarak, sonraki dize analyzeResults/ sonuç kimliğidir:

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

Fatura sonuçlarını alma

Fatura Analizi API'sini çağırdıktan sonra, işlemin ve ayıklanan verilerin durumunu almak için Fatura AnaliziNi Al Sonuç API'sini çağırırsınız. Komutu çalıştırmadan önce şu değişiklikleri yapın:

  1. değerini, aldığınız uç noktayla Belge Yönetim Bilgileri anahtarınız ile değiştirin {endpoint} . Belge Yönetim Bilgileri kaynağına Genel Bakış sekmesinde bulabilirsiniz.
  2. değerini önceki adımdaki sonuç kimliğiyle değiştirin {resultId} .
  3. {key} yerine anahtarınızı yazın.

İstek

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

Yanıtı inceleme

JSON çıkışıyla bir 200 (Success) yanıt alırsınız.

  • alanı, "readResults" faturadan ayıklanan her metin satırını içerir.
  • , "pageResults" faturadan ayıklanan tabloları ve seçim işaretlerini içerir.
  • alanı, "documentResults" faturanın en ilgili bölümleri için anahtar/değer bilgilerini içerir.

Örnek fatura belgesine bakın.

Yanıt gövdesi

GitHub'da tam örnek çıktıya bakın.

İşte bu kadar, ala!

Sonraki adımlar

  • Gelişmiş bir deneyim ve gelişmiş model kalitesi için Document Intelligence Studio'yu deneyin.

    • Studio, v2.1 etiketli verilerle eğitilen tüm modelleri destekler.

    • Değişiklik günlükleri, v3.1'den v4.0'a geçiş hakkında ayrıntılı bilgi sağlar.