بدء استخدام ذكاء المستند

هام

  • أصبح Azure Cognitive Services Form Recognizer الآن Azure الذكاء الاصطناعي Document Intelligence.
  • لا تزال بعض الأنظمة الأساسية تنتظر تحديث إعادة التسمية.
  • تشير جميع إشارة Form Recognizer أو Document Intelligence في وثائقنا إلى نفس خدمة Azure.

ينطبق هذا المحتوى على:علامهv4.0 (معاينة)الإصدارات السابقة:علامة اختيار زرقاءv3.1 (GA)علامة اختيار زرقاءv3.0 (GA)

  • ابدأ باستخدام Azure الذكاء الاصطناعي Document Intelligence أحدث إصدار معاينة (2024-02-29-preview).

ينطبق هذا المحتوى على:علامهv3.1 (GA)الإصدارات السابقة:علامة اختيار زرقاءv3.0علامة اختيار زرقاءv2.1

  • ابدأ باستخدام Azure Form Recognizer أحدث إصدار GA (2023-07-31).

ينطبق هذا المحتوى على:علامهv3.0 (GA)الإصدار الأحدث:علامة اختيار زرقاءv3.1علامة اختيار زرقاءv2.1

  • ابدأ باستخدام إصدار GA القديم من Azure Form Recognizer (2022-08-31).
  • Azure الذكاء الاصطناعي Document Intelligence / Form Recognizer هي خدمة Azure الذكاء الاصطناعي مستندة إلى السحابة تستخدم التعلم الآلي لاستخراج أزواج قيم المفاتيح والنص والجداول والبيانات الرئيسية من مستنداتك.

  • يمكنك بسهولة دمج نماذج معالجة المستندات في مهام سير العمل والتطبيقات باستخدام لغة برمجة SDK أو استدعاء واجهة برمجة تطبيقات REST.

  • نوصي في هذا التشغيل السريع باستخدام الخدمة المجانية بينما تتعرف على التقنية. تذكر أن عدد الصفحات المجانية يقتصر على 500 صفحة في الشهر.

لمعرفة المزيد حول ميزات واجهة برمجة التطبيقات وخيارات التطوير، تفضل بزيارة صفحة نظرة عامة .

حزمة مرجع واجهة برمجة التطبيقات ( | | NuGet) | نماذج | إصدار REST API المعتمد لمكتبة | العميل SDK

في هذا التشغيل السريع، استخدم الميزات التالية لتحليل واستخراج البيانات والقيم من النماذج والمستندات:

  • نموذج التصميم - تحليل الجداول والخطوط والكلمات وعلامات التحديد مثل أزرار الاختيار ومربعات الاختيار في المستندات واستخراجها دون الحاجة إلى تدريب نموذج.

  • نموذج مُعد مسبقًا - تحليل الحقول المشتركة من أنواع مستندات محددة واستخراجها باستخدام نموذج مُعد مسبقًا.

المتطلبات الأساسية

  • خدمات Azure الذكاء الاصطناعي أو مورد تحليل معلومات المستند. بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء خدمة واحدة أو مورد Azure الذكاء الاصطناعي متعدد الخدمات ، في مدخل Microsoft Azure، للحصول على المفتاح ونقطة النهاية.

  • يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

تلميح

إنشاء مورد خدمات Azure الذكاء الاصطناعي إذا كنت تخطط للوصول إلى خدمات Azure الذكاء الاصطناعي المتعددة ضمن نقطة نهاية/مفتاح واحد. للوصول إلى Document Intelligence فقط، قم بإنشاء مورد Document Intelligence. يرجى ملاحظة أنك ستحتاج إلى مورد خدمة واحدة إذا كنت تنوي استخدام مصادقة Microsoft Entra.

  • بعد نشر المورد الخاص بك، حدد»Go to resource». تحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Document Intelligence. يمكنك لصق المفتاح ونقطة النهاية في التعليمات البرمجية لاحقا في التشغيل السريع:

    لقطة شاشة للمفاتيح وموقع نقطة النهاية في مدخل Microsoft Azure.

  • خدمات Azure الذكاء الاصطناعي أو مورد Form Recognizer. بمجرد أن يكون لديك اشتراك Azure، قم بإنشاء خدمة واحدة أو مورد Azure الذكاء الاصطناعي متعدد الخدمات ، في مدخل Microsoft Azure، للحصول على المفتاح ونقطة النهاية.

  • يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

تلميح

إنشاء مورد خدمات Azure الذكاء الاصطناعي إذا كنت تخطط للوصول إلى خدمات Azure الذكاء الاصطناعي المتعددة ضمن نقطة نهاية/مفتاح واحد. للوصول إلى Form Recognizer فقط، أنشئ مورد Form Recognizer. يرجى ملاحظة أنك ستحتاج إلى مورد خدمة واحدة إذا كنت تنوي استخدام مصادقة Microsoft Entra.

  • بعد نشر المورد الخاص بك، حدد»Go to resource». تحتاج إلى المفتاح ونقطة النهاية من المورد الذي أنشأته لتوصيل تطبيقك إلى واجهة برمجة التطبيقات الخاصة بـ Form Recognizer. يمكنك لصق المفتاح ونقطة النهاية في التعليمات البرمجية لاحقا في التشغيل السريع:

    لقطة شاشة للمفاتيح وموقع نقطة النهاية في مدخل Microsoft Azure.

الإعداد

  1. ابدأ تشغيل Visual Studio.

  2. في صفحة البدء، حدد «Create a new project».

    لقطة شاشة لنافذة بدء Visual Studio.

  3. في صفحة «Create a new project»، أدخل وحدة التحكم في مربع البحث. اختر قالب تطبيق وحدة التحكم، ثم اختر التالي.

    لقطة شاشة لصفحة إنشاء مشروع جديد في Visual Studio.

  1. في نافذة الحوار تكوين مشروعك الجديد، أدخل doc_intel_quickstart في مربع اسم المشروع. ثم اختر التالي.
  1. في نافذة الحوار تكوين مشروعك الجديد، أدخل form_recognizer_quickstart في مربع اسم المشروع. ثم اختر التالي.
  1. في نافذة الحوار معلومات إضافية ، حدد .NET 6.0 (دعم طويل الأجل) ، ثم حدد أنشئ .

    لقطة شاشة لنافذة حوار المعلومات الإضافية في Visual Studio.

تثبيت مكتبة العميل مع NuGet

  1. انقر بزر الماوس الأيمن فوق مشروع doc_intel_quickstart وحدد إدارة حزم NuGet... .

    لقطة شاشة لتحديد نافذة حزمة الإصدار التجريبي من NuGet في Visual Studio.

  2. حدد علامة التبويب استعراض واكتب Azure.الذكاء الاصطناعي.DocumentIntelligence. اختر خانة Include prerelease الاختيار وحدد الإصدار 1.0.0-beta.1 من القائمة المنسدلة

    لقطة شاشة لتحديد Document Intelligence prerelease NuGet package في Visual Studio.

  1. انقر بزر الماوس الأيمن فوق مشروع form_recognizer_quickstart وحدد إدارة حزم NuGet... .

    لقطة شاشة للبحث عن نافذة حزمة NuGet في Visual Studio.

  2. حدد علامة التبويب «Browse» واكتب Azure.AI.FormRecognizer. حدد الإصدار 4.1.0 من القائمة المنسدلة

    لقطة شاشة لتحديد حزمة NuGet Form Recognizer في Visual Studio.

  1. انقر بزر الماوس الأيمن فوق مشروع form_recognizer_quickstart وحدد إدارة حزم NuGet... .

    لقطة شاشة لنافذة حزمة NuGet في Visual Studio.

  2. حدد علامة التبويب «Browse» واكتب Azure.AI.FormRecognizer. حدد الإصدار 4.0.0 من القائمة المنسدلة

    لقطة شاشة لتحديد حزمة NuGet القديمة في Visual Studio.

إنشاء التطبيق الخاص بك

للتفاعل مع خدمة Document Intelligence، تحتاج إلى إنشاء مثيل للفئة DocumentIntelligenceClient . للقيام بذلك، يمكنك إنشاء AzureKeyCredential باستخدام key من مدخل Microsoft Azure ومثيل DocumentIntelligenceClient مع AzureKeyCredential و Document Intelligence endpointالخاص بك .

للتفاعل مع خدمة Form Recognizer، تحتاج إلى إنشاء مثيل للفئة DocumentAnalysisClient . للقيام بذلك، يمكنك إنشاء AzureKeyCredential مع الخاص بك key من مدخل Microsoft Azure ومثيل DocumentAnalysisClient مع AzureKeyCredential و Form Recognizer endpointالخاص بك .

إشعار

  • بدءاً من .NET 6، تنشئ المشروعات الجديدة التي تستخدم القالب console نمط برنامج جديداً يختلف عن الإصدارات السابقة.
  • يستخدم الإخراج الجديد ميزات #C الحديثة التي تبسط التعليمة البرمجية الذي تحتاج إلى كتابته.
  • عندما تستخدم الإصدار الأحدث، تحتاج فقط إلى كتابة هيكل الأسلوبMain. لست بحاجة إلى تضمين بيانات عالية المستوى أو توجيهات عالمية باستخدام توجيهات أو استخدام ضمني للتوجيهات.
  • للمزيد من المعلومات، راجع قوالب C# الجديدة تنشئ عبارات ذات مستوى أعلى.
  1. افتح ملف Program.cs.

  2. احذف التعليمات البرمجية الموجودة مسبقًا، بما في ذلك السطر Console.Writeline("Hello World!")، وحدد إحدى عينات التعليمات البرمجية التالية لنسخها ولصقها في ملف Program.cs لتطبيقك:

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات، راجع أمان خدمات Azure الذكاء الاصطناعي.

نموذج تخطيط

استخراج النص وعلامات التحديد وأنماط النص وبنية الجدول، إلى جانب إحداثيات المنطقة المحيطة بها من المستندات.

  • في هذا المثال، ستحتاج إلى ملف مستند من URI. يمكنك استخدام نموذج المستند الخاص بنا لهذا التشغيل السريع.
  • لقد أضفنا قيمة الملف URI إلى متغير Uri fileUri في الجزء العلوي من النص.
  • لاستخراج التخطيط من ملف معين في عنوان URI، استخدم StartAnalyzeDocumentFromUri«method and pass»prebuilt-layout كمعرف النموذج. القيمة التي تم إرجاعها هي AnalyzeResultكائن يحتوي على بيانات المستند المرسل.

أضف عينة التعليمات البرمجية التالية إلى ملف Program.cs. تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure:


using Azure;
using Azure.AI.DocumentIntelligence;

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

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

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

AnalyzeResult result = operation.Value;

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

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

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

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

        Console.WriteLine();
    }

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

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

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

        Console.WriteLine();
    }
}

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

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

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

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

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

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

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

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

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

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

تشغيل التطبيق الخاص بك

بمجرد إضافة نموذج تعليمة برمجية إلى التطبيق الخاص بك، اختر زر البدء الأخضر بجوار formRecognizer_quickstart لإنشاء البرنامج وتشغيله، أو اضغط على F5.

لقطة شاشة لتشغيل زر برنامج Visual Studio.

أضف عينة التعليمات البرمجية التالية إلى ملف Program.cs. تأكد من قيامك بتحديث المفتاح ومتغيرات نقطة النهاية بقيم من مثيل Form Recognizer في مدخل Microsoft Azure:

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

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

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

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

AnalyzeResult result = operation.Value;

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

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

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

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

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

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

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

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

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

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

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

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

تشغيل التطبيق الخاص بك

بمجرد إضافة نموذج تعليمة برمجية إلى التطبيق الخاص بك، اختر زر البدء الأخضر بجوار formRecognizer_quickstart لإنشاء البرنامج وتشغيله، أو اضغط على F5.

لقطة شاشة لتشغيل موقع زر برنامج Visual Studio.

مخرجات نموذج تخطيط

فيما يلي مقتطف من الناتج المتوقع:

  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

لعرض الإخراج بالكامل، تفضل بزيارة مستودع عينات Azure على GitHub لعرض إخراج نموذج التخطيط.

أضف عينة التعليمات البرمجية التالية إلى ملف Program.cs. تأكد من قيامك بتحديث المفتاح ومتغيرات نقطة النهاية بقيم من مثيل Form Recognizer في مدخل Microsoft Azure:

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

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

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

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

AnalyzeResult result = operation.Value;

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

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

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

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

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

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

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

Console.WriteLine("Paragraphs:");

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Console.WriteLine("Paragraphs:");

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

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

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

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

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

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

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

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

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

تشغيل التطبيق الخاص بك

بمجرد إضافة نموذج تعليمة برمجية إلى التطبيق الخاص بك، اختر زر البدء الأخضر بجوار formRecognizer_quickstart لإنشاء البرنامج وتشغيله، أو اضغط على F5.

لقطة شاشة لتشغيل برنامج Visual Studio.

نموذج تم إنشاؤه مسبقًا

تحليل واستخراج الحقول المشتركة من أنواع مستندات معينة باستخدام نموذج مدرب مسبقاً. في هذا المثال، نقوم بتحليل فاتورة باستخدام نموذج الفاتورة الذي تم إنشاؤه مسبقا.

تلميح

أنت لست مقيدًا بالفواتير - يوجد العديد من النماذج التي تم إعدادها مسبقًا للاختيار من بينها، ولكل منها مجموعته الخاصة من الحقول المدعومة. يعتمد النموذج الذي سيتم استخدامه للعملية analyze على نوع المستند الذي سيتم تحليله. انظر نموذج استخراج البيانات .

  • حلل فاتورة باستخدام نموذج الفاتورة الذي تم إنشاؤه مسبقًا. يمكنك استخدام عينة مستند فاتورة لقالب التشغيل السريع هذا.
  • لقد أضفنا قيمة URI للملف إلى متغير Uri invoiceUri في الجزء العلوي من ملف Program.cs.
  • لاستخراج التخطيط من ملف معين في عنوان URI، استخدم StartAnalyzeDocumentFromUri«method and pass»prebuilt-invoice كمعرف النموذج. القيمة التي تم إرجاعها هي AnalyzeResultكائن يحتوي على بيانات المستند المرسل.
  • للتبسيط، لا يتم عرض جميع أزواج القيمة المفتاح التي ترجع الخدمة هنا. للاطلاع على قائمة بجميع الحقول المدعومة والأنواع المتوافقة، راجع صفحة «Invoice concept».

أضف عينة التعليمات البرمجية التالية إلى ملف Program.cs. تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure:


using Azure;
using Azure.AI.DocumentIntelligence;

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

//sample invoice document

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

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

AnalyzeResult result = operation.Value;

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

    AnalyzedDocument document = result.Documents[i];

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

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

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

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

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

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

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

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

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

تشغيل التطبيق الخاص بك

بمجرد إضافة نموذج تعليمة برمجية إلى التطبيق الخاص بك، اختر زر البدء الأخضر بجوار formRecognizer_quickstart لإنشاء البرنامج وتشغيله، أو اضغط على F5.

لقطة شاشة لتشغيل زر برنامج Visual Studio.

أضف عينة التعليمات البرمجية التالية إلى ملف Program.cs. تأكد من قيامك بتحديث المفتاح ومتغيرات نقطة النهاية بقيم من مثيل Form Recognizer في مدخل Microsoft Azure:


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

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

//sample invoice document

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

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

AnalyzeResult result = operation.Value;

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

    AnalyzedDocument document = result.Documents[i];

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

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

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

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

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

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

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

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

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

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

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

تشغيل التطبيق الخاص بك

بمجرد إضافة نموذج تعليمة برمجية إلى التطبيق الخاص بك، اختر زر البدء الأخضر بجوار formRecognizer_quickstart لإنشاء البرنامج وتشغيله، أو اضغط على F5.

لقطة شاشة لتشغيل موقع زر برنامج Visual Studio.

إخراج نموذج تم إنشاؤه مسبقاً

فيما يلي مقتطف من الناتج المتوقع:

  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

لعرض الإخراج بالكامل، تفضل بزيارة مستودع عينات Azure على GitHub لعرض إخراج نموذج الفاتورة المُعد مُسبقًا.

أضف عينة التعليمات البرمجية التالية إلى ملف Program.cs. تأكد من قيامك بتحديث المفتاح ومتغيرات نقطة النهاية بقيم من مثيل Form Recognizer في مدخل Microsoft Azure:


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

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

//sample invoice document

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

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

AnalyzeResult result = operation.Value;

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

    AnalyzedDocument document = result.Documents[i];

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

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

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

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

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

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

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

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

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

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

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

تشغيل التطبيق الخاص بك

بمجرد إضافة نموذج تعليمة برمجية إلى التطبيق الخاص بك، اختر زر البدء الأخضر بجوار formRecognizer_quickstart لإنشاء البرنامج وتشغيله، أو اضغط على F5.

لقطة شاشة لتشغيل برنامج Visual Studio.

في هذا التشغيل السريع، استخدم الميزات التالية لتحليل واستخراج البيانات والقيم من النماذج والمستندات:

  • التخطيط - تحليل واستخراج الجداول والأسطر والكلمات وعلامات التحديد مثل أزرار الاختيار ومربعات الاختيار في مستندات النماذج، دون الحاجة إلى تدريب نموذج.

  • فاتورة تم إنشاؤها مسبقا — قم بتحليل واستخراج الحقول المشتركة من أنواع مستندات معينة باستخدام نموذج مدرب مسبقا.

المتطلبات الأساسية

  • اشتراك Azure - إنشاء حساب مجانًا

  • أحدث إصدار من Visual Studio Code أو IDE المفضل لديك. راجعJava في Visual Studio Code.

    تلميح

    • يقدم Visual Studio Code حزمة ترميز Java لنظامي التشغيل Windows وmacOS. حزمة الترميز عبارة عن حزمة من VS Code، وJava Development Kit (JDK)، ومجموعة من الملحقات المقترحة من Microsoft. من الممكن أيضًا استخدام حزمة الترميز لإصلاح بيئة التطوير الحالية.
    • في حال كنت تستخدم VS Code وCoding Pack For Java، فقم بتثبيت الملحق Gradle for Java.
  • إذا كنت لا تستخدم Visual Studio Code، فتأكد من تثبيت ما يلي في بيئة التطوير الخاصة بك:

  • خدمات Azure الذكاء الاصطناعي أو مورد تحليل معلومات المستند. بمجرد حصولك على اشتراك Azure، أنشئ موردا للمعلومات المستندية لخدمة واحدة أو متعدد الخدمات ، في مدخل Microsoft Azure، للحصول على المفتاح ونقطة النهاية. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

    تلميح

    إنشاء مورد خدمات Azure الذكاء الاصطناعي إذا كنت تخطط للوصول إلى خدمات Azure الذكاء الاصطناعي المتعددة ضمن نقطة نهاية/مفتاح واحد. للوصول إلى Document Intelligence فقط، قم بإنشاء مورد Document Intelligence. يرجى ملاحظة أنك ستحتاج إلى مورد خدمة واحدة إذا كنت تنوي استخدام مصادقة Microsoft Entra.

  • بعد نشر المورد الخاص بك، حدد»Go to resource». تحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Document Intelligence. لاحقا، يمكنك لصق المفتاح ونقطة النهاية في التعليمات البرمجية:

    لقطة شاشة للمفاتيح وموقع نقطة النهاية في مدخل Microsoft Azure.

الإعداد

إنشاء مشروع Gradle جديد

  1. في نافذة وحدة التحكم (مثل cmd أو PowerShell أو Bash)، أنشئ دليلا جديدا لتطبيقك يسمى doc-intel-app، وانتقل إليه.

    mkdir doc-intel-app && doc-intel-app
    
    mkdir doc-intel-app; cd doc-intel-app
    
  2. بادر بتشغيل الأمر gradle init من دليل العمل خاصتك. ينشئ هذا الأمر ملفات بناء أساسية ل Gradle، بما في ذلك build.gradle.kts، والذي يستخدم في وقت التشغيل لإنشاء التطبيق وتكوينه.

    gradle init --type basic
    
  3. عند طلب اختيار DSL، حدد Kotlin.

  4. اقبل اسم المشروع الافتراضي (doc-intel-app) عن طريق تحديد Return أو Enter.

  1. في نافذة وحدة التحكم (مثل cmd أو PowerShell أو Bash)، أنشئ دليلا جديدا لتطبيقك يسمى form-recognize-app، وانتقل إليه.

    mkdir form-recognize-app && form-recognize-app
    
    mkdir form-recognize-app; cd form-recognize-app
    
  2. بادر بتشغيل الأمر gradle init من دليل العمل خاصتك. ينشئ هذا الأمر ملفات بناء أساسية ل Gradle، بما في ذلك build.gradle.kts، والذي يستخدم في وقت التشغيل لإنشاء التطبيق وتكوينه.

    gradle init --type basic
    
  3. عند طلب اختيار DSL، حدد Kotlin.

  4. اقبل اسم المشروع الافتراضي (form-recognize-app) عن طريق تحديد Return أو Enter.

تثبيت مكتبة العميل

يستخدم هذا التشغيل السريع مدير تبعية Gradle. يمكنك العثور على مكتبة العميل ومعلومات مديري التبعية الآخرين على Maven Central Repository.

قم بفتح ملف build.gradle.kts للمشروع في بيئة التطوير المتكامل الخاصة بك. انسخ والصق التعليمات البرمجية التالي لتضمين مكتبة العميل implementation كعبارة جنبًا إلى جنب مع الملحقات والإعدادات المطلوبة.

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

   }

يستخدم هذا التشغيل السريع مدير تبعية Gradle. يمكنك العثور على مكتبة العميل ومعلومات مديري التبعية الآخرين على Maven Central Repository.

قم بفتح ملف build.gradle.kts للمشروع في بيئة التطوير المتكامل الخاصة بك. انسخ والصق التعليمات البرمجية التالي لتضمين مكتبة العميل implementation كعبارة جنبًا إلى جنب مع الملحقات والإعدادات المطلوبة.

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

   }

يستخدم هذا التشغيل السريع مدير تبعية Gradle. يمكنك العثور على مكتبة العميل ومعلومات مديري التبعية الآخرين على Maven Central Repository.

قم بفتح ملف build.gradle.kts للمشروع في بيئة التطوير المتكامل الخاصة بك. انسخ والصق التعليمات البرمجية التالي لتضمين مكتبة العميل implementation كعبارة جنبًا إلى جنب مع الملحقات والإعدادات المطلوبة.

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


   }

قم بإنشاء تطبيق Java

للتفاعل مع خدمة Document Intelligence، تحتاج إلى إنشاء مثيل للفئة DocumentIntelligenceClient . للقيام بذلك، يمكنك إنشاء AzureKeyCredential باستخدام key من مدخل Microsoft Azure ومثيل DocumentIntelligenceClient مع AzureKeyCredential و Document Intelligence endpointالخاص بك .

للتفاعل مع خدمة Document Intelligence، تحتاج إلى إنشاء مثيل للفئة DocumentAnalysisClient . للقيام بذلك، يمكنك إنشاء AzureKeyCredential باستخدام key من مدخل Microsoft Azure ومثيل DocumentAnalysisClient مع AzureKeyCredential و Document Intelligence endpointالخاص بك .

  1. من دليل doc-intel-app، قم بتشغيل الأمر التالي:

    mkdir -p src/main/java
    

    يمكنك إنشاء بنية الدليل التالية:

    لقطة شاشة لبنية دليل Java

  1. انتقل إلى الدليل java وأنشئ ملفاً باسم DocIntelligence.java.

    تلميح

    • بإمكانك إنشاء ملف جديد باستخدام PowerShell.
    • افتح نافذة PowerShell في دليل المشروع الخاص بك عن طريق الضغط باستمرار على مفتاح Shift والنقر بزر الماوس الأيمن فوق المجلد.
    • اكتب الأمر التالي New-Item DocIntelligence.java.
  2. افتح الملف DocIntelligence.java. انسخ أحد نماذج التعليمات البرمجية التالية والصقها في التطبيق الخاص بك:

  1. انتقل إلى الدليل java وأنشئ ملفاً باسم FormRecognizer.java.

    تلميح

    • بإمكانك إنشاء ملف جديد باستخدام PowerShell.
    • افتح نافذة PowerShell في دليل المشروع الخاص بك عن طريق الضغط باستمرار على مفتاح Shift والنقر بزر الماوس الأيمن فوق المجلد.
    • قم بكتابة الأمر التالي New-Item FormRecognizer.java.
  2. افتح الملف FormRecognizer.java. انسخ أحد نماذج التعليمات البرمجية التالية والصقها في التطبيق الخاص بك:

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات، راجع أمان خدمات Azure الذكاء الاصطناعي.

نموذج تخطيط

استخراج النص وعلامات التحديد وأنماط النص وبنية الجدول، إلى جانب إحداثيات المنطقة المحيطة بها من المستندات.

  • في هذا المثال، ستحتاج إلى ملف مستند في URI. يمكنك استخدام نموذج المستند الخاص بنا لهذا التشغيل السريع.
  • لتحليل ملف معين عند URI، ستستخدم الطريقة beginAnalyzeDocumentFromUrl وتمرير prebuilt-layout باعتباره معرف النموذج. والقيمة التي تم إرجاعها هي عنصر AnalyzeResult يحتوي على بيانات حول المستند المقدم.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير documentUrl في الأسلوب الرئيسي.

أضف عينة التعليمات البرمجية التالية إلى ملف DocIntelligence.java. تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure:


import com.azure.ai.documentintelligence;

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

import java.util.List;

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

    SyncPoller <AnalyzeResultOperation, AnalyzeResultOperation> analyzeLayoutResultPoller =
      client.beginAnalyzeDocument(modelId, documentUrl);

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

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

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

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

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

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

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

بناء وتشغيل التطبيق

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، انتقل مرة أخرى إلى دليل المشروع الرئيسي - doc-intel-app.

  1. أنشئ تطبيقك مستخدماً الأمر build:

    gradle build
    
  2. شغل تطبيقك مستخدماً الأمر run:

    gradle run
    

أضف عينة التعليمات البرمجية التالية إلى ملف FormRecognizer.java. تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure:


import com.azure.ai.formrecognizer.*;

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

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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();

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

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

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

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

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

بناء وتشغيل التطبيق

بعد إضافة نموذج تعليمة برمجية إلى التطبيق الخاص بك، انتقل مرة أخرى إلى دليل المشروع الرئيسي - form-recognize-app.

  1. أنشئ تطبيقك مستخدماً الأمر build:

    gradle build
    
  2. شغل تطبيقك مستخدماً الأمر run:

    gradle run
    

مخرجات نموذج تخطيط

فيما يلي مقتطف من الناتج المتوقع:

  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.

لعرض الإخراج بالكامل، تفضل بزيارة مستودع عينات Azure على GitHub لعرض إخراج نموذج التخطيط.

أضف عينة التعليمات البرمجية التالية إلى ملف FormRecognizer.java. تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure:

import com.azure.ai.formrecognizer;

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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();

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

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

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

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

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

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

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

بناء وتشغيل التطبيق

بعد إضافة نموذج تعليمة برمجية إلى التطبيق الخاص بك، انتقل مرة أخرى إلى دليل المشروع الرئيسي - form-recognize-app.

  1. أنشئ تطبيقك مستخدماً الأمر build:

    gradle build
    
  2. شغل تطبيقك مستخدماً الأمر run:

    gradle run
    

نموذج تم إنشاؤه مسبقًا

تحليل واستخراج الحقول المشتركة من أنواع مستندات معينة باستخدام نموذج مدرب مسبقاً. في هذا المثال، نقوم بتحليل فاتورة باستخدام نموذج الفاتورة الذي تم إنشاؤه مسبقا.

تلميح

أنت لست مقيدًا بالفواتير - يوجد العديد من النماذج التي تم إعدادها مسبقًا للاختيار من بينها، ولكل منها مجموعته الخاصة من الحقول المدعومة. يعتمد النموذج الذي سيتم استخدامه للعملية analyze على نوع المستند الذي سيتم تحليله. انظر نموذج استخراج البيانات .

  • حلل فاتورة باستخدام نموذج الفاتورة الذي تم إنشاؤه مسبقًا. يمكنك استخدام عينة مستند فاتورة لقالب التشغيل السريع هذا.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير invoiceUrl أعلى الملف.
  • لتحليل ملف معين في URI، ستستخدم beginAnalyzeDocuments الطريقة وتمر PrebuiltModels.Invoice كملف طراز. القيمة التي تم إرجاعها هي result كائن يحتوي على بيانات حول المستند المرسل.
  • للتبسيط، لا يتم عرض جميع أزواج القيمة المفتاح التي ترجع الخدمة هنا. للاطلاع على قائمة بجميع الحقول المدعومة والأنواع المتوافقة، راجع صفحة «Invoice concept».

أضف عينة التعليمات البرمجية التالية إلى ملف DocIntelligence.java. تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure:

import com.azure.ai.documentintelligence;

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

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

public class DocIntelligence {

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

  public static void main(String[] args) {

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

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

    public static void main(final String[] args) throws IOException {
      // Instantiate a client that will be used to call the service.
      DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
        .credential(new AzureKeyCredential("{key}"))
        .endpoint("https://{endpoint}.cognitiveservices.azure.com/")
        .buildClient();

      SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
        client.beginAnalyzeDocument(modelId, invoiceUrl);

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

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

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

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

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

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

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

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

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

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

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

بناء وتشغيل التطبيق

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، انتقل مرة أخرى إلى دليل المشروع الرئيسي - doc-intel-app.

  1. أنشئ تطبيقك مستخدماً الأمر build:

    gradle build
    
  2. شغل تطبيقك مستخدماً الأمر run:

    gradle run
    

أضف عينة التعليمات البرمجية التالية إلى ملف FormRecognizer.java. تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure:


import com.azure.ai.formrecognizer.*;

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

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

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

public class FormRecognizer {

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

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

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

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

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

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

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

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

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

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

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

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

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

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

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

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

بناء وتشغيل التطبيق

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، انتقل مرة أخرى إلى دليل المشروع الرئيسي - doc-intel-app.

  1. أنشئ تطبيقك مستخدماً الأمر build:

    gradle build
    
  2. شغل تطبيقك مستخدماً الأمر run:

    gradle run
    

إخراج نموذج تم إنشاؤه مسبقاً

فيما يلي مقتطف من الناتج المتوقع:

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

لعرض الإخراج بالكامل، تفضل بزيارة مستودع عينات Azure على GitHub لعرض إخراج نموذج الفاتورة المُعد مُسبقًا.

أضف عينة التعليمات البرمجية التالية إلى ملف FormRecognizer.java. تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure:

import com.azure.ai.formrecognizer;

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

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

public class FormRecognizer {

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

  public static void main(String[] args) {

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

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

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

    AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();

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

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

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

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

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

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

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

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

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

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

بناء وتشغيل التطبيق

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، انتقل مرة أخرى إلى دليل المشروع الرئيسي - doc-intel-app.

  1. أنشئ تطبيقك مستخدماً الأمر build:

    gradle build
    
  2. شغل تطبيقك مستخدماً الأمر run:

    gradle run
    

في هذا التشغيل السريع، استخدم الميزات التالية لتحليل واستخراج البيانات والقيم من النماذج والمستندات:

  • التخطيط - تحليل واستخراج الجداول والأسطر والكلمات وعلامات التحديد مثل أزرار الاختيار ومربعات الاختيار في مستندات النماذج، دون الحاجة إلى تدريب نموذج.

  • فاتورة تم إنشاؤها مسبقا — قم بتحليل واستخراج الحقول المشتركة من أنواع مستندات معينة باستخدام نموذج فاتورة مدرب مسبقا.

المتطلبات الأساسية

  • اشتراك Azure - إنشاء حساب مجانًا

  • أحدث إصدار من Visual Studio Code أو IDE المفضل لديك. لمزيد من المعلومات، راجعNode.js في Visual Studio Code.

  • أحدث LTS إصدار من Node.js.

  • خدمات Azure الذكاء الاصطناعي أو مورد تحليل معلومات المستند. بمجرد حصولك على اشتراك Azure، أنشئ موردا للمعلومات المستندية لخدمة واحدة أو متعدد الخدمات ، في مدخل Microsoft Azure، للحصول على المفتاح ونقطة النهاية. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

    تلميح

    إنشاء مورد خدمات Azure الذكاء الاصطناعي إذا كنت تخطط للوصول إلى خدمات Azure الذكاء الاصطناعي المتعددة ضمن نقطة نهاية/مفتاح واحد. للوصول إلى Document Intelligence فقط، قم بإنشاء مورد Document Intelligence. يرجى ملاحظة أنك ستحتاج إلى مورد خدمة واحدة إذا كنت تنوي استخدام مصادقة Microsoft Entra.

  • بعد نشر المورد الخاص بك، حدد»Go to resource». تحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Document Intelligence. يمكنك لصق المفتاح ونقطة النهاية في التعليمات البرمجية لاحقا في التشغيل السريع:

    لقطة شاشة للمفاتيح وموقع نقطة النهاية في مدخل Microsoft Azure.

الإعداد

  1. أنشئ تطبيق Node.js Express جديدًا: في نافذة وحدة التحكم (مثل cmd أو PowerShell أو Bash)، وأنشئ دليلاً جديدًا لتطبيقك باسم doc-intel-app وانتقل إليه.

    mkdir doc-intel-app && cd doc-intel-app
    
  2. شغل الأمر npm init لتهيئة التطبيق ونقل مشروعك.

    npm init
    
  3. حدد سمات مشروعك باستخدام المطالبات المقدمة في terminal.

    • تمثل أهم السمات الاسم ورقم الإصدار ونقطة الدخول.
    • نوصي بالاحتفاظ بـ index.js لاسم نقطة الإدخال. الوصف وأمر الاختبار ومستودع GitHub والكلمات الأساسية والمؤلف ومعلومات الترخيص هي سمات اختيارية—بإمكانك تخطيها لهذا المشروع.
    • اقبل الاقتراحات الواردة بين قوسين عن طريق تحديد Return أو Enter.
    • بعد إكمال المطالبات، package.json سيتم إنشاء ملف في دليل doc-intel-app.
  1. ثبت مكتبة العميل ai-document-intelligence وazure/identityحزم npm:

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

    يتم تحديث ملف تطبيقك package.json باستخدام التبعيات.

  1. ثبت مكتبة العميل ai-form-recognizer وazure/identityحزم npm:

    npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
    
    • يتم تحديث ملف تطبيقك package.json باستخدام التبعيات.
  1. ثبت مكتبة العميل ai-form-recognizer وazure/identityحزم npm:

    npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
    
  1. قم بإنشاء ملف مسمى index.js في دليل التطبيق.

    تلميح

    • بإمكانك إنشاء ملف جديد باستخدام PowerShell.
    • افتح نافذة PowerShell في دليل المشروع الخاص بك عن طريق الضغط باستمرار على مفتاح Shift والنقر بزر الماوس الأيمن فوق المجلد.
    • اكتب الأمر التالي New-Item index.js.

إنشاء التطبيق الخاص بك

للتفاعل مع خدمة Document Intelligence، تحتاج إلى إنشاء مثيل للفئة DocumentIntelligenceClient . للقيام بذلك، يمكنك إنشاء AzureKeyCredential باستخدام key من مدخل Microsoft Azure ومثيل DocumentIntelligenceClient مع AzureKeyCredential و Document Intelligence endpointالخاص بك .

للتفاعل مع خدمة Document Intelligence، تحتاج إلى إنشاء مثيل للفئة DocumentAnalysisClient . للقيام بذلك، يمكنك إنشاء AzureKeyCredential مع الخاص بك key من مدخل Microsoft Azure ومثيل DocumentAnalysisClient مع AzureKeyCredential و Form Recognizer endpointالخاص بك .

  1. افتح index.js الملف في Visual Studio Code أو IDE المفضل لديك. انسخ أحد نماذج التعليمات البرمجية التالية والصقها في التطبيق الخاص بك:

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات، راجع أمان خدمات Azure الذكاء الاصطناعي.

نموذج تخطيط

استخراج النص وعلامات التحديد وأنماط النص وبنية الجدول، إلى جانب إحداثيات المنطقة المحيطة بها من المستندات.

  • في هذا المثال، ستحتاج إلى ملف مستند من عنوان URL. يمكنك استخدام نموذج المستند الخاص بنا لهذا التشغيل السريع.
  • أضفنا قيمة URI للملف إلى المتغير formUrl بالقرب من أعلى الملف.
  • لتحليل ملف معين من عنوان URL ستستخدم الطريقة beginAnalyzeDocuments وتمررها في prebuilt-layout بصفته معرفًا للنموذج.
    const { DocumentIntelligenceClient } = require("@azure-rest/ai-document-intelligence");
    const  { AzureKeyCredential } = require("@azure/core-auth");

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

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

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

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

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

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

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

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

تشغيل التطبيق الخاص بك

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، قم بتشغيل البرنامج الخاص بك:

  1. انتقل إلى المجلد الذي يوجد فيه تطبيق Document Intelligence (doc-intel-app).

  2. اكتب الأمر التالي في المحطة الطرفية:

    node index.js
    

أضف عينة التعليمات البرمجية التالية إلى ملف index.js. تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure:


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

تشغيل التطبيق الخاص بك

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، قم بتشغيل البرنامج الخاص بك:

  1. انتقل إلى المجلد الذي يوجد فيه تطبيق Document Intelligence (doc-intel-app).

  2. اكتب الأمر التالي في المحطة الطرفية:

    node index.js
    

مخرجات نموذج تخطيط

فيما يلي مقتطف من الناتج المتوقع:

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

لعرض الإخراج بالكامل، تفضل بزيارة مستودع عينات Azure على GitHub لعرض إخراج نموذج التخطيط.

نموذج تم إنشاؤه مسبقًا

في هذا المثال، نقوم بتحليل فاتورة باستخدام نموذج الفاتورة الذي تم إنشاؤه مسبقا.

تلميح

أنت لست مقيدًا بالفواتير - يوجد العديد من النماذج التي تم إعدادها مسبقًا للاختيار من بينها، ولكل منها مجموعته الخاصة من الحقول المدعومة. يعتمد النموذج الذي سيتم استخدامه للعملية analyze على نوع المستند الذي سيتم تحليله. انظر نموذج استخراج البيانات .

  • حلل فاتورة باستخدام نموذج الفاتورة الذي تم إنشاؤه مسبقًا. يمكنك استخدام عينة مستند فاتورة لقالب التشغيل السريع هذا.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير invoiceUrl أعلى الملف.
  • لتحليل ملف معين في URI، ستستخدم beginAnalyzeDocuments الطريقة وتمر PrebuiltModels.Invoice كملف طراز. القيمة التي تم إرجاعها هي result كائن يحتوي على بيانات حول المستند المرسل.
  • للتبسيط، لا يتم عرض جميع أزواج القيمة المفتاح التي ترجع الخدمة هنا. للاطلاع على قائمة بجميع الحقول المدعومة والأنواع المتوافقة، راجع صفحة «Invoice concept».

const { DocumentIntelligenceClient } = require("@azure-rest/ai-document-intelligence");
const  { AzureKeyCredential } = require("@azure/core-auth");

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

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

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

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

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

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

تشغيل التطبيق الخاص بك

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، قم بتشغيل البرنامج الخاص بك:

  1. انتقل إلى المجلد الذي يوجد فيه تطبيق Document Intelligence (doc-intel-app).

  2. اكتب الأمر التالي في المحطة الطرفية:

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

تشغيل التطبيق الخاص بك

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، قم بتشغيل البرنامج الخاص بك:

  1. انتقل إلى المجلد الذي يوجد فيه تطبيق Document Intelligence (doc-intel-app).

  2. اكتب الأمر التالي في المحطة الطرفية:

    node index.js
    

إخراج نموذج تم إنشاؤه مسبقاً

فيما يلي مقتطف من الناتج المتوقع:

  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

لعرض الإخراج بالكامل، تفضل بزيارة مستودع عينات Azure على GitHub لعرض إخراج نموذج الفاتورة المُعد مُسبقًا.

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

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

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

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

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


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

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

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

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

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


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

تشغيل التطبيق الخاص بك

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، قم بتشغيل البرنامج الخاص بك:

  1. انتقل إلى المجلد الذي يوجد فيه تطبيق Document Intelligence (doc-intel-app).

  2. اكتب الأمر التالي في المحطة الطرفية:

    node index.js
    

في هذا التشغيل السريع، استخدم الميزات التالية لتحليل البيانات واستخراجها من النماذج والمستندات:

  • التخطيط — قم بتحليل واستخراج الجداول والخطوط والكلمات وعلامات التحديد مثل الأزرار التبادلية وخانات الاختيار وأزواج قيم المفاتيح، دون الحاجة إلى تدريب نموذج.

  • فاتورة تم إنشاؤها مسبقا — قم بتحليل واستخراج الحقول المشتركة من أنواع مستندات معينة باستخدام نموذج مدرب مسبقا.

المتطلبات الأساسية

تلميح

إنشاء مورد خدمات Azure الذكاء الاصطناعي إذا كنت تخطط للوصول إلى خدمات Azure الذكاء الاصطناعي المتعددة ضمن نقطة نهاية/مفتاح واحد. للوصول إلى Document Intelligence فقط، قم بإنشاء مورد Document Intelligence. يرجى ملاحظة أنك ستحتاج إلى مورد خدمة واحدة إذا كنت تنوي استخدام مصادقة Microsoft Entra.

  • بعد نشر المورد الخاص بك، حدد»Go to resource». تحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Document Intelligence. يمكنك لصق المفتاح ونقطة النهاية في التعليمات البرمجية لاحقا في التشغيل السريع:

    لقطة شاشة للمفاتيح وموقع نقطة النهاية في مدخل Microsoft Azure.

الإعداد

افتح نافذة طرفية في بيئتك المحلية وقم بتثبيت مكتبة عميل Azure الذكاء الاصطناعي Document Intelligence ل Python باستخدام pip:

pip install azure-ai-documentintelligence==1.0.0b2

pip install azure-ai-formrecognizer==3.3.0

pip install azure-ai-formrecognizer==3.2.0b6

تشغيل تطبيق python الخاص بك

للتفاعل مع خدمة Document Intelligence، تحتاج إلى إنشاء مثيل للفئة DocumentIntelligenceClient . للقيام بذلك، يمكنك إنشاء AzureKeyCredential باستخدام key من مدخل Microsoft Azure ومثيل DocumentIntelligenceClient مع AzureKeyCredential و Document Intelligence endpointالخاص بك .

  1. إنشاء ملف Python جديد يسمى doc_intel_quickstart.py في المحرر المفضل لديك أو IDE.

  2. افتح ملف doc_intel_quickstart.py وحدد أحد نماذج التعليمات البرمجية التالية للنسخ واللصق في التطبيق الخاص بك:

للتفاعل مع خدمة Document Intelligence، تحتاج إلى إنشاء مثيل للفئة DocumentAnalysisClient . للقيام بذلك، يمكنك إنشاء AzureKeyCredential باستخدام key من مدخل Microsoft Azure ومثيل DocumentAnalysisClient مع AzureKeyCredential و Document Intelligence endpointالخاص بك .

  1. أنشئ تطبيق Python جديد يسمى form_recognizer_quickstart.py في المحرر أو IDE المفضل لديك.

  2. افتح ملف form_recognizer_quickstart.py وحدد أحد نماذج التعليمات البرمجية التالية للنسخ واللصق في التطبيق الخاص بك:

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات، راجع أمان خدمات Azure الذكاء الاصطناعي.

نموذج تخطيط

استخراج النص وعلامات التحديد وأنماط النص وبنية الجدول، إلى جانب إحداثيات المنطقة المحيطة بها من المستندات.

  • في هذا المثال، ستحتاج إلى ملف مستند من عنوان URL. يمكنك استخدام نموذج المستند الخاص بنا لهذا التشغيل السريع.
  • لقد قمنا بإضافة قيمة عنوان URL للملف إلى formUrl المتغير في analyze_layout الدالة.
  • لتحليل ملف معين في URI، ستستخدم begin_analyze_document_from_url الطريقة وتمر prebuilt-layout كطراز Id. القيمة التي تم إرجاعها هي result كائن يحتوي على بيانات حول المستند المرسل.

أضف نموذج التعليمات البرمجية التالي إلى تطبيق doc_intel_quickstart.py الخاص بك. تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure:


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

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

# helper functions

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


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


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

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

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

    analyze_request = AnalyzeDocumentRequest(
        url_source=formUrl
    )

    result: AnalyzeResult = poller.result()

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

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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()

تشغيل التطبيق

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، قم بإنشاء وتشغيل البرنامج الخاص بك:

  1. انتقل إلى المجلد حيث يوجد ملف doc_intel_quickstart.py .

  2. اكتب الأمر التالي في المحطة الطرفية:

    python doc_intel_quickstart.py
    

أضف نموذج التعليمات البرمجية التالي إلى تطبيق form_recognizer_quickstart.py الخاص بك. تأكد من قيامك بتحديث المفتاح ومتغيرات نقطة النهاية بقيم من مثيل Form Recognizer في مدخل Microsoft Azure:


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

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

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

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

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

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

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

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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()

تشغيل التطبيق

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، قم بإنشاء وتشغيل البرنامج الخاص بك:

  1. انتقل إلى المجلد حيث تجد الملف form_recognizer_quickstart.py.

  2. اكتب الأمر التالي في المحطة الطرفية:

    python form_recognizer_quickstart.py
    

مخرجات نموذج تخطيط

فيما يلي مقتطف من الناتج المتوقع:

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

لعرض الإخراج بالكامل، تفضل بزيارة مستودع عينات Azure على GitHub لعرض إخراج نموذج التخطيط.

أضف نموذج التعليمات البرمجية التالي إلى تطبيق form_recognizer_quickstart.py الخاص بك. تأكد من قيامك بتحديث المفتاح ومتغيرات نقطة النهاية بقيم من مثيل Form Recognizer في مدخل Microsoft Azure:


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

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


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

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

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

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

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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()


تشغيل التطبيق

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، قم بإنشاء وتشغيل البرنامج الخاص بك:

  1. انتقل إلى المجلد حيث تجد الملف form_recognizer_quickstart.py.

  2. اكتب الأمر التالي في المحطة الطرفية:

    python form_recognizer_quickstart.py
    

نموذج تم إنشاؤه مسبقًا

تحليل واستخراج الحقول المشتركة من أنواع مستندات معينة باستخدام نموذج مدرب مسبقاً. في هذا المثال، نقوم بتحليل فاتورة باستخدام نموذج الفاتورة الذي تم إنشاؤه مسبقا.

تلميح

أنت لست مقيدًا بالفواتير - يوجد العديد من النماذج التي تم إعدادها مسبقًا للاختيار من بينها، ولكل منها مجموعته الخاصة من الحقول المدعومة. يعتمد النموذج الذي سيتم استخدامه للعملية analyze على نوع المستند الذي سيتم تحليله. انظر نموذج استخراج البيانات .

  • حلل فاتورة باستخدام نموذج الفاتورة الذي تم إنشاؤه مسبقًا. يمكنك استخدام عينة مستند فاتورة لقالب التشغيل السريع هذا.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير invoiceUrl أعلى الملف.
  • لتحليل ملف معين في URI، ستستخدم begin_analyze_document_from_url الطريقة وتمر prebuilt-invoice كملف طراز. القيمة التي تم إرجاعها هي result كائن يحتوي على بيانات حول المستند المرسل.
  • للتبسيط، لا يتم عرض جميع أزواج القيمة المفتاح التي ترجع الخدمة هنا. للاطلاع على قائمة بجميع الحقول المدعومة والأنواع المتوافقة، راجع صفحة «Invoice concept».

أضف نموذج التعليمات البرمجية التالي إلى تطبيق doc_intel_quickstart.py الخاص بك. تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure:


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


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

def analyze_invoice():
    # sample document

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

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

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

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


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


if __name__ == "__main__":
    analyze_invoice()


تشغيل التطبيق

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، قم بإنشاء وتشغيل البرنامج الخاص بك:

  1. انتقل إلى المجلد حيث يوجد ملف doc_intel_quickstart.py .

  2. اكتب الأمر التالي في المحطة الطرفية:

    python doc_intel_quickstart.py
    

أضف نموذج التعليمات البرمجية التالي إلى تطبيق form_recognizer_quickstart.py الخاص بك. تأكد من قيامك بتحديث المفتاح ومتغيرات نقطة النهاية بقيم من مثيل Form Recognizer في مدخل Microsoft Azure:

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

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


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


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


def analyze_invoice():

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

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

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

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

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

if __name__ == "__main__":
    analyze_invoice()


تشغيل التطبيق

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، قم بإنشاء وتشغيل البرنامج الخاص بك:

  1. انتقل إلى المجلد حيث تجد الملف form_recognizer_quickstart.py.

  2. اكتب الأمر التالي في المحطة الطرفية:

    python form_recognizer_quickstart.py
    

إخراج نموذج تم إنشاؤه مسبقاً

فيما يلي مقتطف من الناتج المتوقع:

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

لعرض الإخراج بالكامل، تفضل بزيارة مستودع عينات Azure على GitHub لعرض إخراج نموذج الفاتورة المُعد مُسبقًا.

أضف نموذج التعليمات البرمجية التالي إلى تطبيق form_recognizer_quickstart.py الخاص بك. تأكد من قيامك بتحديث المفتاح ومتغيرات نقطة النهاية بقيم من مثيل Form Recognizer في مدخل Microsoft Azure:


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

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


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


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

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

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

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


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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()


تشغيل التطبيق

بعد إضافة نموذج التعليمات البرمجية إلى التطبيق الخاص بك، قم بإنشاء وتشغيل البرنامج الخاص بك:

  1. انتقل إلى المجلد حيث تجد الملف form_recognizer_quickstart.py.

  2. اكتب الأمر التالي في المحطة الطرفية:

    python form_recognizer_quickstart.py
    

في هذا التشغيل السريع، تعرف على كيفية استخدام واجهة برمجة تطبيقات REST لتحليل واستخراج البيانات والقيم من المستندات:

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا

  • تثبيت أداة سطر الأوامر curl.

  • الإصدار 7 فأحدث من PowerShell (أو تطبيق سطر أوامر مشابهة.):

  • للتحقق من إصدار PowerShell، اكتب الأمر التالي بالنسبة إلى نظام التشغيل الخاص بك:

    • Windows: Get-Host | Select-Object Version
    • macOS أو Linux: $PSVersionTable
  • مورد Document Intelligence (خدمة واحدة) أو مورد خدمات Azure الذكاء الاصطناعي (متعدد الخدمات). بمجرد حصولك على اشتراك Azure، أنشئ موردا للمعلومات المستندية لخدمة واحدة أو متعدد الخدمات ، في مدخل Microsoft Azure، للحصول على المفتاح ونقطة النهاية. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

تلميح

إنشاء مورد خدمات Azure الذكاء الاصطناعي إذا كنت تخطط للوصول إلى خدمات Azure الذكاء الاصطناعي المتعددة ضمن نقطة نهاية/مفتاح واحد. للوصول إلى Document Intelligence فقط، قم بإنشاء مورد Document Intelligence. يرجى ملاحظة أنك ستحتاج إلى مورد خدمة واحدة إذا كنت تنوي استخدام مصادقة Microsoft Entra.

  • بعد نشر المورد الخاص بك، حدد»Go to resource». تحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Document Intelligence. يمكنك لصق المفتاح ونقطة النهاية في التعليمات البرمجية لاحقا في التشغيل السريع:

    لقطة شاشة للمفاتيح وموقع نقطة النهاية في مدخل Microsoft Azure.

تحليل المستندات والحصول على النتائج

يُستخدم طلب POST لتحليل المستندات باستخدام نموذج مسبق الإنشاء أو نموذج مخصص. يُستخدم طلب GET لاسترداد نتيجة استدعاء تحليل المستند. يُستخدم modelId مع عمليات resultId GET.

تحليل المستند (طلب POST)

قبل تشغيل الأمر cURL، قم بإجراء التغييرات التالية على طلب النشر:

  1. استبدل {endpoint} بقيمة نقطة النهاية من مثيل Document Intelligence لمدخل Microsoft Azure.

  2. استبدل {key} بقيمة المفتاح من مثيل Document Intelligence لمدخل Microsoft Azure.

  3. باستخدام الجدول التالي كمرجع، استبدل {modelID} و {your-document-url} بالقيم المطلوبة.

  4. تحتاج إلى ملف مستند على عنوان URL. لهذا التشغيل السريع، يمكنك استخدام نماذج النماذج المتوفرة في الجدول التالي لكل ميزة:

نماذج المستندات

الميزة {modelID} {your-document-url}
مقروء prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
تخطيط prebuilt-layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
بطاقة التأمين الصحي 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
فاتورة prebuilt-invoice https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
استلام prebuilt-receipt https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
مستند المعرف prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png

نماذج المستندات

الميزة {modelID} {your-document-url}
مستند عام prebuilt-document https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
مقروء prebuilt-read https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png
تخطيط prebuilt-layout https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png
بطاقة التأمين الصحي 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
فاتورة prebuilt-invoice https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf
استلام prebuilt-receipt https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png
مستند المعرف prebuilt-idDocument https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png
بطاقة العمل prebuilt-businessCard https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات، راجع أمان خدمات Azure الذكاء الاصطناعي.

طلب نشر

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

استجابة POST (resultID)

تتلقى استجابة 202 (Success) تتضمن عنوان Operation-Location للقراءة فقط. تحتوي قيمة هذا العنوان على resultID التي يمكن الاستعلام عن للحصول على حالة العملية غير المتزامنة واسترداد النتائج باستخدام طلب GET مع نفس مفتاح اشتراك المورد الخاص بك:

{alt-text}

الحصول على نتائج التحليل (طلب GET)

بعد استدعاء Analyze document واجهة برمجة التطبيقات، استدع واجهة برمجة تطبيقات Get analyze result للحصول على حالة العملية والبيانات المستخرجة. قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

بعد استدعاء Analyze document واجهة برمجة التطبيقات، استدع واجهة برمجة تطبيقات Get analyze result للحصول على حالة العملية والبيانات المستخرجة. قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

بعد استدعاء Analyze document واجهة برمجة التطبيقات، استدع واجهة برمجة تطبيقات Get analyze result للحصول على حالة العملية والبيانات المستخرجة. قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

  1. استبدل {resultID} رأس Operation-Location من استجابة POST.

  2. استبدل {key} بقيمة المفتاح من مثيل Document Intelligence في مدخل Microsoft Azure.

طلب GET

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

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

فحص الاستجابة

تتلقى استجابة 200 (Success) مع إخراج JSON. يشير الحقل الأول "status" إلى حالة العملية. إذا لم تكتمل العملية، فإن قيمة "status" هي "running" أو "notStarted"، ويجب عليك استدعاء واجهة برمجة التطبيقات مرة أخرى، إما يدويا أو من خلال برنامج نصي. نوصي بفاصل زمني من ثانية واحدة أو أكثر بين كل استدعاء وآخر.

عينة استجابة للفاتورة مسبقة الإنشاء

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

حقول المستند المدعوم

تستخرج النماذج التي تم إنشاؤها مسبقا مجموعات محددة مسبقا من حقول المستندات. راجع استخراج بيانات النموذج لأسماء الحقول والأنواع والأوصاف والأمثلة المستخرجة.

كان هذا كل شيء، تهانينا!

في هذا التشغيل السريع، استخدمت نموذج تحليل ذكي للمستندات لتحليل نماذج ومستندات مختلفة. بعد ذلك، استكشف Document Intelligence Studio والوثائق المرجعية للتعرف على واجهة برمجة تطبيقات Document Intelligence في العمق.

الخطوات التالية

ينطبق هذا المحتوى على:علامهv2.1 | أحدث إصدار:علامة اختيار زرقاءv4.0 (معاينة)

ابدأ باستخدام Azure الذكاء الاصطناعي Document Intelligence باستخدام لغة البرمجة التي تختارها أو واجهة برمجة تطبيقات REST. Document Intelligence هي خدمة Azure الذكاء الاصطناعي مستندة إلى السحابة تستخدم التعلم الآلي لاستخراج أزواج قيم المفاتيح والنص والجداول من مستنداتك. نوصي باستخدام الخدمة المجانية عندما تعرف التقنية. تذكر أن عدد الصفحات المجانية يقتصر على 500 صفحة في الشهر.

لمعرفة المزيد حول ميزات تحليل معلومات المستند وخيارات التطوير، تفضل بزيارة صفحة نظرة عامة .

الوثائق المرجعية | التعليمات البرمجية لمصدر المكتبة | حزمة (NuGet) | نماذج

في هذا التشغيل السريع، يمكنك استخدام واجهات برمجة التطبيقات التالية لاستخراج البيانات المنظمة من النماذج والمستندات:

المتطلبات الأساسية

  • اشتراك Azure - إنشاء حساب مجانًا

  • الإصدار الحالي من Visual Studio IDE.

  • خدمات Azure الذكاء الاصطناعي أو مورد تحليل معلومات المستند. بمجرد حصولك على اشتراك Azure، أنشئ موردا للمعلومات المستندية لخدمة واحدة أو متعدد الخدمات في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

    تلميح

    إنشاء مورد خدمات Azure الذكاء الاصطناعي إذا كنت تخطط للوصول إلى خدمات Azure الذكاء الاصطناعي المتعددة ضمن نقطة نهاية/مفتاح واحد. للوصول إلى Document Intelligence فقط، قم بإنشاء مورد Document Intelligence. يرجى ملاحظة أنك ستحتاج إلى مورد خدمة واحدة إذا كنت تنوي استخدام مصادقة Microsoft Entra.

  • بعد نشر المورد الخاص بك، حدد»Go to resource». تحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Document Intelligence. يمكنك لصق المفتاح ونقطة النهاية في التعليمات البرمجية لاحقا في التشغيل السريع:

    لقطة شاشة للمفاتيح وموقع نقطة النهاية في مدخل Microsoft Azure.

الإعداد

  1. قم بتشغيل Visual Studio 2019.

  2. في صفحة البدء، حدد «Create a new project».

    لقطة شاشة لنافذة بدء Visual Studio.

  3. في صفحة «Create a new project»، أدخل وحدة التحكم في مربع البحث. اختر قالب تطبيق وحدة التحكم، ثم اختر التالي.

    لقطة شاشة من Visual Studio لصفحة إنشاء مشروع جديدة.

  4. في نافذة الحوار تكوين مشروعك الجديد، أدخل formRecognizer_quickstart في مربع اسم المشروع. ثم اختر التالي.

    لقطة شاشة لنافذة حوار تكوين Visual Studios لمشروع جديد.

  5. في نافذة الحوار معلومات إضافية، حدد .NET الإصدار 5.0 (الحالي)، ثم حدد إنشاء.

    لقطة شاشة لنافذة حوار معلومات إضافية في Visual Studio.

تثبيت مكتبة العميل مع NuGet

  1. انقر بزر الماوس الأيمن فوق مشروع formRecognizer_quickstart وحدد «Manage NuGet Packages» ....

    لقطة شاشة تعرض نافذة حزمة NuGet المحددة.

  2. حدد علامة التبويب «Browse» واكتب Azure.AI.FormRecognizer.

    لقطة شاشة تعرض القائمة المنسدلة تحديد حزمة تحليل معلومات المستند.

  3. حدد الإصدار 3.1.1 من القائمة المنسدلة وحدد تثبيت.

إنشاء التطبيق الخاص بك

للتفاعل مع خدمة Document Intelligence، تحتاج إلى إنشاء مثيل للفئة FormRecognizerClient . للقيام بذلك، يمكنك إنشاء AzureKeyCredential باستخدام مفتاحك ومثيل FormRecognizerClient باستخدام AzureKeyCredential وذكاء endpointالمستند .

إشعار

  • بدءاً من .NET 6، تنشئ المشروعات الجديدة التي تستخدم القالب console نمط برنامج جديداً يختلف عن الإصدارات السابقة.
  • يستخدم الإخراج الجديد ميزات #C الحديثة التي تبسط التعليمة البرمجية الذي تحتاج إلى كتابته.
  • عندما تستخدم الإصدار الأحدث، تحتاج فقط إلى كتابة هيكل الأسلوبMain. لست بحاجة إلى تضمين بيانات عالية المستوى أو توجيهات عالمية باستخدام توجيهات أو استخدام ضمني للتوجيهات.
  • للمزيد من المعلومات، راجع قوالب C# الجديدة تنشئ عبارات ذات مستوى أعلى.
  1. افتح ملف Program.cs.

  2. تضمين التعليمات التالية باستخدام:

using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
  1. تعيين متغيرات البيئة endpoint وkey وأنشئ المثيلين AzureKeyCredential وFormRecognizerClient:
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. احذف السطر، Console.Writeline("Hello World!");، وأضف أحد عينات التعليمات البرمجية جرب ذلكعينات التعليمات البرمجية إلى ملف Program.cs:

    لقطة شاشة لإضافة نموذج التعليمات البرمجية إلى الأسلوب الرئيسي.

  2. حدد عينة التعليمات البرمجية لنسخها ولصقها في الأسلوب الرئيسي لتطبيقك:

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات، راجع مقالة أمان خدمات Azure الذكاء الاصطناعي.

جربه: نموذج التخطيط

استخراج النص وعلامات التحديد وأنماط النص وبنية الجدول، إلى جانب إحداثيات المنطقة المحيطة بها من المستندات.

  • في هذا المثال، ستحتاج إلى ملف مستند في URI. يمكنك استخدام نموذج المستند الخاص بنا لهذا التشغيل السريع.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير formUri.
  • لاستخراج التخطيط من ملف معين في عنوان URI، استخدم الأسلوب StartRecognizeContentFromUriAsync.

أضف التعليمات البرمجية التالية إلى ملف Program.cs لتطبيق التخطيط الخاص بك:


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

جرب: نموذج مسبق الإعداد

يوضح هذا النموذج كيفية تحليل البيانات من أنواع معينة من المستندات الشائعة باستخدام نماذج مدربة مسبقا، باستخدام فاتورة كمثال.

  • على سبيل المثال، نقوم بتحليل مستند فاتورة باستخدام نموذج تم إنشاؤه مسبقًا. يمكنك استخدام عينة مستند فاتورة لقالب التشغيل السريع هذا.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير invoiceUri في أعلى الأسلوب الرئيسي.
  • لتحليل ملف معين على عنوان URI، استخدم الأسلوب StartRecognizeInvoicesFromUriAsync.
  • للتبسيط، لا تظهر هنا جميع أزواج قيم المفاتيح والقيمة التي ترجعها الخدمة. للاطلاع على قائمة بجميع الحقول المدعومة والأنواع المتوافقة، راجع صفحة «Invoice concept».

اختيار نموذج تم إعداده مسبقاً

أنت لست مقيدًا بالفواتير - يوجد العديد من النماذج التي تم إعدادها مسبقًا للاختيار من بينها، ولكل منها مجموعته الخاصة من الحقول المدعومة. يعتمد الطراز الذي سيتم استخدامه لعملية التحليل على نوع المستند الذي سيتم تحليله. فيما يلي النماذج التي تم إنشاؤها مسبقا المدعومة حاليا من قبل خدمة Document Intelligence:

  • الفاتورة: تستخرج النص وعلامات التحديد والجداول والحقول والمعلومات الأساسية من الفواتير.
  • الإيصال: استخراج النص والمعلومات الأساسية من الإيصالات.
  • مستند المُعرف: استخرج النص والمعلومات الأساسية من رخص القيادة وجوازات السفر الدولية.
  • بطاقة العمل: تستخرج النص والمعلومات الأساسية من بطاقات العمل.

إضافة التعليمات البرمجية التالية إلى Program.cs لتطبيق الفاتورة مسبقة الإعداد

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

تشغيل التطبيق الخاص بك

اختر الزر «Start» الأخضر بجوار المتغير formRecognizer_quickstart لإنشاء برنامجك وتشغيله، أو اضغط على F5.

لقطة شاشة لتشغيل برنامج Visual Studio.

الوثائق المرجعية | التعليمة البرمجية للمصادر المكتبية | نماذج حزمة | (Maven)

في هذا التشغيل السريع، يمكنك استخدام واجهات برمجة التطبيقات التالية لاستخراج البيانات المنظمة من النماذج والمستندات:

المتطلبات الأساسية

  • اشتراك Azure - إنشاء حساب مجانًا

  • Java Development Kit (SDK) الإصدار 8 أو الإصدار الأحدث. لمزيد من المعلومات، راجعإصدارات Java المدعومة وجدول التحديث.

  • خدمات Azure الذكاء الاصطناعي أو مورد تحليل معلومات المستند. بمجرد حصولك على اشتراك Azure، أنشئ موردا للمعلومات المستندية لخدمة واحدة أو متعدد الخدمات في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

  • بعد نشر المورد الخاص بك، حدد»Go to resource». تحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Document Intelligence. يمكنك لصق المفتاح ونقطة النهاية في التعليمات البرمجية لاحقا في التشغيل السريع:

    لقطة شاشة للمفاتيح وموقع نقطة النهاية في مدخل Microsoft Azure.

الإعداد

إنشاء مشروع Gradle جديد

في نافذة وحدة التحكم (مثل cmd أو PowerShell أو Bash)، أنشئ دليلاً جديداً لتطبيقك يسمى form-recognizer-app، وانتقل إليه.

mkdir form-recognizer-app && form-recognizer-app
  1. بادر بتشغيل الأمر gradle init من دليل العمل خاصتك. ينشئ هذا الأمر ملفات بناء أساسية ل Gradle، بما في ذلك build.gradle.kts، والذي يستخدم في وقت التشغيل لإنشاء التطبيق وتكوينه.

    gradle init --type basic
    
  2. عند طلب اختيار DSL، حدد Kotlin.

  3. وافق على الاسم الافتراضي للمشروع (form-recognizer-app)

تثبيت مكتبة العميل

يستخدم هذا التشغيل السريع مدير تبعية Gradle. يمكنك العثور على مكتبة العميل ومعلومات مديري التبعية الآخرين على Maven Central Repository.

في ملف build.gradle.kts الخاص بمشروعك، قم بتضمين مكتبة العميل كبيان implementation، بالإضافة إلى المكونات الإضافية والإعدادات المطلوبة.

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

إنشاء ملف Java

من دليل العمل الخاص بك، قم بتشغيل الأمر التالي:

mkdir -p src/main/java

يمكنك إنشاء بنية الدليل التالية:

لقطة شاشة لبنية دليل Java للتطبيق.

انتقل إلى دليل Java وأنشئ ملفاً يسمى FormRecognizer.java. افتحه في المحرر أو بيئة التطوير المتكامل المفضل لديك وأضف إعلان ربط الحزمة التالي وعبارات import:

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;

حدد نموذج التعليمات البرمجية لنسخه ولصقه في الأسلوب الرئيسي لتطبيقك:

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات، راجع أمان خدمات Azure الذكاء الاصطناعي.

جربه: نموذج التخطيط

استخراج النص وعلامات التحديد وأنماط النص وبنية الجدول، إلى جانب إحداثيات المنطقة المحيطة بها من المستندات.

  • في هذا المثال، ستحتاج إلى ملف مستند في URI. يمكنك استخدام نموذج المستند الخاص بنا لهذا التشغيل السريع.
  • لتحليل ملف معين على عنوان URI، ستستخدم الأسلوب beginRecognizeContentFromUrl.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير formUrl في الأسلوب الرئيسي.

قم بتحديث فئة FormRecognizer للتطبيق الخاص بك، مع التعليمات البرمجية التالية (تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure):


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

جرب: نموذج مسبق الإعداد

يوضح هذا النموذج كيفية تحليل البيانات من أنواع معينة من المستندات الشائعة باستخدام نماذج مدربة مسبقا، باستخدام فاتورة كمثال.

  • على سبيل المثال، نقوم بتحليل مستند فاتورة باستخدام نموذج تم إنشاؤه مسبقًا. يمكنك استخدام عينة مستند فاتورة لقالب التشغيل السريع هذا.
  • لتحليل ملف معين على عنوان URI، ستستخدم الأسلوب beginRecognizeInvoicesFromUrl.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير invoiceUrl في الأسلوب الرئيسي.
  • للتبسيط، لا تظهر هنا جميع أزواج قيم المفاتيح والقيمة التي ترجعها الخدمة. للاطلاع على قائمة بجميع الحقول المدعومة والأنواع المتوافقة، راجع صفحة «Invoice concept».

اختيار نموذج تم إعداده مسبقاً

أنت لست مقيدًا بالفواتير - يوجد العديد من النماذج التي تم إعدادها مسبقًا للاختيار من بينها، ولكل منها مجموعته الخاصة من الحقول المدعومة. يعتمد الطراز الذي سيتم استخدامه لعملية التحليل على نوع المستند الذي سيتم تحليله. فيما يلي النماذج التي تم إنشاؤها مسبقا المدعومة حاليا من قبل خدمة Document Intelligence:

  • الفاتورة: تستخرج النص وعلامات التحديد والجداول والحقول والمعلومات الأساسية من الفواتير.
  • الإيصال: استخراج النص والمعلومات الأساسية من الإيصالات.
  • مستند المُعرف: استخرج النص والمعلومات الأساسية من رخص القيادة وجوازات السفر الدولية.
  • بطاقة العمل: تستخرج النص والمعلومات الأساسية من بطاقات العمل.

قم بتحديث فئة FormRecognizer للتطبيق الخاص بك، مع التعليمات البرمجية التالية (تأكد من تحديث متغيرات المفتاح ونقطة النهاية بقيم من مثيل Document Intelligence لمدخل Microsoft Azure):


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

إنشاء تطبيقك وتشغيله

انتقل مجدداً إلى الدليل الرئيسي لمشروعك—form-recognizer-app.

  1. أنشئ تطبيقك مستخدماً الأمر build:
gradle build
  1. شغل تطبيقك مستخدماً الأمر run:
gradle run

الوثائق المرجعية | التعليمات البرمجية لمصدر المكتبة | الحزمة (npm) | النماذج

في هذا التشغيل السريع، يمكنك استخدام واجهات برمجة التطبيقات التالية لاستخراج البيانات المنظمة من النماذج والمستندات:

المتطلبات الأساسية

  • اشتراك Azure - إنشاء حساب مجانًا

  • أحدث إصدار من Visual Studio Code أو IDE المفضل لديك.

  • أحدث إصدار LTS من Node.js

  • خدمات Azure الذكاء الاصطناعي أو مورد تحليل معلومات المستند. بمجرد حصولك على اشتراك Azure، أنشئ موردا للمعلومات المستندية لخدمة واحدة أو متعدد الخدمات في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

    تلميح

    إنشاء مورد خدمات Azure الذكاء الاصطناعي إذا كنت تخطط للوصول إلى خدمات Azure الذكاء الاصطناعي المتعددة ضمن نقطة نهاية/مفتاح واحد. للوصول إلى Document Intelligence فقط، قم بإنشاء مورد Document Intelligence. يرجى ملاحظة أنك ستحتاج إلى مورد خدمة واحدة إذا كنت تنوي استخدام مصادقة Microsoft Entra.

  • بعد نشر المورد الخاص بك، حدد»Go to resource». تحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Document Intelligence. يمكنك لصق المفتاح ونقطة النهاية في التعليمات البرمجية لاحقا في التشغيل السريع:

    لقطة شاشة للمفاتيح وموقع نقطة النهاية في مدخل Microsoft Azure.

الإعداد

  1. قم بإنشاء تطبيق Node.js جديد. في إطار نافذة وحدة التحكم (مثل cmd أو PowerShell أو Bash)، يمكنك إنشاء دليل جديد لتطبيقك وانتقل إليه.

    mkdir form-recognizer-app && cd form-recognizer-app
    
  2. شغّل الأمر npm init لإنشاء تطبيق node باستخدام ملف package.json.

    npm init
    
  3. ثبت حزمة npm لمكتبة العميل ai-form-recognizer:

    npm install @azure/ai-form-recognizer
    

    يتم تحديث ملف تطبيقك package.json باستخدام التبعيات.

  4. أنشئ ملفاً جديداً باسم index.jsوافتحه ثم استورد المكتبات التالية:

    const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
    
  5. أنشئ متغيرات لنقطة نهاية Azure لموردك والمفتاح:

    const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    
  6. عند هذه النقطة، يجب أن يحتوي تطبيق JavaScript على سطور التعليمات البرمجية التالية:

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

حدد عينة التعليمات البرمجية لنسخه ولصقه في تطبيقك:

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات، راجع أمان خدمات Azure الذكاء الاصطناعي.

جربه: نموذج التخطيط

  • في هذا المثال، ستحتاج إلى ملف مستند في URI. يمكنك استخدام نموذج المستند الخاص بنا لهذا التشغيل السريع.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير formUrl بالقرب من أعلى الملف.
  • لتحليل ملف معين على عنوان URI، ستستخدم الأسلوب beginRecognizeContent.

إضافة التعليمات البرمجية التالية إلى تطبيق التخطيط الخاص بك على السطر أسفل key المتغير

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

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

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

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

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

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

جرب: نموذج مسبق الإعداد

يوضح هذا النموذج كيفية تحليل البيانات من أنواع معينة من المستندات الشائعة باستخدام نماذج مدربة مسبقا، باستخدام فاتورة كمثال. راجع صفحة المفاهيم التي تم إنشاؤها مسبقاً للحصول على قائمة كاملة بـ حقول الفاتورة

  • على سبيل المثال، نقوم بتحليل مستند فاتورة باستخدام نموذج تم إنشاؤه مسبقًا. يمكنك استخدام عينة مستند فاتورة لقالب التشغيل السريع هذا.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير invoiceUrl أعلى الملف.
  • لتحليل ملف معين على عنوان URI، ستستخدم الأسلوب beginRecognizeInvoices.
  • للتبسيط، لا تظهر هنا جميع أزواج قيم المفاتيح والقيمة التي ترجعها الخدمة. للاطلاع على قائمة بجميع الحقول المدعومة والأنواع المتوافقة، راجع صفحة «Invoice concept».

اختيار نموذج تم إعداده مسبقاً

أنت لست مقيدًا بالفواتير - يوجد العديد من النماذج التي تم إعدادها مسبقًا للاختيار من بينها، ولكل منها مجموعته الخاصة من الحقول المدعومة. يعتمد الطراز الذي سيتم استخدامه لعملية التحليل على نوع المستند الذي سيتم تحليله. فيما يلي النماذج التي تم إنشاؤها مسبقا المدعومة حاليا من قبل خدمة Document Intelligence:

  • الفاتورة: تستخرج النص وعلامات التحديد والجداول والحقول والمعلومات الأساسية من الفواتير.
  • الإيصال: استخراج النص والمعلومات الأساسية من الإيصالات.
  • مستند المُعرف: استخرج النص والمعلومات الأساسية من رخص القيادة وجوازات السفر الدولية.
  • بطاقة العمل: تستخرج النص والمعلومات الأساسية من بطاقات العمل.

إضافة التعليمات البرمجية التالية إلى تطبيق الفاتورة مسبقة الإعداد أسفل المتغير key


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

async function recognizeInvoices() {

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

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

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

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

    console.log("Invoice fields:");

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

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

    console.log("- Items:");

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

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

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

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

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

الوثائق المرجعية | لكود مصدر المكتبة | لنماذج | Package (PyPi)

في هذا التشغيل السريع، يمكنك استخدام واجهات برمجة التطبيقات التالية لاستخراج البيانات المنظمة من النماذج والمستندات:

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا

  • Python 3.x

    • يجب أن يتضمن تثبيت Python خاصتك pip. يمكنك التحقق مما إذا كانت لديك نقطة مثبتة عن طريق تشغيل pip --version على سطر الأوامر. الحصول على نقطة عن طريق تثبيت أحدث إصدار من Python.
  • خدمات Azure الذكاء الاصطناعي أو مورد تحليل معلومات المستند. بمجرد حصولك على اشتراك Azure، أنشئ موردا للمعلومات المستندية لخدمة واحدة أو متعدد الخدمات في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

    تلميح

    إنشاء مورد خدمات Azure الذكاء الاصطناعي إذا كنت تخطط للوصول إلى خدمات Azure الذكاء الاصطناعي المتعددة ضمن نقطة نهاية/مفتاح واحد. للوصول إلى Document Intelligence فقط، قم بإنشاء مورد Document Intelligence. يرجى ملاحظة أنك ستحتاج إلى مورد خدمة واحدة إذا كنت تنوي استخدام مصادقة Microsoft Entra.

  • بعد نشر المورد الخاص بك، حدد»Go to resource». تحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Document Intelligence. يمكنك لصق المفتاح ونقطة النهاية في التعليمات البرمجية لاحقا في التشغيل السريع:

    لقطة شاشة للمفاتيح وموقع نقطة النهاية في مدخل Microsoft Azure.

الإعداد

افتح نافذة طرفية في بيئتك المحلية وقم بتثبيت مكتبة عميل Azure الذكاء الاصطناعي Document Intelligence ل Python باستخدام pip:

pip install azure-ai-formrecognizer

إنشاء تطبيق Python جديد

أنشئ تطبيق Python جديدًا يسمى form_recognizer_quickstart.py في المحرر أو IDE المفضل لديك. ثم قم باستيراد المكتبات التالية:

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

قم بإنشاء متغيرات نقطة نهاية مورد Azure والمفتاح

endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"

عند هذه النقطة، يجب أن يحتوي تطبيق Python على الأسطر التالية من التعليمات البرمجية:

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"

حدد عينة التعليمات البرمجية لنسخه ولصقه في تطبيقك:

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات، راجع أمان خدمات Azure الذكاء الاصطناعي.

جربه: نموذج التخطيط

  • في هذا المثال، ستحتاج إلى ملف مستند في URI. يمكنك استخدام نموذج المستند الخاص بنا لهذا التشغيل السريع.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير formUrl بالقرب من أعلى الملف.
  • لتحليل ملف معين على عنوان URI، ستستخدم الأسلوب begin_recognize_content_from_url.

إضافة التعليمات البرمجية التالية إلى تطبيق التخطيط الخاص بك على السطر أسفل key المتغير


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

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

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

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

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

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

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


if __name__ == "__main__":
    recognize_content()

جرب: نموذج مسبق الإعداد

يوضح هذا النموذج كيفية تحليل البيانات من أنواع معينة من المستندات الشائعة باستخدام نماذج مدربة مسبقا، باستخدام فاتورة كمثال. راجع صفحة المفاهيم التي تم إنشاؤها مسبقاً للحصول على قائمة كاملة بـ حقول الفاتورة

  • على سبيل المثال، نقوم بتحليل مستند فاتورة باستخدام نموذج تم إنشاؤه مسبقًا. يمكنك استخدام عينة مستند فاتورة لقالب التشغيل السريع هذا.
  • لقد أضفنا قيمة عنوان URI للملف إلى المتغير ``formUrl` أعلى الملف.
  • لتحليل ملف معين في URI، ستستخدم أسلوب ''begin_recognize_invoices_from_url'.
  • للتبسيط، لا تظهر هنا جميع أزواج قيم المفاتيح والقيمة التي ترجعها الخدمة. للاطلاع على قائمة بجميع الحقول المدعومة والأنواع المتوافقة، راجع صفحة «Invoice concept».

اختيار نموذج تم إعداده مسبقاً

أنت لست مقيدًا بالفواتير - يوجد العديد من النماذج التي تم إعدادها مسبقًا للاختيار من بينها، ولكل منها مجموعته الخاصة من الحقول المدعومة. يعتمد الطراز الذي سيتم استخدامه لعملية التحليل على نوع المستند الذي سيتم تحليله. فيما يلي النماذج التي تم إنشاؤها مسبقا المدعومة حاليا من قبل خدمة Document Intelligence:

  • الفاتورة: تستخرج النص وعلامات التحديد والجداول والحقول والمعلومات الأساسية من الفواتير.
  • الإيصال: استخراج النص والمعلومات الأساسية من الإيصالات.
  • مستند المُعرف: استخرج النص والمعلومات الأساسية من رخص القيادة وجوازات السفر الدولية.
  • بطاقة العمل: تستخرج النص والمعلومات الأساسية من بطاقات العمل.

إضافة التعليمات البرمجية التالية إلى تطبيق الفاتورة مسبقة الإعداد أسفل المتغير key


def recognize_invoice():

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

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

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

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


if __name__ == "__main__":
    recognize_invoice()

تشغيل التطبيق الخاص بك

  1. انتقل إلى المجلد حيث تجد الملف form_recognizer_quickstart.py.

  2. اكتب الأمر التالي في المحطة الطرفية:

python form_recognizer_quickstart.py

| مرجع واجهة برمجة تطبيقات | REST لذكاء المستند Azure REST API |

في هذا التشغيل السريع، يمكنك استخدام واجهات برمجة التطبيقات التالية لاستخراج البيانات المنظمة من النماذج والمستندات:

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا

  • تم تثبيت cURL.

  • الإصدار 6.0+ من PowerShell، أو تطبيق سطر أوامر مشابهة.

  • خدمات Azure الذكاء الاصطناعي أو مورد تحليل معلومات المستند. بمجرد حصولك على اشتراك Azure، أنشئ موردا للمعلومات المستندية لخدمة واحدة أو متعدد الخدمات في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

    تلميح

    إنشاء مورد خدمات Azure الذكاء الاصطناعي إذا كنت تخطط للوصول إلى خدمات Azure الذكاء الاصطناعي المتعددة ضمن نقطة نهاية/مفتاح واحد. للوصول إلى Document Intelligence فقط، قم بإنشاء مورد Document Intelligence. يرجى ملاحظة أنك ستحتاج إلى مورد خدمة واحدة إذا كنت تنوي استخدام مصادقة Microsoft Entra.

  • بعد نشر المورد الخاص بك، حدد»Go to resource». تحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بواجهة برمجة تطبيقات Document Intelligence. يمكنك لصق المفتاح ونقطة النهاية في التعليمات البرمجية لاحقا في التشغيل السريع:

    لقطة شاشة للمفاتيح وموقع نقطة النهاية في مدخل Microsoft Azure.

حدد عينة التعليمات البرمجية لنسخه ولصقه في تطبيقك:

هام

تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات، راجع أمان خدمات Azure الذكاء الاصطناعي.

جربه: نموذج التخطيط

  • في هذا المثال، ستحتاج إلى ملف مستند في URI. يمكنك استخدام نموذج المستند الخاص بنا لهذا التشغيل السريع.
  1. استبدل {endpoint} بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل {key} بالمفتاح الذي نسخته من الخطوة السابقة.
  3. استبدل \"{your-document-url} بنموذج عنوان URL لمستند:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf

طلب

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

موقع-العملية

تتلقى استجابة 202 (Success) تتضمن عنوان Operation-Location . تحتوي قيمة هذا العنوان على معرّف نتيجة يمكنك استخدامه للاستعلام عن حالة العملية غير المتزامنة والحصول على النتائج:

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

إن السلسلة، في المثال التالي، كجزء من عنوان URL، بعد analyzeResults/ هي معرّف النتيجة.

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

الحصول على نتائج المخطط

بعد استدعاء واجهة برمجة تطبيقات تحليل المخطط، يمكنك استدعاء واجهة برمجة تطبيقات تحليل نتائج المخطط للحصول على حالة العملية والبيانات المستخرجة. قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

  1. استبدل {endpoint} بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل {key} بالمفتاح الذي نسخته من الخطوة السابقة.
  3. استبدال {resultId} بمعرّف النتيجة من الخطوة السابقة.

طلب

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

فحص النتائج

تتلقى استجابة 200 (success) بمحتوى JSON.

راجع صورة الفاتورة التالية وناتج JSON المقابل لها.

  • تحتوي العقدة "readResults" على كل سطر من النص مع موضع مربع الإحاطة الخاص به على الصفحة.
  • تعرض العقدة selectionMarks كل علامة تحديد (خانة اختيار، علامة راديو) وما إذا كانت حالتها selected أوunselected.
  • يتضمن "pageResults" القسم الجداول المستخرجة. بالنسبة لكل جدول، يتم استخراج النص والصف وفهرس العمود، والصفوف والأعمدة الممتدة، ومربع الإحاطة، والمزيد.

مستند بيان مشروع Contoso يتضمن جدول.

هيئة الاستجابة

يمكنك عرض الإخراج الكامل لعينة على GitHub.

جرب: نموذج مسبق الإعداد

  • على سبيل المثال، نقوم بتحليل مستند فاتورة باستخدام نموذج تم إنشاؤه مسبقًا. يمكنك استخدام عينة مستند فاتورة لقالب التشغيل السريع هذا.

اختيار نموذج تم إعداده مسبقاً

أنت لست مقيدًا بالفواتير - يوجد العديد من النماذج التي تم إعدادها مسبقًا للاختيار من بينها، ولكل منها مجموعته الخاصة من الحقول المدعومة. يعتمد الطراز الذي سيتم استخدامه لعملية التحليل على نوع المستند الذي سيتم تحليله. فيما يلي النماذج التي تم إنشاؤها مسبقا المدعومة حاليا من قبل خدمة Document Intelligence:

  • الفاتورة: تستخرج النص وعلامات التحديد والجداول والحقول والمعلومات الأساسية من الفواتير.
  • الإيصال: استخراج النص والمعلومات الأساسية من الإيصالات.
  • مستند المُعرف: استخرج النص والمعلومات الأساسية من رخص القيادة وجوازات السفر الدولية.
  • بطاقة العمل: تستخرج النص والمعلومات الأساسية من بطاقات العمل.

قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

  1. استبدل {endpoint} بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.

  2. استبدل {key} بالمفتاح الذي نسخته من الخطوة السابقة.

  3. استبدال \"{your-document-url} بعنوان URL لفاتورة عينة:

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

طلب

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

موقع-العملية

تتلقى استجابة 202 (Success) تتضمن عنوان Operation-Location . تحتوي قيمة هذا العنوان على معرّف نتيجة يمكنك استخدامه للاستعلام عن حالة العملية غير المتزامنة والحصول على النتائج:

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

إن السلسلة، في المثال التالي، كجزء من عنوان URL، بعد analyzeResults/ هي معرّف النتيجة:

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

الحصول على نتائج الفاتورة

بعد استدعاء واجهة برمجة تطبيقات تحليل الفواتير، يمكنك استدعاء واجهة برمجة تطبيقات الحصول على تحليل نتائج الفواتير للحصول على حالة العملية والبيانات المستخرجة. قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

  1. استبدل {endpoint} بنقطة النهاية التي حصلت عليها بمفتاح Document Intelligence. يمكنك العثور عليه في علامة التبويب نظرة عامة على مورد معلومات المستند.
  2. استبدال {resultId} بمعرّف النتيجة من الخطوة السابقة.
  3. استبدل {key} بمفتاحك.

طلب

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

فحص الاستجابة

تتلقى استجابة 200 (Success) مع إخراج JSON.

  • يحتوي الحقل "readResults" على كل سطر من النص تم استخراجه من الفاتورة.
  • يتضمن "pageResults" علامات الجداول والتحديدات المستخرجة من الفاتورة.
  • يحتوي الحقل "documentResults" على معلومات المفتاح/القيمة للأجزاء الأكثر صلة بالفاتورة.

راجع مستند فاتورة عينة.

هيئة الاستجابة

راجع ناتج النموذج الكامل على GitHub.

هذا كل شيء، أحسنت!

الخطوات التالية

  • للحصول على تجربة محسنة وجودة نموذج متقدمة، جرب Document Intelligence Studio.

    • يدعم Studio أي نموذج مدرب مع البيانات المسماة v2.1.

    • توفر سجلات التغيير معلومات مفصلة حول الترحيل من v3.1 إلى v4.0.