استخدام نماذج تحليل معلومات المستند

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

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

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

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

في هذا الدليل، تعرف على كيفية إضافة نماذج تحليل معلومات المستند إلى تطبيقاتك ومهام سير العمل. استخدم لغة برمجة SDK من اختيارك أو واجهة برمجة تطبيقات REST.

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

اختر من نماذج ذكاء المستند التالية وقم بتحليل واستخراج البيانات والقيم من النماذج والمستندات:

  • يقع نموذج القراءة المعد مسبقا في صميم جميع نماذج Document Intelligence ويمكنه اكتشاف الأسطر والكلمات والمواقع واللغات. يستخدم read التخطيط والمستند العام والنماذج المعدة مسبقا والمخصصة النموذج كأساس لاستخراج النصوص من المستندات.

  • يستخرج نموذج التخطيط الذي تم إنشاؤه مسبقا مواقع النص والنص والجداول وعلامات التحديد ومعلومات البنية من المستندات والصور. يمكنك استخراج أزواج المفاتيح/القيم باستخدام نموذج التخطيط مع تمكين معلمة features=keyValuePairs سلسلة الاستعلام الاختيارية.

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

  • يستخرج نموذج prebuilt-healthInsuranceCard.us المعلومات الرئيسية من بطاقات التأمين الصحي الأمريكية.

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

  • يستخرج نموذج الفاتورة الذي تم إنشاؤه مسبقا الحقول الرئيسية وعناصر السطر من فواتير المبيعات بتنسيقات وجودة مختلفة. تتضمن الحقول الصور التي تم التقاطها عبر الهاتف والمستندات الممسوحة ضوئيا وملفات PDF الرقمية.

  • يستخرج نموذج الإيصال مسبق الإنشاء المعلومات الرئيسية من إيصالات المبيعات المطبوعة والمكتوبة بخط اليد.

  • يستخرج نموذج idDocument الذي تم إنشاؤه مسبقا معلومات رئيسية من تراخيص قيادة الولايات المتحدة وصفحات سيرة ذاتية لجوازات السفر الدولية ومعرف الولايات المتحدة وبطاقات الضمان الاجتماعي وبطاقات الإقامة الدائمة.

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

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

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • "Visual Studio IDE".

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

  • ملف مستند في موقع URL. بالنسبة لهذا المشروع، يمكنك استخدام نماذج النماذج المتوفرة في الجدول التالي لكل ميزة:

    ميزة معرف النموذج عنوان url المستند
    نموذج القراءة prebuilt-read عينة بحث موجزة
    نموذج تخطيط prebuilt-layout تأكيد حجز العينة
    نموذج استمارة W-2 prebuilt-tax.us.w2 نموذج W-2 نموذجي
    نموذج الفاتورة prebuilt-invoice نموذج الفاتورة
    نموذج الإيصال prebuilt-receipt نموذج الإيصال
    نموذج مستند المعرف prebuilt-idDocument مستندات المعرّف مسبقة الإنشاء
    نموذج بطاقة العمل prebuilt-businessCard عينة بطاقة العمل

تعيين متغيرات البيئة الخاصة بك

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

هام

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

لتعيين متغير البيئة لمفتاح مورد Document Intelligence، افتح نافذة وحدة تحكم، واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير. استبدل yourKey> وEndpoint>< بالقيم من المورد الخاص بك في مدخل Microsoft Azure.<

متغيرات البيئة في Windows غير حساسة لحالة الأحرف. عادة ما يتم الإعلان عنها بأحرف كبيرة، مع كلمات مرتبطة بتسطير أسفل السطر. في موجه الأوامر، قم بتشغيل الأوامر التالية:

  1. تعيين متغير المفتاح الخاص بك:

    setx DI_KEY <yourKey>
    
  2. تعيين متغير نقطة النهاية

    setx DI_ENDPOINT <yourEndpoint>
    
  3. أغلق نافذة موجه الأوامر بعد تعيين متغيرات البيئة الخاصة بك. تبقى القيم حتى تقوم بتغييرها مرة أخرى.

  4. أعد تشغيل أي برامج قيد التشغيل تقرأ متغير البيئة. على سبيل المثال، إذا كنت تستخدم Visual Studio أو Visual Studio Code كمحرر، فعد التشغيل قبل تشغيل نموذج التعليمات البرمجية.

فيما يلي بعض الأوامر الأكثر فائدة لاستخدامها مع متغيرات البيئة:

الأمر الإجراء مثال
setx VARIABLE_NAME= احذف متغير البيئة عن طريق تعيين القيمة إلى سلسلة فارغة. setx DI_KEY=
setx VARIABLE_NAME=value تعيين قيمة متغير بيئة أو تغييرها. setx DI_KEY=<yourKey>
set VARIABLE_NAME عرض قيمة متغير بيئة معين. set DI_KEY
set عرض كافة متغيرات البيئة. set

إعداد بيئة البرمجة

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

  2. في صفحة البدء، اختر إنشاء مشروع جديد.

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

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

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

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

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

  5. في صفحة معلومات إضافية، حدد .NET 8.0 (دعم طويل الأجل)، ثم حدد إنشاء.

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

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

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

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

  2. حدد علامة التبويب استعراض واكتب Azure.الذكاء الاصطناعي.FormRecognizer.

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

  3. حدد إصدارا من القائمة المنسدلة وقم بتثبيت الحزمة في مشروعك.

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

إشعار

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

عندما تستخدم الإصدار الأحدث، تحتاج فقط إلى كتابة هيكل الأسلوبMain. لست بحاجة إلى تضمين بيانات عالية المستوى أو توجيهات عالمية باستخدام توجيهات أو استخدام ضمني للتوجيهات. لمزيد من المعلومات، راجع إنشاء قالب تطبيق وحدة تحكم C# عبارات المستوى الأعلى.

  1. افتح ملف Program.cs.

  2. احذف التعليمة البرمجية الموجود مسبقاً، بما في ذلك السطر Console.Writeline("Hello World!").

  3. حدد أحد نماذج التعليمات البرمجية التالية وانسخ/الصق في ملف Program.cs التطبيق الخاص بك:

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

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

استخدام نموذج القراءة

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
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/rest-api/read.png");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-read", 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}");
        }
    }
}

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("Detected languages:");

foreach (DocumentLanguage language in result.Languages)
{
    Console.WriteLine($"  Found language with locale'{language.Locale}' with confidence {language.Confidence}.");
}

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

استخدام نموذج التخطيط

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

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

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

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

استخدام نموذج المستند "عام"

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document 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-document", fileUri);

AnalyzeResult result = operation.Value;

Console.WriteLine("Detected key-value pairs:");

foreach (DocumentKeyValuePair kvp in result.KeyValuePairs)
{
    if (kvp.Value == null)
    {
        Console.WriteLine($"  Found key with no value: '{kvp.Key.Content}'");
    }
    else
    {
        Console.WriteLine($"  Found key-value pair: '{kvp.Key.Content}' and '{kvp.Value.Content}'");
    }
}

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

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

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

استخدام نموذج الضريبة W-2


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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

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

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-tax.us.w2", w2Uri);

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("AdditionalInfo", out DocumentField? additionalInfoField))
    {
        if (additionalInfoField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField infoField in additionalInfoField.Value.AsList())
            {
                Console.WriteLine("AdditionalInfo:");

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

                    if (infoFields.TryGetValue("Amount", out DocumentField? amountField))
                    {
                        if (amountField.FieldType == DocumentFieldType.Double)
                        {
                            double amount = amountField.Value.AsDouble();

                            Console.WriteLine($"  Amount: '{amount}', with confidence {amountField.Confidence}");
                        }
                    }

                    if (infoFields.TryGetValue("LetterCode", out DocumentField? letterCodeField))
                    {
                        if (letterCodeField.FieldType == DocumentFieldType.String)
                        {
                            string letterCode = letterCodeField.Value.AsString();

                            Console.WriteLine($"  LetterCode: '{letterCode}', with confidence {letterCodeField.Confidence}");
                        }
                    }
                }
            }
        }
    }


    if (document.Fields.TryGetValue("AllocatedTips", out DocumentField? allocatedTipsField))
    {
        if (allocatedTipsField.FieldType == DocumentFieldType.Double)
        {
            double allocatedTips = allocatedTipsField.Value.AsDouble();
            Console.WriteLine($"Allocated Tips: '{allocatedTips}', with confidence {allocatedTipsField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("Employer", out DocumentField? employerField))
    {
        if (employerField.FieldType == DocumentFieldType.Dictionary)
        {
            IReadOnlyDictionary<string, DocumentField> employerFields = employerField.Value.AsDictionary();

            if (employerFields.TryGetValue("Name", out DocumentField? employerNameField))
            {
                if (employerNameField.FieldType == DocumentFieldType.String)
                {
                    string name = employerNameField.Value.AsString();

                    Console.WriteLine($"Employer Name: '{name}', with confidence {employerNameField.Confidence}");
                }
            }

            if (employerFields.TryGetValue("IdNumber", out DocumentField? idNumberField))
            {
                if (idNumberField.FieldType == DocumentFieldType.String)
                {
                    string id = idNumberField.Value.AsString();

                    Console.WriteLine($"Employer ID Number: '{id}', with confidence {idNumberField.Confidence}");
                }
            }

            if (employerFields.TryGetValue("Address", out DocumentField? addressField))
            {
                if (addressField.FieldType == DocumentFieldType.Address)
                {
                    Console.WriteLine($"Employer Address: '{addressField.Content}', with confidence {addressField.Confidence}");
                }
            }
        }
    }
}

قم بزيارة مستودع نماذج Azure على GitHub واعرض إخراج نموذج ضريبة W-2.

استخدام نموذج الفاتورة

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document document
Uri invoiceUri = new Uri("https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/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}");
        }
    }
}

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

استخدام نموذج الإيصال


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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

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

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

AnalyzeResult receipts = operation.Value;

foreach (AnalyzedDocument receipt in receipts.Documents)
{
    if (receipt.Fields.TryGetValue("MerchantName", out DocumentField merchantNameField))
    {
        if (merchantNameField.FieldType == DocumentFieldType.String)
        {
            string merchantName = merchantNameField.Value.AsString();

            Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}");
        }
    }

    if (receipt.Fields.TryGetValue("TransactionDate", out DocumentField transactionDateField))
    {
        if (transactionDateField.FieldType == DocumentFieldType.Date)
        {
            DateTimeOffset transactionDate = transactionDateField.Value.AsDate();

            Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}");
        }
    }

    if (receipt.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("TotalPrice", out DocumentField itemTotalPriceField))
                    {
                        if (itemTotalPriceField.FieldType == DocumentFieldType.Double)
                        {
                            double itemTotalPrice = itemTotalPriceField.Value.AsDouble();

                            Console.WriteLine($"  Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (receipt.Fields.TryGetValue("Total", out DocumentField totalField))
    {
        if (totalField.FieldType == DocumentFieldType.Double)
        {
            double total = totalField.Value.AsDouble();

            Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'");
        }
    }
}

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

نموذج مستند المعرف


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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document document

Uri idDocumentUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png");

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

AnalyzeResult identityDocuments = operation.Value;

AnalyzedDocument identityDocument = identityDocuments.Documents.Single();

if (identityDocument.Fields.TryGetValue("Address", out DocumentField addressField))
{
    if (addressField.FieldType == DocumentFieldType.String)
    {
        string address = addressField.Value. AsString();
        Console.WriteLine($"Address: '{address}', with confidence {addressField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("CountryRegion", out DocumentField countryRegionField))
{
    if (countryRegionField.FieldType == DocumentFieldType.CountryRegion)
    {
        string countryRegion = countryRegionField.Value.AsCountryRegion();
        Console.WriteLine($"CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DateOfBirth", out DocumentField dateOfBirthField))
{
    if (dateOfBirthField.FieldType == DocumentFieldType.Date)
    {
        DateTimeOffset dateOfBirth = dateOfBirthField.Value.AsDate();
        Console.WriteLine($"Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DateOfExpiration", out DocumentField dateOfExpirationField))
{
    if (dateOfExpirationField.FieldType == DocumentFieldType.Date)
    {
        DateTimeOffset dateOfExpiration = dateOfExpirationField.Value.AsDate();
        Console.WriteLine($"Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DocumentNumber", out DocumentField documentNumberField))
{
    if (documentNumberField.FieldType == DocumentFieldType.String)
    {
        string documentNumber = documentNumberField.Value.AsString();
        Console.WriteLine($"Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("FirstName", out DocumentField firstNameField))
{
    if (firstNameField.FieldType == DocumentFieldType.String)
    {
        string firstName = firstNameField.Value.AsString();
        Console.WriteLine($"First Name: '{firstName}', with confidence {firstNameField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("LastName", out DocumentField lastNameField))
{
    if (lastNameField.FieldType == DocumentFieldType.String)
    {
        string lastName = lastNameField.Value.AsString();
        Console.WriteLine($"Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("Region", out DocumentField regionfield))
{
    if (regionfield.FieldType == DocumentFieldType.String)
    {
        string region = regionfield.Value.AsString();
        Console.WriteLine($"Region: '{region}', with confidence {regionfield.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("Sex", out DocumentField sexfield))
{
    if (sexfield.FieldType == DocumentFieldType.String)
    {
        string sex = sexfield.Value.AsString();
        Console.WriteLine($"Sex: '{sex}', with confidence {sexfield.Confidence}");
    }
}

قم بزيارة مستودع نماذج Azure على GitHub واعرض إخراج نموذج id-document.

استخدام نموذج بطاقة العمل

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document document
Uri businessCardUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/business-card-english.jpg");

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

AnalyzeResult businessCards = operation.Value;

foreach (AnalyzedDocument businessCard in businessCards.Documents)
{
    if (businessCard.Fields.TryGetValue("ContactNames", out DocumentField ContactNamesField))
    {
        if (ContactNamesField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField contactNameField in ContactNamesField.Value.AsList())
            {
                Console.WriteLine("Contact Name: ");

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

                    if (contactNameFields.TryGetValue("FirstName", out DocumentField firstNameField))
                    {
                        if (firstNameField.FieldType == DocumentFieldType.String)
                        {
                            string firstName = firstNameField.Value.AsString();

                            Console.WriteLine($"  First Name: '{firstName}', with confidence {firstNameField.Confidence}");
                        }
                    }

                    if (contactNameFields.TryGetValue("LastName", out DocumentField lastNameField))
                    {
                        if (lastNameField.FieldType == DocumentFieldType.String)
                        {
                            string lastName = lastNameField.Value.AsString();

                            Console.WriteLine($"  Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("JobTitles", out DocumentField jobTitlesFields))
    {
        if (jobTitlesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField jobTitleField in jobTitlesFields.Value.AsList())
            {
                if (jobTitleField.FieldType == DocumentFieldType.String)
                {
                    string jobTitle = jobTitleField.Value.AsString();

                    Console.WriteLine($"Job Title: '{jobTitle}', with confidence {jobTitleField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Departments", out DocumentField departmentFields))
    {
        if (departmentFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField departmentField in departmentFields.Value.AsList())
            {
                if (departmentField.FieldType == DocumentFieldType.String)
                {
                    string department = departmentField.Value.AsString();

                    Console.WriteLine($"Department: '{department}', with confidence {departmentField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Emails", out DocumentField emailFields))
    {
        if (emailFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField emailField in emailFields.Value.AsList())
            {
                if (emailField.FieldType == DocumentFieldType.String)
                {
                    string email = emailField.Value.AsString();

                    Console.WriteLine($"Email: '{email}', with confidence {emailField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Websites", out DocumentField websiteFields))
    {
        if (websiteFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField websiteField in websiteFields.Value.AsList())
            {
                if (websiteField.FieldType == DocumentFieldType.String)
                {
                    string website = websiteField.Value.AsString();

                    Console.WriteLine($"Website: '{website}', with confidence {websiteField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("MobilePhones", out DocumentField mobilePhonesFields))
    {
        if (mobilePhonesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField mobilePhoneField in mobilePhonesFields.Value.AsList())
            {
                if (mobilePhoneField.FieldType == DocumentFieldType.PhoneNumber)
                {
                    string mobilePhone = mobilePhoneField.Value.AsPhoneNumber();

                    Console.WriteLine($"Mobile phone number: '{mobilePhone}', with confidence {mobilePhoneField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("WorkPhones", out DocumentField workPhonesFields))
    {
        if (workPhonesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField workPhoneField in workPhonesFields.Value.AsList())
            {
                if (workPhoneField.FieldType == DocumentFieldType.PhoneNumber)
                {
                    string workPhone = workPhoneField.Value.AsPhoneNumber();

                    Console.WriteLine($"Work phone number: '{workPhone}', with confidence {workPhoneField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Faxes", out DocumentField faxesFields))
    {
        if (faxesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField faxField in faxesFields.Value.AsList())
            {
                if (faxField.FieldType == DocumentFieldType.PhoneNumber)
                {
                    string fax = faxField.Value.AsPhoneNumber();

                    Console.WriteLine($"Fax phone number: '{fax}', with confidence {faxField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Addresses", out DocumentField addressesFields))
    {
        if (addressesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField addressField in addressesFields.Value.AsList())
            {
                if (addressField.FieldType == DocumentFieldType.String)
                {
                    string address = addressField.Value.AsString();

                    Console.WriteLine($"Address: '{address}', with confidence {addressField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("CompanyNames", out DocumentField companyNamesFields))
    {
        if (companyNamesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField companyNameField in companyNamesFields.Value.AsList())
            {
                if (companyNameField.FieldType == DocumentFieldType.String)
                {
                    string companyName = companyNameField.Value.AsString();

                    Console.WriteLine($"Company name: '{companyName}', with confidence {companyNameField.Confidence}");
                }
            }
        }
    }
}

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

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

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • "Visual Studio IDE".

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

  • ملف مستند في موقع URL. بالنسبة لهذا المشروع، يمكنك استخدام نماذج النماذج المتوفرة في الجدول التالي لكل ميزة:

    ميزة معرف النموذج عنوان url المستند
    نموذج القراءة prebuilt-read عينة بحث موجزة
    نموذج تخطيط prebuilt-layout تأكيد حجز العينة
    نموذج استمارة W-2 prebuilt-tax.us.w2 نموذج W-2 نموذجي
    نموذج الفاتورة prebuilt-invoice نموذج الفاتورة
    نموذج الإيصال prebuilt-receipt نموذج الإيصال
    نموذج مستند المعرف prebuilt-idDocument مستندات المعرّف مسبقة الإنشاء
    نموذج بطاقة العمل prebuilt-businessCard عينة بطاقة العمل

تعيين متغيرات البيئة الخاصة بك

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

هام

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

لتعيين متغير البيئة لمفتاح مورد Document Intelligence، افتح نافذة وحدة تحكم، واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير. استبدل yourKey> وEndpoint>< بالقيم من المورد الخاص بك في مدخل Microsoft Azure.<

متغيرات البيئة في Windows غير حساسة لحالة الأحرف. عادة ما يتم الإعلان عنها بأحرف كبيرة، مع كلمات مرتبطة بتسطير أسفل السطر. في موجه الأوامر، قم بتشغيل الأوامر التالية:

  1. تعيين متغير المفتاح الخاص بك:

    setx DI_KEY <yourKey>
    
  2. تعيين متغير نقطة النهاية

    setx DI_ENDPOINT <yourEndpoint>
    
  3. أغلق نافذة موجه الأوامر بعد تعيين متغيرات البيئة الخاصة بك. تبقى القيم حتى تقوم بتغييرها مرة أخرى.

  4. أعد تشغيل أي برامج قيد التشغيل تقرأ متغير البيئة. على سبيل المثال، إذا كنت تستخدم Visual Studio أو Visual Studio Code كمحرر، فعد التشغيل قبل تشغيل نموذج التعليمات البرمجية.

فيما يلي بعض الأوامر الأكثر فائدة لاستخدامها مع متغيرات البيئة:

الأمر الإجراء مثال
setx VARIABLE_NAME= احذف متغير البيئة عن طريق تعيين القيمة إلى سلسلة فارغة. setx DI_KEY=
setx VARIABLE_NAME=value تعيين قيمة متغير بيئة أو تغييرها. setx DI_KEY=<yourKey>
set VARIABLE_NAME عرض قيمة متغير بيئة معين. set DI_KEY
set عرض كافة متغيرات البيئة. set

إعداد بيئة البرمجة

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

  2. في صفحة البدء، اختر إنشاء مشروع جديد.

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

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

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

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

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

  5. في صفحة معلومات إضافية، حدد .NET 8.0 (دعم طويل الأجل)، ثم حدد إنشاء.

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

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

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

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

  2. حدد علامة التبويب استعراض واكتب Azure.الذكاء الاصطناعي.FormRecognizer.

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

  3. حدد إصدارا من القائمة المنسدلة وقم بتثبيت الحزمة في مشروعك.

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

إشعار

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

عندما تستخدم الإصدار الأحدث، تحتاج فقط إلى كتابة هيكل الأسلوبMain. لست بحاجة إلى تضمين بيانات عالية المستوى أو توجيهات عالمية باستخدام توجيهات أو استخدام ضمني للتوجيهات. لمزيد من المعلومات، راجع إنشاء قالب تطبيق وحدة تحكم C# عبارات المستوى الأعلى.

  1. افتح ملف Program.cs.

  2. احذف التعليمة البرمجية الموجود مسبقاً، بما في ذلك السطر Console.Writeline("Hello World!").

  3. حدد أحد نماذج التعليمات البرمجية التالية وانسخ/الصق في ملف Program.cs التطبيق الخاص بك:

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

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

استخدام نموذج القراءة

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
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/rest-api/read.png");

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-read", 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}");
        }
    }
}

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("Detected languages:");

foreach (DocumentLanguage language in result.Languages)
{
    Console.WriteLine($"  Found language with locale'{language.Locale}' with confidence {language.Confidence}.");
}

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

استخدام نموذج التخطيط

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

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

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

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

استخدام نموذج المستند "عام"

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document 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-document", fileUri);

AnalyzeResult result = operation.Value;

Console.WriteLine("Detected key-value pairs:");

foreach (DocumentKeyValuePair kvp in result.KeyValuePairs)
{
    if (kvp.Value == null)
    {
        Console.WriteLine($"  Found key with no value: '{kvp.Key.Content}'");
    }
    else
    {
        Console.WriteLine($"  Found key-value pair: '{kvp.Key.Content}' and '{kvp.Value.Content}'");
    }
}

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

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

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

استخدام نموذج الضريبة W-2


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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

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

AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-tax.us.w2", w2Uri);

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("AdditionalInfo", out DocumentField? additionalInfoField))
    {
        if (additionalInfoField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField infoField in additionalInfoField.Value.AsList())
            {
                Console.WriteLine("AdditionalInfo:");

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

                    if (infoFields.TryGetValue("Amount", out DocumentField? amountField))
                    {
                        if (amountField.FieldType == DocumentFieldType.Double)
                        {
                            double amount = amountField.Value.AsDouble();

                            Console.WriteLine($"  Amount: '{amount}', with confidence {amountField.Confidence}");
                        }
                    }

                    if (infoFields.TryGetValue("LetterCode", out DocumentField? letterCodeField))
                    {
                        if (letterCodeField.FieldType == DocumentFieldType.String)
                        {
                            string letterCode = letterCodeField.Value.AsString();

                            Console.WriteLine($"  LetterCode: '{letterCode}', with confidence {letterCodeField.Confidence}");
                        }
                    }
                }
            }
        }
    }


    if (document.Fields.TryGetValue("AllocatedTips", out DocumentField? allocatedTipsField))
    {
        if (allocatedTipsField.FieldType == DocumentFieldType.Double)
        {
            double allocatedTips = allocatedTipsField.Value.AsDouble();
            Console.WriteLine($"Allocated Tips: '{allocatedTips}', with confidence {allocatedTipsField.Confidence}");
        }
    }

    if (document.Fields.TryGetValue("Employer", out DocumentField? employerField))
    {
        if (employerField.FieldType == DocumentFieldType.Dictionary)
        {
            IReadOnlyDictionary<string, DocumentField> employerFields = employerField.Value.AsDictionary();

            if (employerFields.TryGetValue("Name", out DocumentField? employerNameField))
            {
                if (employerNameField.FieldType == DocumentFieldType.String)
                {
                    string name = employerNameField.Value.AsString();

                    Console.WriteLine($"Employer Name: '{name}', with confidence {employerNameField.Confidence}");
                }
            }

            if (employerFields.TryGetValue("IdNumber", out DocumentField? idNumberField))
            {
                if (idNumberField.FieldType == DocumentFieldType.String)
                {
                    string id = idNumberField.Value.AsString();

                    Console.WriteLine($"Employer ID Number: '{id}', with confidence {idNumberField.Confidence}");
                }
            }

            if (employerFields.TryGetValue("Address", out DocumentField? addressField))
            {
                if (addressField.FieldType == DocumentFieldType.Address)
                {
                    Console.WriteLine($"Employer Address: '{addressField.Content}', with confidence {addressField.Confidence}");
                }
            }
        }
    }
}

قم بزيارة مستودع نماذج Azure على GitHub واعرض إخراج نموذج ضريبة W-2.

استخدام نموذج الفاتورة

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document document
Uri invoiceUri = new Uri("https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/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}");
        }
    }
}

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

استخدام نموذج الإيصال


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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

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

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

AnalyzeResult receipts = operation.Value;

foreach (AnalyzedDocument receipt in receipts.Documents)
{
    if (receipt.Fields.TryGetValue("MerchantName", out DocumentField merchantNameField))
    {
        if (merchantNameField.FieldType == DocumentFieldType.String)
        {
            string merchantName = merchantNameField.Value.AsString();

            Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}");
        }
    }

    if (receipt.Fields.TryGetValue("TransactionDate", out DocumentField transactionDateField))
    {
        if (transactionDateField.FieldType == DocumentFieldType.Date)
        {
            DateTimeOffset transactionDate = transactionDateField.Value.AsDate();

            Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}");
        }
    }

    if (receipt.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("TotalPrice", out DocumentField itemTotalPriceField))
                    {
                        if (itemTotalPriceField.FieldType == DocumentFieldType.Double)
                        {
                            double itemTotalPrice = itemTotalPriceField.Value.AsDouble();

                            Console.WriteLine($"  Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (receipt.Fields.TryGetValue("Total", out DocumentField totalField))
    {
        if (totalField.FieldType == DocumentFieldType.Double)
        {
            double total = totalField.Value.AsDouble();

            Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'");
        }
    }
}

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

نموذج مستند المعرف


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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document document

Uri idDocumentUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png");

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

AnalyzeResult identityDocuments = operation.Value;

AnalyzedDocument identityDocument = identityDocuments.Documents.Single();

if (identityDocument.Fields.TryGetValue("Address", out DocumentField addressField))
{
    if (addressField.FieldType == DocumentFieldType.String)
    {
        string address = addressField.Value. AsString();
        Console.WriteLine($"Address: '{address}', with confidence {addressField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("CountryRegion", out DocumentField countryRegionField))
{
    if (countryRegionField.FieldType == DocumentFieldType.CountryRegion)
    {
        string countryRegion = countryRegionField.Value.AsCountryRegion();
        Console.WriteLine($"CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DateOfBirth", out DocumentField dateOfBirthField))
{
    if (dateOfBirthField.FieldType == DocumentFieldType.Date)
    {
        DateTimeOffset dateOfBirth = dateOfBirthField.Value.AsDate();
        Console.WriteLine($"Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DateOfExpiration", out DocumentField dateOfExpirationField))
{
    if (dateOfExpirationField.FieldType == DocumentFieldType.Date)
    {
        DateTimeOffset dateOfExpiration = dateOfExpirationField.Value.AsDate();
        Console.WriteLine($"Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("DocumentNumber", out DocumentField documentNumberField))
{
    if (documentNumberField.FieldType == DocumentFieldType.String)
    {
        string documentNumber = documentNumberField.Value.AsString();
        Console.WriteLine($"Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("FirstName", out DocumentField firstNameField))
{
    if (firstNameField.FieldType == DocumentFieldType.String)
    {
        string firstName = firstNameField.Value.AsString();
        Console.WriteLine($"First Name: '{firstName}', with confidence {firstNameField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("LastName", out DocumentField lastNameField))
{
    if (lastNameField.FieldType == DocumentFieldType.String)
    {
        string lastName = lastNameField.Value.AsString();
        Console.WriteLine($"Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("Region", out DocumentField regionfield))
{
    if (regionfield.FieldType == DocumentFieldType.String)
    {
        string region = regionfield.Value.AsString();
        Console.WriteLine($"Region: '{region}', with confidence {regionfield.Confidence}");
    }
}

if (identityDocument.Fields.TryGetValue("Sex", out DocumentField sexfield))
{
    if (sexfield.FieldType == DocumentFieldType.String)
    {
        string sex = sexfield.Value.AsString();
        Console.WriteLine($"Sex: '{sex}', with confidence {sexfield.Confidence}");
    }
}

قم بزيارة مستودع نماذج Azure على GitHub واعرض إخراج نموذج id-document.

استخدام نموذج بطاقة العمل

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

//use your `key` and `endpoint` environment variables to create your `AzureKeyCredential` and `DocumentAnalysisClient` instances
string key = Environment.GetEnvironmentVariable("DI_KEY");
string endpoint = Environment.GetEnvironmentVariable("DI_ENDPOINT");
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);

// sample document document
Uri businessCardUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/business-card-english.jpg");

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

AnalyzeResult businessCards = operation.Value;

foreach (AnalyzedDocument businessCard in businessCards.Documents)
{
    if (businessCard.Fields.TryGetValue("ContactNames", out DocumentField ContactNamesField))
    {
        if (ContactNamesField.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField contactNameField in ContactNamesField.Value.AsList())
            {
                Console.WriteLine("Contact Name: ");

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

                    if (contactNameFields.TryGetValue("FirstName", out DocumentField firstNameField))
                    {
                        if (firstNameField.FieldType == DocumentFieldType.String)
                        {
                            string firstName = firstNameField.Value.AsString();

                            Console.WriteLine($"  First Name: '{firstName}', with confidence {firstNameField.Confidence}");
                        }
                    }

                    if (contactNameFields.TryGetValue("LastName", out DocumentField lastNameField))
                    {
                        if (lastNameField.FieldType == DocumentFieldType.String)
                        {
                            string lastName = lastNameField.Value.AsString();

                            Console.WriteLine($"  Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
                        }
                    }
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("JobTitles", out DocumentField jobTitlesFields))
    {
        if (jobTitlesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField jobTitleField in jobTitlesFields.Value.AsList())
            {
                if (jobTitleField.FieldType == DocumentFieldType.String)
                {
                    string jobTitle = jobTitleField.Value.AsString();

                    Console.WriteLine($"Job Title: '{jobTitle}', with confidence {jobTitleField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Departments", out DocumentField departmentFields))
    {
        if (departmentFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField departmentField in departmentFields.Value.AsList())
            {
                if (departmentField.FieldType == DocumentFieldType.String)
                {
                    string department = departmentField.Value.AsString();

                    Console.WriteLine($"Department: '{department}', with confidence {departmentField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Emails", out DocumentField emailFields))
    {
        if (emailFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField emailField in emailFields.Value.AsList())
            {
                if (emailField.FieldType == DocumentFieldType.String)
                {
                    string email = emailField.Value.AsString();

                    Console.WriteLine($"Email: '{email}', with confidence {emailField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Websites", out DocumentField websiteFields))
    {
        if (websiteFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField websiteField in websiteFields.Value.AsList())
            {
                if (websiteField.FieldType == DocumentFieldType.String)
                {
                    string website = websiteField.Value.AsString();

                    Console.WriteLine($"Website: '{website}', with confidence {websiteField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("MobilePhones", out DocumentField mobilePhonesFields))
    {
        if (mobilePhonesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField mobilePhoneField in mobilePhonesFields.Value.AsList())
            {
                if (mobilePhoneField.FieldType == DocumentFieldType.PhoneNumber)
                {
                    string mobilePhone = mobilePhoneField.Value.AsPhoneNumber();

                    Console.WriteLine($"Mobile phone number: '{mobilePhone}', with confidence {mobilePhoneField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("WorkPhones", out DocumentField workPhonesFields))
    {
        if (workPhonesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField workPhoneField in workPhonesFields.Value.AsList())
            {
                if (workPhoneField.FieldType == DocumentFieldType.PhoneNumber)
                {
                    string workPhone = workPhoneField.Value.AsPhoneNumber();

                    Console.WriteLine($"Work phone number: '{workPhone}', with confidence {workPhoneField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Faxes", out DocumentField faxesFields))
    {
        if (faxesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField faxField in faxesFields.Value.AsList())
            {
                if (faxField.FieldType == DocumentFieldType.PhoneNumber)
                {
                    string fax = faxField.Value.AsPhoneNumber();

                    Console.WriteLine($"Fax phone number: '{fax}', with confidence {faxField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("Addresses", out DocumentField addressesFields))
    {
        if (addressesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField addressField in addressesFields.Value.AsList())
            {
                if (addressField.FieldType == DocumentFieldType.String)
                {
                    string address = addressField.Value.AsString();

                    Console.WriteLine($"Address: '{address}', with confidence {addressField.Confidence}");
                }
            }
        }
    }

    if (businessCard.Fields.TryGetValue("CompanyNames", out DocumentField companyNamesFields))
    {
        if (companyNamesFields.FieldType == DocumentFieldType.List)
        {
            foreach (DocumentField companyNameField in companyNamesFields.Value.AsList())
            {
                if (companyNameField.FieldType == DocumentFieldType.String)
                {
                    string companyName = companyNameField.Value.AsString();

                    Console.WriteLine($"Company name: '{companyName}', with confidence {companyNameField.Confidence}");
                }
            }
        }
    }
}

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

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

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

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

    إذا كنت لا تستخدم Visual Studio Code، فتأكد من تثبيت ما يلي في بيئة التطوير الخاصة بك:

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

    تلميح

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

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

    ميزة معرف النموذج عنوان url المستند
    نموذج القراءة prebuilt-read عينة بحث موجزة
    نموذج تخطيط prebuilt-layout تأكيد حجز العينة
    نموذج استمارة W-2 prebuilt-tax.us.w2 نموذج W-2 نموذجي
    نموذج الفاتورة prebuilt-invoice نموذج الفاتورة
    نموذج الإيصال prebuilt-receipt نموذج الإيصال
    نموذج مستند المعرف prebuilt-idDocument مستندات المعرّف مسبقة الإنشاء

تعيين متغيرات البيئة الخاصة بك

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

هام

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

لتعيين متغير البيئة لمفتاح مورد Document Intelligence، افتح نافذة وحدة تحكم، واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير. استبدل yourKey> وEndpoint>< بالقيم من المورد الخاص بك في مدخل Microsoft Azure.<

متغيرات البيئة في Windows غير حساسة لحالة الأحرف. عادة ما يتم الإعلان عنها بأحرف كبيرة، مع كلمات مرتبطة بتسطير أسفل السطر. في موجه الأوامر، قم بتشغيل الأوامر التالية:

  1. تعيين متغير المفتاح الخاص بك:

    setx DI_KEY <yourKey>
    
  2. تعيين متغير نقطة النهاية

    setx DI_ENDPOINT <yourEndpoint>
    
  3. أغلق نافذة موجه الأوامر بعد تعيين متغيرات البيئة الخاصة بك. تبقى القيم حتى تقوم بتغييرها مرة أخرى.

  4. أعد تشغيل أي برامج قيد التشغيل تقرأ متغير البيئة. على سبيل المثال، إذا كنت تستخدم Visual Studio أو Visual Studio Code كمحرر، فعد التشغيل قبل تشغيل نموذج التعليمات البرمجية.

فيما يلي بعض الأوامر الأكثر فائدة لاستخدامها مع متغيرات البيئة:

الأمر الإجراء مثال
setx VARIABLE_NAME= احذف متغير البيئة عن طريق تعيين القيمة إلى سلسلة فارغة. setx DI_KEY=
setx VARIABLE_NAME=value تعيين قيمة متغير بيئة أو تغييرها. setx DI_KEY=<yourKey>
set VARIABLE_NAME عرض قيمة متغير بيئة معين. set DI_KEY
set عرض كافة متغيرات البيئة. set

إعداد بيئة البرمجة

لإعداد بيئة البرمجة الخاصة بك، قم بإنشاء مشروع Gradle وتثبيت مكتبة العميل.

إنشاء مشروع Gradle

  1. في نافذة وحدة التحكم، قم بإنشاء دليل لتطبيقك يسمى doc-intelligence-app وانتقل إليه.

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

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

  4. حدد Enter لقبول اسم المشروع الافتراضي، doc-intelligence-app.

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

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

  1. قم بفتح ملف 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'
    
    }
    

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

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

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

    mkdir -p src/main/java
    

ينشئ هذا الأمر بنية الدليل التالية:

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

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

    تلميح

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

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

    • يقع نموذج القراءة المعد مسبقا في صميم جميع نماذج Document Intelligence ويمكنه اكتشاف الأسطر والكلمات والمواقع واللغات. يستخدم read التخطيط والمستند العام والنماذج المعدة مسبقا والمخصصة النموذج كأساس لاستخراج النصوص من المستندات.
    • يستخرج نموذج التخطيط الذي تم إنشاؤه مسبقا مواقع النص والنص والجداول وعلامات التحديد ومعلومات البنية من المستندات والصور.
    • يستخرج نموذج prebuilt-tax.us.w2 المعلومات التي تم الإبلاغ عنها في النماذج الضريبية لخدمة الإيرادات الداخلية الأمريكية (IRS).
    • يستخرج نموذج الفاتورة الذي تم إنشاؤه مسبقا الحقول الرئيسية وعناصر السطر من فواتير المبيعات بتنسيقات مختلفة.
    • يستخرج نموذج الإيصال مسبق الإنشاء المعلومات الرئيسية من إيصالات المبيعات المطبوعة والمكتوبة بخط اليد.
    • يستخرج نموذج idDocument الذي تم إنشاؤه مسبقا معلومات رئيسية من تراخيص سائقي الولايات المتحدة؛ صفحات سيرة ذاتية لجوازات السفر الدولية؛ معرفات الولايات الأمريكية؛ بطاقات الضمان الاجتماعي؛ وبطاقات المقيمين الدائمين.
  3. اكتب الأوامر التالية:

    gradle build
    gradle run
    

استخدام نموذج القراءة

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 {

  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

      // create your `DocumentIntelligenceClient` 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/rest-api/read.png";

String modelId = "prebuilt-read";

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

AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.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.getBoundingPolygon().toString()));

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

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

استخدام نموذج التخطيط

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

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

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

AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.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.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.getSelectionMarkState().toString(),
      getBoundingCoordinates(documentSelectionMark.getBoundingPolygon()),
      documentSelectionMark.getConfidence()));
});

// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
  DocumentTable documentTables = tables.get(i);
  System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTables.getRowCount(),
    documentTables.getColumnCount());
  documentTables.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(", "));
}

}

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

استخدام نموذج المستند "عام"

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

//sample document
String generalDocumentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-document";
SyncPoller < OperationResult, AnalyzeResult > analyzeDocumentPoller =
  client.beginAnalyzeDocument(modelId, generalDocumentUrl);

AnalyzeResult analyzeResult = analyzeDocumentPoller.getFinalResult().getAnalyzeResult();;

// pages
analyzeResult.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()));
});

// tables
List < DocumentTable > tab_les = analyzeResult.getTables();
for (int i = 0; i < tab_les.size(); i++) {
  DocumentTable documentTable = tab_les.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();
}

// Key-value pairs
analyzeResult.getKeyValuePairs().forEach(documentKeyValuePair -> {
  System.out.printf("Key content: %s%n", documentKeyValuePair.getKey().getContent());
  System.out.printf("Key content bounding region: %s%n",
    documentKeyValuePair.getKey().getBoundingRegions().toString());

  if (documentKeyValuePair.getValue() != null) {
    System.out.printf("Value content: %s%n", documentKeyValuePair.getValue().getContent());
    System.out.printf("Value content bounding region: %s%n", documentKeyValuePair.getValue().getBoundingRegions().toString());
  }
});

}

}

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

استخدام نموذج الضريبة W-2

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

// sample document
String w2Url = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png";
String modelId = "prebuilt-tax.us.w2";

SyncPoller < OperationResult, AnalyzeResult > analyzeW2Poller =
  client.beginAnalyzeDocument(modelId, w2Url);

AnalyzeResult analyzeTaxResult = analyzeW2Poller.getFinalResult().getAnalyzeResult();

for (int i = 0; i < analyzeTaxResult.getDocuments().size(); i++) {
  AnalyzedDocument analyzedTaxDocument = analyzeTaxResult.getDocuments().get(i);
  Map < String, DocumentField > taxFields = analyzedTaxDocument.getFields();
  System.out.printf("----------- Analyzing Document  %d -----------%n", i);
  DocumentField w2FormVariantField = taxFields.get("W2FormVariant");
  if (w2FormVariantField != null) {
    if (DocumentFieldType.STRING == w2FormVariantField.getType()) {
      String merchantName = w2FormVariantField.getValueAsString();
      System.out.printf("Form variant: %s, confidence: %.2f%n",
        merchantName, w2FormVariantField.getConfidence());
    }
  }

  DocumentField employeeField = taxFields.get("Employee");
  if (employeeField != null) {
    System.out.println("Employee Data: ");
    if (DocumentFieldType.MAP == employeeField.getType()) {
      Map < String, DocumentField > employeeDataFieldMap = employeeField.getValueAsMap();
      DocumentField employeeName = employeeDataFieldMap.get("Name");
      if (employeeName != null) {
        if (DocumentFieldType.STRING == employeeName.getType()) {
          String employeesName = employeeName.getValueAsString();
          System.out.printf("Employee Name: %s, confidence: %.2f%n",
            employeesName, employeeName.getConfidence());
        }
      }
      DocumentField employeeAddrField = employeeDataFieldMap.get("Address");
      if (employeeAddrField != null) {
        if (DocumentFieldType.STRING == employeeAddrField.getType()) {
          String employeeAddress = employeeAddrField.getValueAsString();
          System.out.printf("Employee Address: %s, confidence: %.2f%n",
            employeeAddress, employeeAddrField.getConfidence());
        }
      }
    }
  }

  DocumentField employerField = taxFields.get("Employer");
  if (employerField != null) {
    System.out.println("Employer Data: ");
    if (DocumentFieldType.MAP == employerField.getType()) {
      Map < String, DocumentField > employerDataFieldMap = employerField.getValueAsMap();
      DocumentField employerNameField = employerDataFieldMap.get("Name");
      if (employerNameField != null) {
        if (DocumentFieldType.STRING == employerNameField.getType()) {
          String employerName = employerNameField.getValueAsString();
          System.out.printf("Employer Name: %s, confidence: %.2f%n",
            employerName, employerNameField.getConfidence());
        }
      }

      DocumentField employerIDNumberField = employerDataFieldMap.get("IdNumber");
      if (employerIDNumberField != null) {
        if (DocumentFieldType.STRING == employerIDNumberField.getType()) {
          String employerIdNumber = employerIDNumberField.getValueAsString();
          System.out.printf("Employee ID Number: %s, confidence: %.2f%n",
            employerIdNumber, employerIDNumberField.getConfidence());
        }
      }
    }
  }

  DocumentField taxYearField = taxFields.get("TaxYear");
  if (taxYearField != null) {
    if (DocumentFieldType.STRING == taxYearField.getType()) {
      String taxYear = taxYearField.getValueAsString();
      System.out.printf("Tax year: %s, confidence: %.2f%n",
        taxYear, taxYearField.getConfidence());
    }
  }

  DocumentField taxDateField = taxFields.get("TaxDate");
  if (taxDateField != null) {
    if (DocumentFieldType.DATE == taxDateField.getType()) {
      LocalDate taxDate = taxDateField.getValueAsDate();
      System.out.printf("Tax Date: %s, confidence: %.2f%n",
        taxDate, taxDateField.getConfidence());
    }
  }

  DocumentField socialSecurityTaxField = taxFields.get("SocialSecurityTaxWithheld");
  if (socialSecurityTaxField != null) {
    if (DocumentFieldType.DOUBLE == socialSecurityTaxField.getType()) {
      Double socialSecurityTax = socialSecurityTaxField.getValueAsDouble();
      System.out.printf("Social Security Tax withheld: %.2f, confidence: %.2f%n",
        socialSecurityTax, socialSecurityTaxField.getConfidence());
    }
  }
}
}
}

قم بزيارة مستودع نماذج Azure على GitHub واعرض إخراج نموذج ضريبة W-2.

استخدام نموذج الفاتورة

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

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

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

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

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

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

استخدام نموذج الإيصال

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

String receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png";
String modelId = "prebuilt-receipt";

SyncPoller < OperationResult, AnalyzeResult > analyzeReceiptPoller =
  client.beginAnalyzeDocument(modelId, receiptUrl);

AnalyzeResult receiptResults = analyzeReceiptPoller.getFinalResult().getAnalyzeResult();

for (int i = 0; i < receiptResults.getDocuments().size(); i++) {
  AnalyzedDocument analyzedReceipt = receiptResults.getDocuments().get(i);
  Map < String, DocumentField > receiptFields = analyzedReceipt.getFields();
  System.out.printf("----------- Analyzing receipt info %d -----------%n", i);
  DocumentField merchantNameField = receiptFields.get("MerchantName");
  if (merchantNameField != null) {
    if (DocumentFieldType.STRING == merchantNameField.getType()) {
      String merchantName = merchantNameField.getValueAsString();
      System.out.printf("Merchant Name: %s, confidence: %.2f%n",
        merchantName, merchantNameField.getConfidence());
    }
  }

  DocumentField merchantPhoneNumberField = receiptFields.get("MerchantPhoneNumber");
  if (merchantPhoneNumberField != null) {
    if (DocumentFieldType.PHONE_NUMBER == merchantPhoneNumberField.getType()) {
      String merchantAddress = merchantPhoneNumberField.getValueAsPhoneNumber();
      System.out.printf("Merchant Phone number: %s, confidence: %.2f%n",
        merchantAddress, merchantPhoneNumberField.getConfidence());
    }
  }

  DocumentField merchantAddressField = receiptFields.get("MerchantAddress");
  if (merchantAddressField != null) {
    if (DocumentFieldType.STRING == merchantAddressField.getType()) {
      String merchantAddress = merchantAddressField.getValueAsString();
      System.out.printf("Merchant Address: %s, confidence: %.2f%n",
        merchantAddress, merchantAddressField.getConfidence());
    }
  }

  DocumentField transactionDateField = receiptFields.get("TransactionDate");
  if (transactionDateField != null) {
    if (DocumentFieldType.DATE == transactionDateField.getType()) {
      LocalDate transactionDate = transactionDateField.getValueAsDate();
      System.out.printf("Transaction Date: %s, confidence: %.2f%n",
        transactionDate, transactionDateField.getConfidence());
    }
  }

  DocumentField receiptItemsField = receiptFields.get("Items");
  if (receiptItemsField != null) {
    System.out.printf("Receipt Items: %n");
    if (DocumentFieldType.LIST == receiptItemsField.getType()) {
      List < DocumentField > receiptItems = receiptItemsField.getValueAsList();
      receiptItems.stream()
        .filter(receiptItem -> DocumentFieldType.MAP == receiptItem.getType())
        .map(documentField -> documentField.getValueAsMap())
        .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
          if ("Name".equals(key)) {
            if (DocumentFieldType.STRING == documentField.getType()) {
              String name = documentField.getValueAsString();
              System.out.printf("Name: %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 ("Price".equals(key)) {
            if (DocumentFieldType.DOUBLE == documentField.getType()) {
              Double price = documentField.getValueAsDouble();
              System.out.printf("Price: %f, confidence: %.2f%n",
                price, documentField.getConfidence());
            }
          }
          if ("TotalPrice".equals(key)) {
            if (DocumentFieldType.DOUBLE == documentField.getType()) {
              Double totalPrice = documentField.getValueAsDouble();
              System.out.printf("Total Price: %f, confidence: %.2f%n",
                totalPrice, documentField.getConfidence());
            }
          }
        }));
    }
  }
}
}
}

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

استخدام نموذج مستند معرف

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

//sample document
String licenseUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png";
String modelId = "prebuilt-idDocument";

SyncPoller < OperationResult, AnalyzeResult > analyzeIdentityDocumentPoller = client.beginAnalyzeDocument(modelId, licenseUrl);

AnalyzeResult identityDocumentResults = analyzeIdentityDocumentPoller.getFinalResult().getAnalyzeResult();

for (int i = 0; i < identityDocumentResults.getDocuments().size(); i++) {
  AnalyzedDocument analyzedIDDocument = identityDocumentResults.getDocuments().get(i);
  Map < String, DocumentField > licenseFields = analyzedIDDocument.getFields();
  System.out.printf("----------- Analyzed license info for page %d -----------%n", i);
  DocumentField addressField = licenseFields.get("Address");
  if (addressField != null) {
    if (DocumentFieldType.STRING == addressField.getType()) {
      String address = addressField.getValueAsString();
      System.out.printf("Address: %s, confidence: %.2f%n",
        address, addressField.getConfidence());
    }
  }

  DocumentField countryRegionDocumentField = licenseFields.get("CountryRegion");
  if (countryRegionDocumentField != null) {
    if (DocumentFieldType.STRING == countryRegionDocumentField.getType()) {
      String countryRegion = countryRegionDocumentField.getValueAsCountry();
      System.out.printf("Country or region: %s, confidence: %.2f%n",
        countryRegion, countryRegionDocumentField.getConfidence());
    }
  }

  DocumentField dateOfBirthField = licenseFields.get("DateOfBirth");
  if (dateOfBirthField != null) {
    if (DocumentFieldType.DATE == dateOfBirthField.getType()) {
      LocalDate dateOfBirth = dateOfBirthField.getValueAsDate();
      System.out.printf("Date of Birth: %s, confidence: %.2f%n",
        dateOfBirth, dateOfBirthField.getConfidence());
    }
  }

  DocumentField dateOfExpirationField = licenseFields.get("DateOfExpiration");
  if (dateOfExpirationField != null) {
    if (DocumentFieldType.DATE == dateOfExpirationField.getType()) {
      LocalDate expirationDate = dateOfExpirationField.getValueAsDate();
      System.out.printf("Document date of expiration: %s, confidence: %.2f%n",
        expirationDate, dateOfExpirationField.getConfidence());
    }
  }

  DocumentField documentNumberField = licenseFields.get("DocumentNumber");
  if (documentNumberField != null) {
    if (DocumentFieldType.STRING == documentNumberField.getType()) {
      String documentNumber = documentNumberField.getValueAsString();
      System.out.printf("Document number: %s, confidence: %.2f%n",
        documentNumber, documentNumberField.getConfidence());
    }
  }

  DocumentField firstNameField = licenseFields.get("FirstName");
  if (firstNameField != null) {
    if (DocumentFieldType.STRING == firstNameField.getType()) {
      String firstName = firstNameField.getValueAsString();
      System.out.printf("First Name: %s, confidence: %.2f%n",
        firstName, documentNumberField.getConfidence());
    }
  }

  DocumentField lastNameField = licenseFields.get("LastName");
  if (lastNameField != null) {
    if (DocumentFieldType.STRING == lastNameField.getType()) {
      String lastName = lastNameField.getValueAsString();
      System.out.printf("Last name: %s, confidence: %.2f%n",
        lastName, lastNameField.getConfidence());
    }
  }

  DocumentField regionField = licenseFields.get("Region");
  if (regionField != null) {
    if (DocumentFieldType.STRING == regionField.getType()) {
      String region = regionField.getValueAsString();
      System.out.printf("Region: %s, confidence: %.2f%n",
        region, regionField.getConfidence());
    }
  }
}
}
}

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

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

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

    إذا كنت لا تستخدم Visual Studio Code، فتأكد من تثبيت ما يلي في بيئة التطوير الخاصة بك:

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

    تلميح

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

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

    ميزة معرف النموذج عنوان url المستند
    نموذج القراءة prebuilt-read عينة بحث موجزة
    نموذج تخطيط prebuilt-layout تأكيد حجز العينة
    نموذج استمارة W-2 prebuilt-tax.us.w2 نموذج W-2 نموذجي
    نموذج الفاتورة prebuilt-invoice نموذج الفاتورة
    نموذج الإيصال prebuilt-receipt نموذج الإيصال
    نموذج مستند المعرف prebuilt-idDocument مستندات المعرّف مسبقة الإنشاء
    نموذج بطاقة العمل prebuilt-businessCard عينة بطاقة العمل

تعيين متغيرات البيئة الخاصة بك

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

هام

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

لتعيين متغير البيئة لمفتاح مورد Document Intelligence، افتح نافذة وحدة تحكم، واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير. استبدل yourKey> وEndpoint>< بالقيم من المورد الخاص بك في مدخل Microsoft Azure.<

متغيرات البيئة في Windows غير حساسة لحالة الأحرف. عادة ما يتم الإعلان عنها بأحرف كبيرة، مع كلمات مرتبطة بتسطير أسفل السطر. في موجه الأوامر، قم بتشغيل الأوامر التالية:

  1. تعيين متغير المفتاح الخاص بك:

    setx DI_KEY <yourKey>
    
  2. تعيين متغير نقطة النهاية

    setx DI_ENDPOINT <yourEndpoint>
    
  3. أغلق نافذة موجه الأوامر بعد تعيين متغيرات البيئة الخاصة بك. تبقى القيم حتى تقوم بتغييرها مرة أخرى.

  4. أعد تشغيل أي برامج قيد التشغيل تقرأ متغير البيئة. على سبيل المثال، إذا كنت تستخدم Visual Studio أو Visual Studio Code كمحرر، فعد التشغيل قبل تشغيل نموذج التعليمات البرمجية.

فيما يلي بعض الأوامر الأكثر فائدة لاستخدامها مع متغيرات البيئة:

الأمر الإجراء مثال
setx VARIABLE_NAME= احذف متغير البيئة عن طريق تعيين القيمة إلى سلسلة فارغة. setx DI_KEY=
setx VARIABLE_NAME=value تعيين قيمة متغير بيئة أو تغييرها. setx DI_KEY=<yourKey>
set VARIABLE_NAME عرض قيمة متغير بيئة معين. set DI_KEY
set عرض كافة متغيرات البيئة. set

إعداد بيئة البرمجة

لإعداد بيئة البرمجة الخاصة بك، قم بإنشاء مشروع Gradle وتثبيت مكتبة العميل.

إنشاء مشروع Gradle

  1. في نافذة وحدة التحكم، أنشئ دليلا لتطبيقك يسمى form-recognizer-app وانتقل إليه.

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

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

  4. حدد Enter لقبول اسم المشروع الافتراضي، form-recognizer-app.

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

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

  1. قم بفتح ملف 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، قم بإنشاء مثيل للفئة DocumentAnalysisClient . للقيام بذلك، يمكنك إنشاء AzureKeyCredential باستخدام key من مدخل Microsoft Azure ومثيل DocumentAnalysisClient مع AzureKeyCredential و Document Intelligence endpointالخاص بك .

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

    mkdir -p src/main/java
    

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

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

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

    تلميح

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

  3. افتح ملف FormRecognizer.java وحدد أحد نماذج التعليمات البرمجية التالية وانسخ/الصق في التطبيق الخاص بك:

    • يقع نموذج القراءة المعد مسبقا في صميم جميع نماذج Document Intelligence ويمكنه اكتشاف الأسطر والكلمات والمواقع واللغات. يستخدم read التخطيط والمستند العام والنماذج المعدة مسبقا والمخصصة النموذج كأساس لاستخراج النصوص من المستندات.
    • يستخرج نموذج التخطيط الذي تم إنشاؤه مسبقا مواقع النص والنص والجداول وعلامات التحديد ومعلومات البنية من المستندات والصور.
    • يستخرج نموذج prebuilt-tax.us.w2 المعلومات التي تم الإبلاغ عنها في النماذج الضريبية لخدمة الإيرادات الداخلية الأمريكية (IRS).
    • يستخرج نموذج الفاتورة الذي تم إنشاؤه مسبقا الحقول الرئيسية وعناصر السطر من فواتير المبيعات بتنسيقات مختلفة.
    • يستخرج نموذج الإيصال مسبق الإنشاء المعلومات الرئيسية من إيصالات المبيعات المطبوعة والمكتوبة بخط اليد.
    • يستخرج نموذج idDocument الذي تم إنشاؤه مسبقا معلومات رئيسية من تراخيص سائقي الولايات المتحدة؛ صفحات سيرة ذاتية لجوازات السفر الدولية؛ معرفات الولايات الأمريكية؛ بطاقات الضمان الاجتماعي؛ وبطاقات المقيمين الدائمين.
  4. اكتب الأوامر التالية:

    gradle build
    gradle -PmainClass=FormRecognizer run
    

استخدام نموذج القراءة

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

  public static void main(final 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/rest-api/read.png";

String modelId = "prebuilt-read";

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

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

استخدام نموذج التخطيط

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

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

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

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.getSelectionMarkState().toString(),
      getBoundingCoordinates(documentSelectionMark.getBoundingPolygon()),
      documentSelectionMark.getConfidence()));
});

// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
  DocumentTable documentTables = tables.get(i);
  System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTables.getRowCount(),
    documentTables.getColumnCount());
  documentTables.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(", "));
}

}

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

استخدام نموذج المستند "عام"

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

//sample document
String generalDocumentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-document";
SyncPoller < OperationResult, AnalyzeResult > analyzeDocumentPoller =
  client.beginAnalyzeDocumentFromUrl(modelId, generalDocumentUrl);

AnalyzeResult analyzeResult = analyzeDocumentPoller.getFinalResult();

// pages
analyzeResult.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()));
});

// tables
List < DocumentTable > tab_les = analyzeResult.getTables();
for (int i = 0; i < tab_les.size(); i++) {
  DocumentTable documentTable = tab_les.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();
}

// Key-value pairs
analyzeResult.getKeyValuePairs().forEach(documentKeyValuePair -> {
  System.out.printf("Key content: %s%n", documentKeyValuePair.getKey().getContent());
  System.out.printf("Key content bounding region: %s%n",
    documentKeyValuePair.getKey().getBoundingRegions().toString());

  if (documentKeyValuePair.getValue() != null) {
    System.out.printf("Value content: %s%n", documentKeyValuePair.getValue().getContent());
    System.out.printf("Value content bounding region: %s%n", documentKeyValuePair.getValue().getBoundingRegions().toString());
  }
});

}

}

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

استخدام نموذج الضريبة W-2

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

// sample document
String w2Url = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png";
String modelId = "prebuilt-tax.us.w2";

SyncPoller < OperationResult, AnalyzeResult > analyzeW2Poller =
  client.beginAnalyzeDocumentFromUrl(modelId, w2Url);

AnalyzeResult analyzeTaxResult = analyzeW2Poller.getFinalResult();

for (int i = 0; i < analyzeTaxResult.getDocuments().size(); i++) {
  AnalyzedDocument analyzedTaxDocument = analyzeTaxResult.getDocuments().get(i);
  Map < String, DocumentField > taxFields = analyzedTaxDocument.getFields();
  System.out.printf("----------- Analyzing Document  %d -----------%n", i);
  DocumentField w2FormVariantField = taxFields.get("W2FormVariant");
  if (w2FormVariantField != null) {
    if (DocumentFieldType.STRING == w2FormVariantField.getType()) {
      String merchantName = w2FormVariantField.getValueAsString();
      System.out.printf("Form variant: %s, confidence: %.2f%n",
        merchantName, w2FormVariantField.getConfidence());
    }
  }

  DocumentField employeeField = taxFields.get("Employee");
  if (employeeField != null) {
    System.out.println("Employee Data: ");
    if (DocumentFieldType.MAP == employeeField.getType()) {
      Map < String, DocumentField > employeeDataFieldMap = employeeField.getValueAsMap();
      DocumentField employeeName = employeeDataFieldMap.get("Name");
      if (employeeName != null) {
        if (DocumentFieldType.STRING == employeeName.getType()) {
          String employeesName = employeeName.getValueAsString();
          System.out.printf("Employee Name: %s, confidence: %.2f%n",
            employeesName, employeeName.getConfidence());
        }
      }
      DocumentField employeeAddrField = employeeDataFieldMap.get("Address");
      if (employeeAddrField != null) {
        if (DocumentFieldType.STRING == employeeAddrField.getType()) {
          String employeeAddress = employeeAddrField.getValueAsString();
          System.out.printf("Employee Address: %s, confidence: %.2f%n",
            employeeAddress, employeeAddrField.getConfidence());
        }
      }
    }
  }

  DocumentField employerField = taxFields.get("Employer");
  if (employerField != null) {
    System.out.println("Employer Data: ");
    if (DocumentFieldType.MAP == employerField.getType()) {
      Map < String, DocumentField > employerDataFieldMap = employerField.getValueAsMap();
      DocumentField employerNameField = employerDataFieldMap.get("Name");
      if (employerNameField != null) {
        if (DocumentFieldType.STRING == employerNameField.getType()) {
          String employerName = employerNameField.getValueAsString();
          System.out.printf("Employer Name: %s, confidence: %.2f%n",
            employerName, employerNameField.getConfidence());
        }
      }

      DocumentField employerIDNumberField = employerDataFieldMap.get("IdNumber");
      if (employerIDNumberField != null) {
        if (DocumentFieldType.STRING == employerIDNumberField.getType()) {
          String employerIdNumber = employerIDNumberField.getValueAsString();
          System.out.printf("Employee ID Number: %s, confidence: %.2f%n",
            employerIdNumber, employerIDNumberField.getConfidence());
        }
      }
    }
  }

  DocumentField taxYearField = taxFields.get("TaxYear");
  if (taxYearField != null) {
    if (DocumentFieldType.STRING == taxYearField.getType()) {
      String taxYear = taxYearField.getValueAsString();
      System.out.printf("Tax year: %s, confidence: %.2f%n",
        taxYear, taxYearField.getConfidence());
    }
  }

  DocumentField taxDateField = taxFields.get("TaxDate");
  if (taxDateField != null) {
    if (DocumentFieldType.DATE == taxDateField.getType()) {
      LocalDate taxDate = taxDateField.getValueAsDate();
      System.out.printf("Tax Date: %s, confidence: %.2f%n",
        taxDate, taxDateField.getConfidence());
    }
  }

  DocumentField socialSecurityTaxField = taxFields.get("SocialSecurityTaxWithheld");
  if (socialSecurityTaxField != null) {
    if (DocumentFieldType.DOUBLE == socialSecurityTaxField.getType()) {
      Double socialSecurityTax = socialSecurityTaxField.getValueAsDouble();
      System.out.printf("Social Security Tax withheld: %.2f, confidence: %.2f%n",
        socialSecurityTax, socialSecurityTaxField.getConfidence());
    }
  }
}
}
}

قم بزيارة مستودع نماذج Azure على GitHub واعرض إخراج نموذج ضريبة W-2.

استخدام نموذج الفاتورة

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

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

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

AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult();

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

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

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

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

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

  DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
  if (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) -> {
          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());
            }
          }
        }));
    }
  }
}
}
}

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

استخدام نموذج الإيصال

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

String receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png";
String modelId = "prebuilt-receipt";

SyncPoller < OperationResult, AnalyzeResult > analyzeReceiptPoller =
  client.beginAnalyzeDocumentFromUrl(modelId, receiptUrl);

AnalyzeResult receiptResults = analyzeReceiptPoller.getFinalResult();

for (int i = 0; i < receiptResults.getDocuments().size(); i++) {
  AnalyzedDocument analyzedReceipt = receiptResults.getDocuments().get(i);
  Map < String, DocumentField > receiptFields = analyzedReceipt.getFields();
  System.out.printf("----------- Analyzing receipt info %d -----------%n", i);
  DocumentField merchantNameField = receiptFields.get("MerchantName");
  if (merchantNameField != null) {
    if (DocumentFieldType.STRING == merchantNameField.getType()) {
      String merchantName = merchantNameField.getValueAsString();
      System.out.printf("Merchant Name: %s, confidence: %.2f%n",
        merchantName, merchantNameField.getConfidence());
    }
  }

  DocumentField merchantPhoneNumberField = receiptFields.get("MerchantPhoneNumber");
  if (merchantPhoneNumberField != null) {
    if (DocumentFieldType.PHONE_NUMBER == merchantPhoneNumberField.getType()) {
      String merchantAddress = merchantPhoneNumberField.getValueAsPhoneNumber();
      System.out.printf("Merchant Phone number: %s, confidence: %.2f%n",
        merchantAddress, merchantPhoneNumberField.getConfidence());
    }
  }

  DocumentField merchantAddressField = receiptFields.get("MerchantAddress");
  if (merchantAddressField != null) {
    if (DocumentFieldType.STRING == merchantAddressField.getType()) {
      String merchantAddress = merchantAddressField.getValueAsString();
      System.out.printf("Merchant Address: %s, confidence: %.2f%n",
        merchantAddress, merchantAddressField.getConfidence());
    }
  }

  DocumentField transactionDateField = receiptFields.get("TransactionDate");
  if (transactionDateField != null) {
    if (DocumentFieldType.DATE == transactionDateField.getType()) {
      LocalDate transactionDate = transactionDateField.getValueAsDate();
      System.out.printf("Transaction Date: %s, confidence: %.2f%n",
        transactionDate, transactionDateField.getConfidence());
    }
  }

  DocumentField receiptItemsField = receiptFields.get("Items");
  if (receiptItemsField != null) {
    System.out.printf("Receipt Items: %n");
    if (DocumentFieldType.LIST == receiptItemsField.getType()) {
      List < DocumentField > receiptItems = receiptItemsField.getValueAsList();
      receiptItems.stream()
        .filter(receiptItem -> DocumentFieldType.MAP == receiptItem.getType())
        .map(documentField -> documentField.getValueAsMap())
        .forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
          if ("Name".equals(key)) {
            if (DocumentFieldType.STRING == documentField.getType()) {
              String name = documentField.getValueAsString();
              System.out.printf("Name: %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 ("Price".equals(key)) {
            if (DocumentFieldType.DOUBLE == documentField.getType()) {
              Double price = documentField.getValueAsDouble();
              System.out.printf("Price: %f, confidence: %.2f%n",
                price, documentField.getConfidence());
            }
          }
          if ("TotalPrice".equals(key)) {
            if (DocumentFieldType.DOUBLE == documentField.getType()) {
              Double totalPrice = documentField.getValueAsDouble();
              System.out.printf("Total Price: %f, confidence: %.2f%n",
                totalPrice, documentField.getConfidence());
            }
          }
        }));
    }
  }
}
}
}

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

استخدام نموذج مستند معرف

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

//sample document
String licenseUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png";
String modelId = "prebuilt-idDocument";

SyncPoller < OperationResult, AnalyzeResult > analyzeIdentityDocumentPoller = client.beginAnalyzeDocumentFromUrl(modelId, licenseUrl);

AnalyzeResult identityDocumentResults = analyzeIdentityDocumentPoller.getFinalResult();

for (int i = 0; i < identityDocumentResults.getDocuments().size(); i++) {
  AnalyzedDocument analyzedIDDocument = identityDocumentResults.getDocuments().get(i);
  Map < String, DocumentField > licenseFields = analyzedIDDocument.getFields();
  System.out.printf("----------- Analyzed license info for page %d -----------%n", i);
  DocumentField addressField = licenseFields.get("Address");
  if (addressField != null) {
    if (DocumentFieldType.STRING == addressField.getType()) {
      String address = addressField.getValueAsString();
      System.out.printf("Address: %s, confidence: %.2f%n",
        address, addressField.getConfidence());
    }
  }

  DocumentField countryRegionDocumentField = licenseFields.get("CountryRegion");
  if (countryRegionDocumentField != null) {
    if (DocumentFieldType.STRING == countryRegionDocumentField.getType()) {
      String countryRegion = countryRegionDocumentField.getValueAsCountry();
      System.out.printf("Country or region: %s, confidence: %.2f%n",
        countryRegion, countryRegionDocumentField.getConfidence());
    }
  }

  DocumentField dateOfBirthField = licenseFields.get("DateOfBirth");
  if (dateOfBirthField != null) {
    if (DocumentFieldType.DATE == dateOfBirthField.getType()) {
      LocalDate dateOfBirth = dateOfBirthField.getValueAsDate();
      System.out.printf("Date of Birth: %s, confidence: %.2f%n",
        dateOfBirth, dateOfBirthField.getConfidence());
    }
  }

  DocumentField dateOfExpirationField = licenseFields.get("DateOfExpiration");
  if (dateOfExpirationField != null) {
    if (DocumentFieldType.DATE == dateOfExpirationField.getType()) {
      LocalDate expirationDate = dateOfExpirationField.getValueAsDate();
      System.out.printf("Document date of expiration: %s, confidence: %.2f%n",
        expirationDate, dateOfExpirationField.getConfidence());
    }
  }

  DocumentField documentNumberField = licenseFields.get("DocumentNumber");
  if (documentNumberField != null) {
    if (DocumentFieldType.STRING == documentNumberField.getType()) {
      String documentNumber = documentNumberField.getValueAsString();
      System.out.printf("Document number: %s, confidence: %.2f%n",
        documentNumber, documentNumberField.getConfidence());
    }
  }

  DocumentField firstNameField = licenseFields.get("FirstName");
  if (firstNameField != null) {
    if (DocumentFieldType.STRING == firstNameField.getType()) {
      String firstName = firstNameField.getValueAsString();
      System.out.printf("First Name: %s, confidence: %.2f%n",
        firstName, documentNumberField.getConfidence());
    }
  }

  DocumentField lastNameField = licenseFields.get("LastName");
  if (lastNameField != null) {
    if (DocumentFieldType.STRING == lastNameField.getType()) {
      String lastName = lastNameField.getValueAsString();
      System.out.printf("Last name: %s, confidence: %.2f%n",
        lastName, lastNameField.getConfidence());
    }
  }

  DocumentField regionField = licenseFields.get("Region");
  if (regionField != null) {
    if (DocumentFieldType.STRING == regionField.getType()) {
      String region = regionField.getValueAsString();
      System.out.printf("Region: %s, confidence: %.2f%n",
        region, regionField.getConfidence());
    }
  }
}
}
}

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

استخدام نموذج بطاقة العمل

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 {
  //use your `key` and `endpoint` environment variables
  private static final String key = System.getenv("FR_KEY");
  private static final String endpoint = System.getenv("FR_ENDPOINT");

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

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

//sample document
String businessCardUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg";
String modelId = "prebuilt-businessCard";

SyncPoller < OperationResult, AnalyzeResult > analyzeBusinessCardPoller = client.beginAnalyzeDocumentFromUrl(modelId, businessCardUrl);

AnalyzeResult businessCardPageResults = analyzeBusinessCardPoller.getFinalResult();

for (int i = 0; i < businessCardPageResults.getDocuments().size(); i++) {
  System.out.printf("--------Analyzing business card %d -----------%n", i);
  AnalyzedDocument analyzedBusinessCard = businessCardPageResults.getDocuments().get(i);
  Map < String, DocumentField > businessCardFields = analyzedBusinessCard.getFields();
  DocumentField contactNamesDocumentField = businessCardFields.get("ContactNames");
  if (contactNamesDocumentField != null) {
    if (DocumentFieldType.LIST == contactNamesDocumentField.getType()) {
      List < DocumentField > contactNamesList = contactNamesDocumentField.getValueAsList();
      contactNamesList.stream()
        .filter(contactName -> DocumentFieldType.MAP == contactName.getType())
        .map(contactName -> {
          System.out.printf("Contact name: %s%n", contactName.getContent());
          return contactName.getValueAsMap();
        })
        .forEach(contactNamesMap -> contactNamesMap.forEach((key, contactName) -> {
          if ("FirstName".equals(key)) {
            if (DocumentFieldType.STRING == contactName.getType()) {
              String firstName = contactName.getValueAsString();
              System.out.printf("\tFirst Name: %s, confidence: %.2f%n",
                firstName, contactName.getConfidence());
            }
          }
          if ("LastName".equals(key)) {
            if (DocumentFieldType.STRING == contactName.getType()) {
              String lastName = contactName.getValueAsString();
              System.out.printf("\tLast Name: %s, confidence: %.2f%n",
                lastName, contactName.getConfidence());
            }
          }
        }));
    }
  }

  DocumentField jobTitles = businessCardFields.get("JobTitles");
  if (jobTitles != null) {
    if (DocumentFieldType.LIST == jobTitles.getType()) {
      List < DocumentField > jobTitlesItems = jobTitles.getValueAsList();
      jobTitlesItems.forEach(jobTitlesItem -> {
        if (DocumentFieldType.STRING == jobTitlesItem.getType()) {
          String jobTitle = jobTitlesItem.getValueAsString();
          System.out.printf("Job Title: %s, confidence: %.2f%n",
            jobTitle, jobTitlesItem.getConfidence());
        }
      });
    }
  }

  DocumentField departments = businessCardFields.get("Departments");
  if (departments != null) {
    if (DocumentFieldType.LIST == departments.getType()) {
      List < DocumentField > departmentsItems = departments.getValueAsList();
      departmentsItems.forEach(departmentsItem -> {
        if (DocumentFieldType.STRING == departmentsItem.getType()) {
          String department = departmentsItem.getValueAsString();
          System.out.printf("Department: %s, confidence: %.2f%n",
            department, departmentsItem.getConfidence());
        }
      });
    }
  }

  DocumentField emails = businessCardFields.get("Emails");
  if (emails != null) {
    if (DocumentFieldType.LIST == emails.getType()) {
      List < DocumentField > emailsItems = emails.getValueAsList();
      emailsItems.forEach(emailsItem -> {
        if (DocumentFieldType.STRING == emailsItem.getType()) {
          String email = emailsItem.getValueAsString();
          System.out.printf("Email: %s, confidence: %.2f%n", email, emailsItem.getConfidence());
        }
      });
    }
  }

  DocumentField websites = businessCardFields.get("Websites");
  if (websites != null) {
    if (DocumentFieldType.LIST == websites.getType()) {
      List < DocumentField > websitesItems = websites.getValueAsList();
      websitesItems.forEach(websitesItem -> {
        if (DocumentFieldType.STRING == websitesItem.getType()) {
          String website = websitesItem.getValueAsString();
          System.out.printf("Web site: %s, confidence: %.2f%n",
            website, websitesItem.getConfidence());
        }
      });
    }
  }

  DocumentField mobilePhones = businessCardFields.get("MobilePhones");
  if (mobilePhones != null) {
    if (DocumentFieldType.LIST == mobilePhones.getType()) {
      List < DocumentField > mobilePhonesItems = mobilePhones.getValueAsList();
      mobilePhonesItems.forEach(mobilePhonesItem -> {
        if (DocumentFieldType.PHONE_NUMBER == mobilePhonesItem.getType()) {
          String mobilePhoneNumber = mobilePhonesItem.getValueAsPhoneNumber();
          System.out.printf("Mobile phone number: %s, confidence: %.2f%n",
            mobilePhoneNumber, mobilePhonesItem.getConfidence());
        }
      });
    }
  }

  DocumentField otherPhones = businessCardFields.get("OtherPhones");
  if (otherPhones != null) {
    if (DocumentFieldType.LIST == otherPhones.getType()) {
      List < DocumentField > otherPhonesItems = otherPhones.getValueAsList();
      otherPhonesItems.forEach(otherPhonesItem -> {
        if (DocumentFieldType.PHONE_NUMBER == otherPhonesItem.getType()) {
          String otherPhoneNumber = otherPhonesItem.getValueAsPhoneNumber();
          System.out.printf("Other phone number: %s, confidence: %.2f%n",
            otherPhoneNumber, otherPhonesItem.getConfidence());
        }
      });
    }
  }

  DocumentField faxes = businessCardFields.get("Faxes");
  if (faxes != null) {
    if (DocumentFieldType.LIST == faxes.getType()) {
      List < DocumentField > faxesItems = faxes.getValueAsList();
      faxesItems.forEach(faxesItem -> {
        if (DocumentFieldType.PHONE_NUMBER == faxesItem.getType()) {
          String faxPhoneNumber = faxesItem.getValueAsPhoneNumber();
          System.out.printf("Fax phone number: %s, confidence: %.2f%n",
            faxPhoneNumber, faxesItem.getConfidence());
        }
      });
    }
  }

  DocumentField addresses = businessCardFields.get("Addresses");
  if (addresses != null) {
    if (DocumentFieldType.LIST == addresses.getType()) {
      List < DocumentField > addressesItems = addresses.getValueAsList();
      addressesItems.forEach(addressesItem -> {
        if (DocumentFieldType.STRING == addressesItem.getType()) {
          String address = addressesItem.getValueAsString();
          System.out
            .printf("Address: %s, confidence: %.2f%n", address, addressesItem.getConfidence());
        }
      });
    }
  }

  DocumentField companyName = businessCardFields.get("CompanyNames");
  if (companyName != null) {
    if (DocumentFieldType.LIST == companyName.getType()) {
      List < DocumentField > companyNameItems = companyName.getValueAsList();
      companyNameItems.forEach(companyNameItem -> {
        if (DocumentFieldType.STRING == companyNameItem.getType()) {
          String companyNameValue = companyNameItem.getValueAsString();
          System.out.printf("Company name: %s, confidence: %.2f%n", companyNameValue,
            companyNameItem.getConfidence());
        }
      });
    }
  }
}
}
}

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

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

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

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

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

    تلميح

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

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

    ميزة معرف النموذج عنوان url المستند
    نموذج القراءة prebuilt-read عينة بحث موجزة
    نموذج تخطيط prebuilt-layout تأكيد حجز العينة
    نموذج استمارة W-2 prebuilt-tax.us.w2 نموذج W-2 نموذجي
    نموذج الفاتورة prebuilt-invoice نموذج الفاتورة
    نموذج الإيصال prebuilt-receipt نموذج الإيصال
    نموذج مستند المعرف prebuilt-idDocument مستندات المعرّف مسبقة الإنشاء

تعيين متغيرات البيئة الخاصة بك

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

هام

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

لتعيين متغير البيئة لمفتاح مورد Document Intelligence، افتح نافذة وحدة تحكم، واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير. استبدل yourKey> وEndpoint>< بالقيم من المورد الخاص بك في مدخل Microsoft Azure.<

متغيرات البيئة في Windows غير حساسة لحالة الأحرف. عادة ما يتم الإعلان عنها بأحرف كبيرة، مع كلمات مرتبطة بتسطير أسفل السطر. في موجه الأوامر، قم بتشغيل الأوامر التالية:

  1. تعيين متغير المفتاح الخاص بك:

    setx DI_KEY <yourKey>
    
  2. تعيين متغير نقطة النهاية

    setx DI_ENDPOINT <yourEndpoint>
    
  3. أغلق نافذة موجه الأوامر بعد تعيين متغيرات البيئة الخاصة بك. تبقى القيم حتى تقوم بتغييرها مرة أخرى.

  4. أعد تشغيل أي برامج قيد التشغيل تقرأ متغير البيئة. على سبيل المثال، إذا كنت تستخدم Visual Studio أو Visual Studio Code كمحرر، فعد التشغيل قبل تشغيل نموذج التعليمات البرمجية.

فيما يلي بعض الأوامر الأكثر فائدة لاستخدامها مع متغيرات البيئة:

الأمر الإجراء مثال
setx VARIABLE_NAME= احذف متغير البيئة عن طريق تعيين القيمة إلى سلسلة فارغة. setx DI_KEY=
setx VARIABLE_NAME=value تعيين قيمة متغير بيئة أو تغييرها. setx DI_KEY=<yourKey>
set VARIABLE_NAME عرض قيمة متغير بيئة معين. set DI_KEY
set عرض كافة متغيرات البيئة. set

إعداد بيئة البرمجة

إنشاء تطبيق Node.js Express.

  1. في نافذة وحدة التحكم، قم بإنشاء دليل جديد لتطبيقك المسمى doc-intel-appوانتقل إليه .

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

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

    • تمثل أهم السمات الاسم ورقم الإصدار ونقطة الدخول.
    • نوصي بالاحتفاظ index.js باسم نقطة الإدخال. الوصف والأمر الاختباري ومستودع GitHub والكلمات الأساسية والكاتب ومعلومات الترخيص هي سمات اختيارية. يمكنك تخطيها لهذا المشروع.
    • حدد Enter لقبول الاقتراحات بين أقواس.

    بعد إكمال المطالبات، يقوم الأمر بإنشاء package.json ملف في دليل doc-intel-app.

  4. ثبت مكتبة العميل ai-document-intelligence وazure/identityحزم npm:

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

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

  1. إنشاء ملف باسم index.js في دليل التطبيق.

    تلميح

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

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

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

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

  • يقع نموذج القراءة المعد مسبقا في صميم جميع نماذج Document Intelligence ويمكنه اكتشاف الأسطر والكلمات والمواقع واللغات. يستخدم read التخطيط والمستند العام والنماذج المعدة مسبقا والمخصصة النموذج كأساس لاستخراج النصوص من المستندات.
  • يستخرج نموذج التخطيط الذي تم إنشاؤه مسبقا مواقع النص والنص والجداول وعلامات التحديد ومعلومات البنية من المستندات والصور.
  • يستخرج نموذج prebuilt-tax.us.w2 المعلومات التي تم الإبلاغ عنها في النماذج الضريبية لخدمة الإيرادات الداخلية الأمريكية (IRS).
  • يستخرج نموذج الفاتورة الذي تم إنشاؤه مسبقا المعلومات التي تم الإبلاغ عنها في نماذج ضريبة "خدمة الإيرادات الداخلية الأمريكية".
  • يستخرج نموذج الإيصال مسبق الإنشاء المعلومات الرئيسية من إيصالات المبيعات المطبوعة والمكتوبة بخط اليد.
  • يستخرج نموذج idDocument الذي تم إنشاؤه مسبقا معلومات رئيسية من تراخيص سائقي الولايات المتحدة؛ صفحات سيرة ذاتية لجوازات السفر الدولية؛ معرفات الولايات الأمريكية؛ بطاقات الضمان الاجتماعي؛ وبطاقات المقيمين الدائمين.

استخدام نموذج القراءة

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

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

// sample document
const documentUrlRead = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png"

// helper function
function* getTextOfSpans(content, spans) {
    for (const span of spans) {
        yield content.slice(span.offset, span.offset + span.length);
    }
}

async function main() {
    // create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
    const client = DocumentIntelligence(endpoint, new AzureKeyCredential(key));
    const poller = await client.beginAnalyzeDocument("prebuilt-read", documentUrlRead);

    const {
        content,
        pages,
        languages,
        styles
    } = 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.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 (languages.length <= 0) {
        console.log("No language spans were extracted from the document.");
    } else {
        console.log("Languages:");
        for (const languageEntry of languages) {
            console.log(
                `- Found language: ${languageEntry.languageCode} (confidence: ${languageEntry.confidence})`
            );
            for (const text of getTextOfSpans(content, languageEntry.spans)) {
                const escapedText = text.replace(/\r?\n/g, "\\n").replace(/"/g, '\\"');
                console.log(`  - "${escapedText}"`);
            }
        }
    }

    if (styles.length <= 0) {
        console.log("No text styles were extracted from the document.");
    } else {
        console.log("Styles:");
        for (const style of styles) {
            console.log(
                `- Handwritten: ${style.isHandwritten ? "yes" : "no"} (confidence=${style.confidence})`
            );

            for (const word of getTextOfSpans(content, style.spans)) {
                console.log(`  - "${word}"`);
            }
        }
    }
}

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

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

استخدام نموذج التخطيط

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

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

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

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

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

    // Layout extraction produces basic elements such as pages, words, lines, etc. as well as information about the
    // appearance (styles) of textual elements.
    const { pages, tables } = await poller.pollUntilDone();

    if (!pages || 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 && page.lines.length} lines, ${page.words && 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 || 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);
  });

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

استخدام نموذج المستند "عام"

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

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

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

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

    const poller = await client.beginAnalyzeDocument("prebuilt-document", documentUrl);

    const {
        keyValuePairs
    } = await poller.pollUntilDone();

    if (!keyValuePairs || keyValuePairs.length <= 0) {
        console.log("No key-value pairs were extracted from the document.");
    } else {
        console.log("Key-Value Pairs:");
        for (const {
                key,
                value,
                confidence
            } of keyValuePairs) {
            console.log("- Key  :", `"${key.content}"`);
            console.log("  Value:", `"${(value && value.content) || "<undefined>"}" (${confidence})`);
        }
    }

}

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

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

استخدام نموذج الضريبة W-2

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

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

const w2DocumentURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png"

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

 const poller = await client.beginAnalyzeDocument("prebuilt-tax.us.w2", w2DocumentURL);

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

  if (result) {
    const { Employee, Employer, ControlNumber, TaxYear, AdditionalInfo } = result.fields;

    if (Employee) {
      const { Name, Address, SocialSecurityNumber } = Employee.properties;
      console.log("Employee:");
      console.log("  Name:", Name && Name.content);
      console.log("  SSN/TIN:", SocialSecurityNumber && SocialSecurityNumber.content);
      if (Address && Address.value) {
        const { streetAddress, postalCode } = Address.value;
        console.log("  Address:");
        console.log("    Street Address:", streetAddress);
        console.log("    Postal Code:", postalCode);
      }
    } else {
      console.log("No employee information extracted.");
    }

    if (Employer) {
      const { Name, Address, IdNumber } = Employer.properties;
      console.log("Employer:");
      console.log("  Name:", Name && Name.content);
      console.log("  ID (EIN):", IdNumber && IdNumber.content);

      if (Address && Address.value) {
        const { streetAddress, postalCode } = Address.value;
        console.log("  Address:");
        console.log("    Street Address:", streetAddress);
        console.log("    Postal Code:", postalCode);
      }
    } else {
      console.log("No employer information extracted.");
    }

    console.log("Control Number:", ControlNumber && ControlNumber.content);
    console.log("Tax Year:", TaxYear && TaxYear.content);

    if (AdditionalInfo) {
      console.log("Additional Info:");

      for (const info of AdditionalInfo.values) {
        const { LetterCode, Amount } = info.properties;
        console.log(`- ${LetterCode && LetterCode.content}: ${Amount && Amount.content}`);
      }
    }
  } else {
    throw new Error("Expected at least one document in the result.");
  }
}

main().catch((error) => {
  console.error(error);
  process.exit(1);
});

قم بزيارة مستودع نماذج Azure على GitHub واعرض إخراج نموذج ضريبة W-2.

استخدام نموذج الفاتورة

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

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

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

async function main() {

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

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

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

  if (result) {
      const invoice = result.fields;

      console.log("Vendor Name:", invoice.VendorName?.content);
      console.log("Customer Name:", invoice.CustomerName?.content);
      console.log("Invoice Date:", invoice.InvoiceDate?.content);
      console.log("Due Date:", invoice.DueDate?.content);

      console.log("Items:");
      for (const {
              properties: item
          } of invoice.Items?.values ?? []) {
          console.log("-", item.ProductCode?.content ?? "<no product code>");
          console.log("  Description:", item.Description?.content);
          console.log("  Quantity:", item.Quantity?.content);
          console.log("  Date:", item.Date?.content);
          console.log("  Unit:", item.Unit?.content);
          console.log("  Unit Price:", item.UnitPrice?.content);
          console.log("  Tax:", item.Tax?.content);
          console.log("  Amount:", item.Amount?.content);
      }

      console.log("Subtotal:", invoice.SubTotal?.content);
      console.log("Previous Unpaid Balance:", invoice.PreviousUnpaidBalance?.content);
      console.log("Tax:", invoice.TotalTax?.content);
      console.log("Amount Due:", invoice.AmountDue?.content);
  } else {
      throw new Error("Expected at least one receipt in the result.");
  }
}

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

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

استخدام نموذج الإيصال

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

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

// sample url
const receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png";

async function main() {

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

    const poller = await client.beginAnalyzeDocument("prebuilt-receipt", receiptUrl);

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

    if (result) {
        const {
            MerchantName,
            Items,
            Total
        } = result.fields;

        console.log("=== Receipt Information ===");
        console.log("Type:", result.docType);
        console.log("Merchant:", MerchantName && MerchantName.content);

        console.log("Items:");
        for (const item of (Items && Items.values) || []) {
            const {
                Description,
                TotalPrice
            } = item.properties;

            console.log("- Description:", Description && Description.content);
            console.log("  Total Price:", TotalPrice && TotalPrice.content);
        }

        console.log("Total:", Total && Total.content);
    } else {
        throw new Error("Expected at least one receipt in the result.");
    }

}

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

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

استخدام نموذج مستند معرف

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

//use your `key` and `endpoint` environment variables
const key = process.env['DI_KEY'];
const endpoint = process.env['DI_ENDPOINT'];

// sample document
const idDocumentURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png"

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

 const poller = await client.beginAnalyzeDocument("prebuilt-idDocument", idDocumentURL);

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

  if (result) {
// The identity document model has multiple document types, so we need to know which document type was actually
    extracted.
    if (result.docType === "idDocument.driverLicense") {
      const { FirstName, LastName, DocumentNumber, DateOfBirth, DateOfExpiration, Height, Weight, EyeColor, Endorsements, Restrictions, VehicleClassifications} = result.fields;

// For the sake of the example, we'll only show a few of the fields that are produced.
      console.log("Extracted a Driver License:");
      console.log("  Name:", FirstName && FirstName.content, LastName && LastName.content);
      console.log("  License No.:", DocumentNumber && DocumentNumber.content);
      console.log("  Date of Birth:", DateOfBirth && DateOfBirth.content);
      console.log("  Expiration:", DateOfExpiration && DateOfExpiration.content);
      console.log("  Height:", Height && Height.content);
      console.log("  Weight:", Weight && Weight.content);
      console.log("  Eye color:", EyeColor && EyeColor.content);
      console.log("  Restrictions:", Restrictions && Restrictions.content);
      console.log("  Endorsements:", Endorsements && Endorsements.content);
      console.log("  Class:", VehicleClassifications && VehicleClassifications.content);
    } else if (result.docType === "idDocument.passport") {
// The passport document type extracts and parses the Passport's machine-readable zone
      if (!result.fields.machineReadableZone) {
        throw new Error("No Machine Readable Zone extracted from passport.");
      }

      const {
        FirstName,
        LastName,
        DateOfBirth,
        Nationality,
        DocumentNumber,
        CountryRegion,
        DateOfExpiration,
      } = result.fields.machineReadableZone.properties;

      console.log("Extracted a Passport:");
      console.log("  Name:", FirstName && FirstName.content, LastName && LastName.content);
      console.log("  Date of Birth:", DateOfBirth && DateOfBirth.content);
      console.log("  Nationality:", Nationality && Nationality.content);
      console.log("  Passport No.:", DocumentNumber && DocumentNumber.content);
      console.log("  Issuer:", CountryRegion && CountryRegion.content);
      console.log("  Expiration Date:", DateOfExpiration && DateOfExpiration.content);
    } else {
// The only reason this would happen is if the client library's schema for the prebuilt identity document model is
      out of date, and a new document type has been introduced.
      console.error("Unknown document type in result:", result);
    }
  } else {
    throw new Error("Expected at least one receipt in the result.");
  }
}

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

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

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

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

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

    تلميح

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

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

    ميزة معرف النموذج عنوان url المستند
    نموذج القراءة prebuilt-read عينة بحث موجزة
    نموذج تخطيط prebuilt-layout تأكيد حجز العينة
    نموذج استمارة W-2 prebuilt-tax.us.w2 نموذج W-2 نموذجي
    نموذج الفاتورة prebuilt-invoice نموذج الفاتورة
    نموذج الإيصال prebuilt-receipt نموذج الإيصال
    نموذج مستند المعرف prebuilt-idDocument مستندات المعرّف مسبقة الإنشاء
    نموذج بطاقة العمل prebuilt-businessCard عينة بطاقة العمل

تعيين متغيرات البيئة الخاصة بك

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

هام

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

لتعيين متغير البيئة لمفتاح مورد Document Intelligence، افتح نافذة وحدة تحكم، واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير. استبدل yourKey> وEndpoint>< بالقيم من المورد الخاص بك في مدخل Microsoft Azure.<

متغيرات البيئة في Windows غير حساسة لحالة الأحرف. عادة ما يتم الإعلان عنها بأحرف كبيرة، مع كلمات مرتبطة بتسطير أسفل السطر. في موجه الأوامر، قم بتشغيل الأوامر التالية:

  1. تعيين متغير المفتاح الخاص بك:

    setx DI_KEY <yourKey>
    
  2. تعيين متغير نقطة النهاية

    setx DI_ENDPOINT <yourEndpoint>
    
  3. أغلق نافذة موجه الأوامر بعد تعيين متغيرات البيئة الخاصة بك. تبقى القيم حتى تقوم بتغييرها مرة أخرى.

  4. أعد تشغيل أي برامج قيد التشغيل تقرأ متغير البيئة. على سبيل المثال، إذا كنت تستخدم Visual Studio أو Visual Studio Code كمحرر، فعد التشغيل قبل تشغيل نموذج التعليمات البرمجية.

فيما يلي بعض الأوامر الأكثر فائدة لاستخدامها مع متغيرات البيئة:

الأمر الإجراء مثال
setx VARIABLE_NAME= احذف متغير البيئة عن طريق تعيين القيمة إلى سلسلة فارغة. setx DI_KEY=
setx VARIABLE_NAME=value تعيين قيمة متغير بيئة أو تغييرها. setx DI_KEY=<yourKey>
set VARIABLE_NAME عرض قيمة متغير بيئة معين. set DI_KEY
set عرض كافة متغيرات البيئة. set

إعداد بيئة البرمجة

إنشاء تطبيق Node.js Express.

  1. في نافذة وحدة التحكم، قم بإنشاء دليل جديد لتطبيقك المسمى form-recognizer-appوانتقل إليه .

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

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

    • تمثل أهم السمات الاسم ورقم الإصدار ونقطة الدخول.
    • نوصي بالاحتفاظ index.js باسم نقطة الإدخال. الوصف والأمر الاختباري ومستودع GitHub والكلمات الأساسية والكاتب ومعلومات الترخيص هي سمات اختيارية. يمكنك تخطيها لهذا المشروع.
    • حدد Enter لقبول الاقتراحات بين أقواس.

    بعد إكمال المطالبات، يقوم الأمر بإنشاء package.json ملف في دليل form-recognizer-app .

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

    npm i @azure/ai-form-recognizer @azure/identity
    

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

  1. إنشاء ملف باسم index.js في دليل التطبيق.

    تلميح

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

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

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

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

  • يقع نموذج القراءة المعد مسبقا في صميم جميع نماذج Document Intelligence ويمكنه اكتشاف الأسطر والكلمات والمواقع واللغات. يستخدم read التخطيط والمستند العام والنماذج المعدة مسبقا والمخصصة النموذج كأساس لاستخراج النصوص من المستندات.
  • يستخرج نموذج التخطيط الذي تم إنشاؤه مسبقا مواقع النص والنص والجداول وعلامات التحديد ومعلومات البنية من المستندات والصور.
  • يستخرج نموذج prebuilt-tax.us.w2 المعلومات التي تم الإبلاغ عنها في النماذج الضريبية لخدمة الإيرادات الداخلية الأمريكية (IRS).
  • يستخرج نموذج الفاتورة الذي تم إنشاؤه مسبقا المعلومات التي تم الإبلاغ عنها في نماذج ضريبة "خدمة الإيرادات الداخلية الأمريكية".
  • يستخرج نموذج الإيصال مسبق الإنشاء المعلومات الرئيسية من إيصالات المبيعات المطبوعة والمكتوبة بخط اليد.
  • يستخرج نموذج idDocument الذي تم إنشاؤه مسبقا معلومات رئيسية من تراخيص سائقي الولايات المتحدة؛ صفحات سيرة ذاتية لجوازات السفر الدولية؛ معرفات الولايات الأمريكية؛ بطاقات الضمان الاجتماعي؛ وبطاقات المقيمين الدائمين.

استخدام نموذج القراءة

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

// sample document
const documentUrlRead = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png"

// helper function
function* getTextOfSpans(content, spans) {
    for (const span of spans) {
        yield content.slice(span.offset, span.offset + span.length);
    }
}

async function main() {
    // create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));
    const poller = await client.beginAnalyzeDocument("prebuilt-read", documentUrlRead);

    const {
        content,
        pages,
        languages,
        styles
    } = 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.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 (languages.length <= 0) {
        console.log("No language spans were extracted from the document.");
    } else {
        console.log("Languages:");
        for (const languageEntry of languages) {
            console.log(
                `- Found language: ${languageEntry.languageCode} (confidence: ${languageEntry.confidence})`
            );
            for (const text of getTextOfSpans(content, languageEntry.spans)) {
                const escapedText = text.replace(/\r?\n/g, "\\n").replace(/"/g, '\\"');
                console.log(`  - "${escapedText}"`);
            }
        }
    }

    if (styles.length <= 0) {
        console.log("No text styles were extracted from the document.");
    } else {
        console.log("Styles:");
        for (const style of styles) {
            console.log(
                `- Handwritten: ${style.isHandwritten ? "yes" : "no"} (confidence=${style.confidence})`
            );

            for (const word of getTextOfSpans(content, style.spans)) {
                console.log(`  - "${word}"`);
            }
        }
    }
}

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

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

استخدام نموذج التخطيط

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

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

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

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

    // Layout extraction produces basic elements such as pages, words, lines, etc. as well as information about the
    // appearance (styles) of textual elements.
    const { pages, tables } = await poller.pollUntilDone();

    if (!pages || 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 && page.lines.length} lines, ${page.words && 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 || 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);
  });

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

استخدام نموذج المستند "عام"

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

// sample document
const documentUrl = "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-document", documentUrl);

    const {
        keyValuePairs
    } = await poller.pollUntilDone();

    if (!keyValuePairs || keyValuePairs.length <= 0) {
        console.log("No key-value pairs were extracted from the document.");
    } else {
        console.log("Key-Value Pairs:");
        for (const {
                key,
                value,
                confidence
            } of keyValuePairs) {
            console.log("- Key  :", `"${key.content}"`);
            console.log("  Value:", `"${(value && value.content) || "<undefined>"}" (${confidence})`);
        }
    }

}

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

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

استخدام نموذج الضريبة W-2

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

const w2DocumentURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png"

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

 const poller = await client.beginAnalyzeDocument("prebuilt-tax.us.w2", w2DocumentURL);

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

  if (result) {
    const { Employee, Employer, ControlNumber, TaxYear, AdditionalInfo } = result.fields;

    if (Employee) {
      const { Name, Address, SocialSecurityNumber } = Employee.properties;
      console.log("Employee:");
      console.log("  Name:", Name && Name.content);
      console.log("  SSN/TIN:", SocialSecurityNumber && SocialSecurityNumber.content);
      if (Address && Address.value) {
        const { streetAddress, postalCode } = Address.value;
        console.log("  Address:");
        console.log("    Street Address:", streetAddress);
        console.log("    Postal Code:", postalCode);
      }
    } else {
      console.log("No employee information extracted.");
    }

    if (Employer) {
      const { Name, Address, IdNumber } = Employer.properties;
      console.log("Employer:");
      console.log("  Name:", Name && Name.content);
      console.log("  ID (EIN):", IdNumber && IdNumber.content);

      if (Address && Address.value) {
        const { streetAddress, postalCode } = Address.value;
        console.log("  Address:");
        console.log("    Street Address:", streetAddress);
        console.log("    Postal Code:", postalCode);
      }
    } else {
      console.log("No employer information extracted.");
    }

    console.log("Control Number:", ControlNumber && ControlNumber.content);
    console.log("Tax Year:", TaxYear && TaxYear.content);

    if (AdditionalInfo) {
      console.log("Additional Info:");

      for (const info of AdditionalInfo.values) {
        const { LetterCode, Amount } = info.properties;
        console.log(`- ${LetterCode && LetterCode.content}: ${Amount && Amount.content}`);
      }
    }
  } else {
    throw new Error("Expected at least one document in the result.");
  }
}

main().catch((error) => {
  console.error(error);
  process.exit(1);
});

قم بزيارة مستودع نماذج Azure على GitHub واعرض إخراج نموذج ضريبة W-2.

استخدام نموذج الفاتورة

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

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

async function main() {

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

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

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

  if (result) {
      const invoice = result.fields;

      console.log("Vendor Name:", invoice.VendorName?.content);
      console.log("Customer Name:", invoice.CustomerName?.content);
      console.log("Invoice Date:", invoice.InvoiceDate?.content);
      console.log("Due Date:", invoice.DueDate?.content);

      console.log("Items:");
      for (const {
              properties: item
          } of invoice.Items?.values ?? []) {
          console.log("-", item.ProductCode?.content ?? "<no product code>");
          console.log("  Description:", item.Description?.content);
          console.log("  Quantity:", item.Quantity?.content);
          console.log("  Date:", item.Date?.content);
          console.log("  Unit:", item.Unit?.content);
          console.log("  Unit Price:", item.UnitPrice?.content);
          console.log("  Tax:", item.Tax?.content);
          console.log("  Amount:", item.Amount?.content);
      }

      console.log("Subtotal:", invoice.SubTotal?.content);
      console.log("Previous Unpaid Balance:", invoice.PreviousUnpaidBalance?.content);
      console.log("Tax:", invoice.TotalTax?.content);
      console.log("Amount Due:", invoice.AmountDue?.content);
  } else {
      throw new Error("Expected at least one receipt in the result.");
  }
}

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

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

استخدام نموذج الإيصال

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

// sample url
const receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png";

async function main() {

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

    const poller = await client.beginAnalyzeDocument("prebuilt-receipt", receiptUrl);

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

    if (result) {
        const {
            MerchantName,
            Items,
            Total
        } = result.fields;

        console.log("=== Receipt Information ===");
        console.log("Type:", result.docType);
        console.log("Merchant:", MerchantName && MerchantName.content);

        console.log("Items:");
        for (const item of (Items && Items.values) || []) {
            const {
                Description,
                TotalPrice
            } = item.properties;

            console.log("- Description:", Description && Description.content);
            console.log("  Total Price:", TotalPrice && TotalPrice.content);
        }

        console.log("Total:", Total && Total.content);
    } else {
        throw new Error("Expected at least one receipt in the result.");
    }

}

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

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

استخدام نموذج مستند معرف

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

// sample document
const idDocumentURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png"

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

 const poller = await client.beginAnalyzeDocument("prebuilt-idDocument", idDocumentURL);

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

  if (result) {
// The identity document model has multiple document types, so we need to know which document type was actually
    extracted.
    if (result.docType === "idDocument.driverLicense") {
      const { FirstName, LastName, DocumentNumber, DateOfBirth, DateOfExpiration, Height, Weight, EyeColor, Endorsements, Restrictions, VehicleClassifications} = result.fields;

// For the sake of the example, we'll only show a few of the fields that are produced.
      console.log("Extracted a Driver License:");
      console.log("  Name:", FirstName && FirstName.content, LastName && LastName.content);
      console.log("  License No.:", DocumentNumber && DocumentNumber.content);
      console.log("  Date of Birth:", DateOfBirth && DateOfBirth.content);
      console.log("  Expiration:", DateOfExpiration && DateOfExpiration.content);
      console.log("  Height:", Height && Height.content);
      console.log("  Weight:", Weight && Weight.content);
      console.log("  Eye color:", EyeColor && EyeColor.content);
      console.log("  Restrictions:", Restrictions && Restrictions.content);
      console.log("  Endorsements:", Endorsements && Endorsements.content);
      console.log("  Class:", VehicleClassifications && VehicleClassifications.content);
    } else if (result.docType === "idDocument.passport") {
// The passport document type extracts and parses the Passport's machine-readable zone
      if (!result.fields.machineReadableZone) {
        throw new Error("No Machine Readable Zone extracted from passport.");
      }

      const {
        FirstName,
        LastName,
        DateOfBirth,
        Nationality,
        DocumentNumber,
        CountryRegion,
        DateOfExpiration,
      } = result.fields.machineReadableZone.properties;

      console.log("Extracted a Passport:");
      console.log("  Name:", FirstName && FirstName.content, LastName && LastName.content);
      console.log("  Date of Birth:", DateOfBirth && DateOfBirth.content);
      console.log("  Nationality:", Nationality && natiNationalityonality.content);
      console.log("  Passport No.:", DocumentNumber && DocumentNumber.content);
      console.log("  Issuer:", CountryRegion && CountryRegion.content);
      console.log("  Expiration Date:", DateOfExpiration && DateOfExpiration.content);
    } else {
// The only reason this would happen is if the client library's schema for the prebuilt identity document model is
      out of date, and a new document type has been introduced.
      console.error("Unknown document type in result:", result);
    }
  } else {
    throw new Error("Expected at least one receipt in the result.");
  }
}

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

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

استخدام نموذج بطاقة العمل

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

//use your `key` and `endpoint` environment variables
const key = process.env['FR_KEY'];
const endpoint = process.env['FR_ENDPOINT'];

// sample document
const businessCardURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg"

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

    const poller = await client.beginAnalyzeDocument("prebuilt-businessCard", businessCardURL);

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

    if (result) {
        const businessCard = result.fields;
        console.log("=== Business Card Information ===");

        // There are more fields than just these few, and the model allows for multiple contact & company names as well as
        // phone numbers, though we'll only show the first extracted values here.
        const name = businessCard.ContactNames && businessCard.ContactNames.values[0];
        if (name) {
            const {
                FirstName,
                LastName
            } = name.properties;
            console.log("Name:", FirstName && FirstName.content, LastName && LastName.content);
        }

        const company = businessCard.CompanyNames && businessCard.CompanyNames.values[0];
        if (company) {
            console.log("Company:", company.content);
        }

        const address = businessCard.Addresses && businessCard.Addresses.values[0];
        if (address) {
            console.log("Address:", address.content);
        }
        const jobTitle = businessCard.JobTitles && businessCard.JobTitles.values[0];
        if (jobTitle) {
            console.log("Job title:", jobTitle.content);
        }
        const department = businessCard.Departments && businessCard.Departments.values[0];
        if (department) {
            console.log("Department:", department.content);
        }
        const email = businessCard.Emails && businessCard.Emails.values[0];
        if (email) {
            console.log("Email:", email.content);
        }
        const workPhone = businessCard.WorkPhones && businessCard.WorkPhones.values[0];
        if (workPhone) {
            console.log("Work phone:", workPhone.content);
        }
        const website = businessCard.Websites && businessCard.Websites.values[0];
        if (website) {
            console.log("Website:", website.content);
        }
    } else {
        throw new Error("Expected at least one business card in the result.");
    }
}

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

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

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • Python 3.7 أو أحدث. يجب أن يتضمن تثبيت Python خاصتك pip. يمكنك التحقق مما إذا كان لديك pip مثبتا عن طريق التشغيل pip --version على سطر الأوامر. الحصول على نقطة عن طريق تثبيت أحدث إصدار من Python.

  • أحدث إصدار من Visual Studio Code أو IDE المفضل لديك. راجع بدء استخدام Python في Visual Studio Code.

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

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

    ميزة معرف النموذج عنوان url المستند
    نموذج القراءة prebuilt-read عينة بحث موجزة
    نموذج تخطيط prebuilt-layout تأكيد حجز العينة
    نموذج استمارة W-2 prebuilt-tax.us.w2 نموذج W-2 نموذجي
    نموذج الفاتورة prebuilt-invoice نموذج الفاتورة
    نموذج الإيصال prebuilt-receipt نموذج الإيصال
    نموذج مستند المعرف prebuilt-idDocument مستندات المعرّف مسبقة الإنشاء

تعيين متغيرات البيئة الخاصة بك

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

هام

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

لتعيين متغير البيئة لمفتاح مورد Document Intelligence، افتح نافذة وحدة تحكم، واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير. استبدل yourKey> وEndpoint>< بالقيم من المورد الخاص بك في مدخل Microsoft Azure.<

متغيرات البيئة في Windows غير حساسة لحالة الأحرف. عادة ما يتم الإعلان عنها بأحرف كبيرة، مع كلمات مرتبطة بتسطير أسفل السطر. في موجه الأوامر، قم بتشغيل الأوامر التالية:

  1. تعيين متغير المفتاح الخاص بك:

    setx DI_KEY <yourKey>
    
  2. تعيين متغير نقطة النهاية

    setx DI_ENDPOINT <yourEndpoint>
    
  3. أغلق نافذة موجه الأوامر بعد تعيين متغيرات البيئة الخاصة بك. تبقى القيم حتى تقوم بتغييرها مرة أخرى.

  4. أعد تشغيل أي برامج قيد التشغيل تقرأ متغير البيئة. على سبيل المثال، إذا كنت تستخدم Visual Studio أو Visual Studio Code كمحرر، فعد التشغيل قبل تشغيل نموذج التعليمات البرمجية.

فيما يلي بعض الأوامر الأكثر فائدة لاستخدامها مع متغيرات البيئة:

الأمر الإجراء مثال
setx VARIABLE_NAME= احذف متغير البيئة عن طريق تعيين القيمة إلى سلسلة فارغة. setx DI_KEY=
setx VARIABLE_NAME=value تعيين قيمة متغير بيئة أو تغييرها. setx DI_KEY=<yourKey>
set VARIABLE_NAME عرض قيمة متغير بيئة معين. set DI_KEY
set عرض كافة متغيرات البيئة. set

إعداد بيئة البرمجة

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

pip install azure-ai-documentintelligence==1.0.0b2

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

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

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

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

    • يقع نموذج القراءة المعد مسبقا في صميم جميع نماذج Document Intelligence ويمكنه اكتشاف الأسطر والكلمات والمواقع واللغات. يستخدم read التخطيط والمستند العام والنماذج المعدة مسبقا والمخصصة النموذج كأساس لاستخراج النصوص من المستندات.
    • يستخرج نموذج التخطيط الذي تم إنشاؤه مسبقا مواقع النص والنص والجداول وعلامات التحديد ومعلومات البنية من المستندات والصور.
    • يستخرج نموذج prebuilt-tax.us.w2 المعلومات التي تم الإبلاغ عنها في النماذج الضريبية لخدمة الإيرادات الداخلية الأمريكية (IRS).
    • يستخرج نموذج الفاتورة الذي تم إنشاؤه مسبقا الحقول الرئيسية وعناصر السطر من فواتير المبيعات بتنسيقات مختلفة.
    • يستخرج نموذج الإيصال مسبق الإنشاء المعلومات الرئيسية من إيصالات المبيعات المطبوعة والمكتوبة بخط اليد.
    • يستخرج نموذج idDocument الذي تم إنشاؤه مسبقا معلومات رئيسية من تراخيص سائقي الولايات المتحدة؛ صفحات سيرة ذاتية لجوازات السفر الدولية؛ معرفات الولايات الأمريكية؛ بطاقات الضمان الاجتماعي؛ وبطاقات المقيمين الدائمين.
  3. قم بتشغيل التعليمات البرمجية ل Python من موجه الأوامر.

    python form_recognizer_quickstart.py
    

استخدام نموذج القراءة

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

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


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

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

    poller = client.begin_analyze_document(
        "prebuilt-read", formUrl
    )
    result = poller.result()

    print("Document contains content: ", result.content)

    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 Read 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):
            print(
                "...Line # {} has text content '{}' within bounding box '{}'".format(
                    line_idx,
                    line.content,
                    format_polygon(line.polygon),
                )
            )

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

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


if __name__ == "__main__":
    analyze_read()

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

استخدام نموذج التخطيط

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


# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

# formatting function
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/rest-api/layout.png"

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

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

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

استخدام نموذج المستند "عام"

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

# formatting function
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)

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


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

    # create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
   client = DocumentIntelligenceClient(endpoint=endpoint, credential=AzureKeyCredential(key))

    poller = client.begin_analyze_document(
            "prebuilt-document", docUrl)
    result = poller.result()

    for style in result.styles:
        if style.is_handwritten:
            print("Document contains handwritten content: ")
            print(",".join([result.content[span.offset:span.offset + span.length] for span in style.spans]))

    print("----Key-value pairs found in document----")
    for kv_pair in result.key_value_pairs:
        if kv_pair.key:
            print(
                    "Key '{}' found within '{}' bounding regions".format(
                        kv_pair.key.content,
                        format_bounding_region(kv_pair.key.bounding_regions),
                    )
                )
        if kv_pair.value:
            print(
                    "Value '{}' found within '{}' bounding regions\n".format(
                        kv_pair.value.content,
                        format_bounding_region(kv_pair.value.bounding_regions),
                    )
                )

    for page in result.pages:
        print("----Analyzing document 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):
            print(
                "...Line # {} has text content '{}' within bounding box '{}'".format(
                    line_idx,
                    line.content,
                    format_polygon(line.polygon),
                )
            )

        for word in page.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 '{}'\n".format(
                        region.page_number,
                        format_polygon(region.polygon),
                    )
                )
    print("----------------------------------------")


if __name__ == "__main__":
    analyze_general_documents()

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

استخدام نموذج الضريبة W-2

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

# formatting function
def format_address_value(address_value):
    return f"\n......House/building number: {address_value.house_number}\n......Road: {address_value.road}\n......City: {address_value.city}\n......State: {address_value.state}\n......Postal code: {address_value.postal_code}"


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

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

    poller = client.begin_analyze_document(
        "prebuilt-tax.us.w2", formUrl
    )
    w2s = poller.result()

    for idx, w2 in enumerate(w2s.documents):
         print("--------Analyzing US Tax W-2 Form #{}--------".format(idx   1))
        form_variant = w2.fields.get("W2FormVariant")
        if form_variant:
            print(
                "Form variant: {} has confidence: {}".format(
                    form_variant.value, form_variant.confidence
                )
            )
        tax_year = w2.fields.get("TaxYear")
        if tax_year:
            print(
                "Tax year: {} has confidence: {}".format(
                    tax_year.value, tax_year.confidence
                )
            )
        w2_copy = w2.fields.get("W2Copy")
        if w2_copy:
            print(
                "W-2 Copy: {} has confidence: {}".format(
                    w2_copy.value,
                    w2_copy.confidence,
                )
            )
        employee = w2.fields.get("Employee")
        if employee:
            print("Employee data:")
            employee_name = employee.value.get("Name")
            if employee_name:
                print(
                    "...Name: {} has confidence: {}".format(
                        employee_name.value, employee_name.confidence
                    )
                )
            employee_ssn = employee.value.get("SocialSecurityNumber")
            if employee_ssn:
                print(
                    "...SSN: {} has confidence: {}".format(
                        employee_ssn.value, employee_ssn.confidence
                    )
                )
            employee_address = employee.value.get("Address")
            if employee_address:
                print(
                    "...Address: {}\n......has confidence: {}".format(
                        format_address_value(employee_address.value),
                        employee_address.confidence,
                    )
                )
            employee_zipcode = employee.value.get("ZipCode")
            if employee_zipcode:
                print(
                    "...Zipcode: {} has confidence: {}".format(
                        employee_zipcode.value, employee_zipcode.confidence
                    )
                )
        control_number = w2.fields.get("ControlNumber")
        if control_number:
            print(
                "Control Number: {} has confidence: {}".format(
                    control_number.value, control_number.confidence
                )
            )
        employer = w2.fields.get("Employer")
        if employer:
            print("Employer data:")
            employer_name = employer.value.get("Name")
            if employer_name:
                print(
                    "...Name: {} has confidence: {}".format(
                        employer_name.value, employer_name.confidence
                    )
                )
            employer_id = employer.value.get("IdNumber")
            if employer_id:
                print(
                    "...ID Number: {} has confidence: {}".format(
                        employer_id.value, employer_id.confidence
                    )
                )
            employer_address = employer.value.get("Address")
            if employer_address:
                print(
                    "...Address: {}\n......has confidence: {}".format(
                        format_address_value(employer_address.value),
                        employer_address.confidence,
                    )
                )
            employer_zipcode = employer.value.get("ZipCode")
            if employer_zipcode:
                print(
                    "...Zipcode: {} has confidence: {}".format(
                        employer_zipcode.value, employer_zipcode.confidence
                    )
                )
        wages_tips = w2.fields.get("WagesTipsAndOtherCompensation")
        if wages_tips:
            print(
                "Wages, tips, and other compensation: {} has confidence: {}".format(
                    wages_tips.value,
                    wages_tips.confidence,
                )
            )
        fed_income_tax_withheld = w2.fields.get("FederalIncomeTaxWithheld")
        if fed_income_tax_withheld:
            print(
                "Federal income tax withheld: {} has confidence: {}".format(
                    fed_income_tax_withheld.value, fed_income_tax_withheld.confidence
                )
            )
        social_security_wages = w2.fields.get("SocialSecurityWages")
        if social_security_wages:
            print(
                "Social Security wages: {} has confidence: {}".format(
                    social_security_wages.value, social_security_wages.confidence
                )
            )
        social_security_tax_withheld = w2.fields.get("SocialSecurityTaxWithheld")
        if social_security_tax_withheld:
            print(
                "Social Security tax withheld: {} has confidence: {}".format(
                    social_security_tax_withheld.value,
                    social_security_tax_withheld.confidence,
                )
            )
        medicare_wages_tips = w2.fields.get("MedicareWagesAndTips")
        if medicare_wages_tips:
            print(
                "Medicare wages and tips: {} has confidence: {}".format(
                    medicare_wages_tips.value, medicare_wages_tips.confidence
                )
            )
        medicare_tax_withheld = w2.fields.get("MedicareTaxWithheld")
        if medicare_tax_withheld:
            print(
                "Medicare tax withheld: {} has confidence: {}".format(
                    medicare_tax_withheld.value, medicare_tax_withheld.confidence
                )
            )
        social_security_tips = w2.fields.get("SocialSecurityTips")
        if social_security_tips:
            print(
                "Social Security tips: {} has confidence: {}".format(
                    social_security_tips.value, social_security_tips.confidence
                )
            )
        allocated_tips = w2.fields.get("AllocatedTips")
        if allocated_tips:
            print(
                "Allocated tips: {} has confidence: {}".format(
                    allocated_tips.value,
                    allocated_tips.confidence,
                )
            )
        verification_code = w2.fields.get("VerificationCode")
        if verification_code:
            print(
                "Verification code: {} has confidence: {}".format(
                    verification_code.value, verification_code.confidence
                )
            )
        dependent_care_benefits = w2.fields.get("DependentCareBenefits")
        if dependent_care_benefits:
            print(
                "Dependent care benefits: {} has confidence: {}".format(
                    dependent_care_benefits.value,
                    dependent_care_benefits.confidence,
                )
            )
        non_qualified_plans = w2.fields.get("NonQualifiedPlans")
        if non_qualified_plans:
            print(
                "Non-qualified plans: {} has confidence: {}".format(
                    non_qualified_plans.value,
                    non_qualified_plans.confidence,
                )
            )
        additional_info = w2.fields.get("AdditionalInfo")
        if additional_info:
            print("Additional information:")
            for item in additional_info.value:
                letter_code = item.value.get("LetterCode")
                if letter_code:
                    print(
                        "...Letter code: {} has confidence: {}".format(
                            letter_code.value, letter_code.confidence
                        )
                    )
                amount = item.value.get("Amount")
                if amount:
                    print(
                        "...Amount: {} has confidence: {}".format(
                            amount.value, amount.confidence
                        )
                    )
        is_statutory_employee = w2.fields.get("IsStatutoryEmployee")
        if is_statutory_employee:
            print(
                "Is statutory employee: {} has confidence: {}".format(
                    is_statutory_employee.value, is_statutory_employee.confidence
                )
            )
        is_retirement_plan = w2.fields.get("IsRetirementPlan")
        if is_retirement_plan:
            print(
                "Is retirement plan: {} has confidence: {}".format(
                    is_retirement_plan.value, is_retirement_plan.confidence
                )
            )
        third_party_sick_pay = w2.fields.get("IsThirdPartySickPay")
        if third_party_sick_pay:
            print(
                "Is third party sick pay: {} has confidence: {}".format(
                    third_party_sick_pay.value, third_party_sick_pay.confidence
                )
            )
        other_info = w2.fields.get("Other")
        if other_info:
            print(
                "Other information: {} has confidence: {}".format(
                    other_info.value,
                    other_info.confidence,
                )
            )
        state_tax_info = w2.fields.get("StateTaxInfos")
        if state_tax_info:
            print("State Tax info:")
            for tax in state_tax_info.value:
                state = tax.value.get("State")
                if state:
                    print(
                        "...State: {} has confidence: {}".format(
                            state.value, state.confidence
                        )
                    )
                employer_state_id_number = tax.value.get("EmployerStateIdNumber")
                if employer_state_id_number:
                    print(
                        "...Employer state ID number: {} has confidence: {}".format(
                            employer_state_id_number.value,
                            employer_state_id_number.confidence,
                        )
                    )
                state_wages_tips = tax.value.get("StateWagesTipsEtc")
                if state_wages_tips:
                    print(
                        "...State wages, tips, etc: {} has confidence: {}".format(
                            state_wages_tips.value, state_wages_tips.confidence
                        )
                    )
                state_income_tax = tax.value.get("StateIncomeTax")
                if state_income_tax:
                    print(
                        "...State income tax: {} has confidence: {}".format(
                            state_income_tax.value, state_income_tax.confidence
                        )
                    )
        local_tax_info = w2.fields.get("LocalTaxInfos")
        if local_tax_info:
            print("Local Tax info:")
            for tax in local_tax_info.value:
                local_wages_tips = tax.value.get("LocalWagesTipsEtc")
                if local_wages_tips:
                    print(
                        "...Local wages, tips, etc: {} has confidence: {}".format(
                            local_wages_tips.value, local_wages_tips.confidence
                        )
                    )
                local_income_tax = tax.value.get("LocalIncomeTax")
                if local_income_tax:
                    print(
                        "...Local income tax: {} has confidence: {}".format(
                            local_income_tax.value, local_income_tax.confidence
                        )
                    )
                locality_name = tax.value.get("LocalityName")
                if locality_name:
                    print(
                        "...Locality name: {} has confidence: {}".format(
                            locality_name.value, locality_name.confidence
                        )
                    )

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


if __name__ == "__main__":
    analyze_tax_us_w2()

قم بزيارة مستودع نماذج Azure على GitHub واعرض إخراج نموذج ضريبة W-2.

استخدام نموذج الفاتورة

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

# formatting function
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)

# formatting function
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"

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

    poller = client.begin_analyze_document(
            "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()

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

استخدام نموذج الإيصال

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

def analyze_receipts():
    # sample document
    receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png"

   client = DocumentIntelligenceClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )
    poller = client.begin_analyze_document(
        "prebuilt-receipt", receiptUrl, locale="en-US"
    )
    receipts = poller.result()
    for idx, receipt in enumerate(receipts.documents):
         print("--------Analysis of receipt #{}--------".format(idx   1))
        print("Receipt type: {}".format(receipt.doc_type or "N/A"))
        merchant_name = receipt.fields.get("MerchantName")
        if merchant_name:
            print(
                "Merchant Name: {} has confidence: {}".format(
                    merchant_name.value, merchant_name.confidence
                )
            )
        transaction_date = receipt.fields.get("TransactionDate")
        if transaction_date:
            print(
                "Transaction Date: {} has confidence: {}".format(
                    transaction_date.value, transaction_date.confidence
                )
            )
        if receipt.fields.get("Items"):
            print("Receipt items:")
            for idx, item in enumerate(receipt.fields.get("Items").value):
                 print("...Item #{}".format(idx   1))
                item_description = item.value.get("Description")
                if item_description:
                    print(
                        "......Item Description: {} has confidence: {}".format(
                            item_description.value, item_description.confidence
                        )
                    )
                item_quantity = item.value.get("Quantity")
                if item_quantity:
                    print(
                        "......Item Quantity: {} has confidence: {}".format(
                            item_quantity.value, item_quantity.confidence
                        )
                    )
                item_price = item.value.get("Price")
                if item_price:
                    print(
                        "......Individual Item Price: {} has confidence: {}".format(
                            item_price.value, item_price.confidence
                        )
                    )
                item_total_price = item.value.get("TotalPrice")
                if item_total_price:
                    print(
                        "......Total Item Price: {} has confidence: {}".format(
                            item_total_price.value, item_total_price.confidence
                        )
                    )
        subtotal = receipt.fields.get("Subtotal")
        if subtotal:
            print(
                "Subtotal: {} has confidence: {}".format(
                    subtotal.value, subtotal.confidence
                )
            )
        tax = receipt.fields.get("TotalTax")
        if tax:
            print("Total tax: {} has confidence: {}".format(tax.value, tax.confidence))
        tip = receipt.fields.get("Tip")
        if tip:
            print("Tip: {} has confidence: {}".format(tip.value, tip.confidence))
        total = receipt.fields.get("Total")
        if total:
            print("Total: {} has confidence: {}".format(total.value, total.confidence))
        print("--------------------------------------")


if __name__ == "__main__":
    analyze_receipts()

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

استخدام نموذج مستند معرف

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('DI_KEY')
endpoint = os.environ.get('DI_ENDPOINT')

def analyze_identity_documents():
# sample document
    identityUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png"

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

    poller =client.begin_analyze_document(
            "prebuilt-idDocument", identityUrl
        )
    id_documents = poller.result()

    for idx, id_document in enumerate(id_documents.documents):
        print("--------Analyzing ID document #{}--------".format(idx + 1))
        first_name = id_document.fields.get("FirstName")
        if first_name:
            print(
                "First Name: {} has confidence: {}".format(
                    first_name.value, first_name.confidence
                )
            )
        last_name = id_document.fields.get("LastName")
        if last_name:
            print(
                "Last Name: {} has confidence: {}".format(
                    last_name.value, last_name.confidence
                )
            )
        document_number = id_document.fields.get("DocumentNumber")
        if document_number:
            print(
                "Document Number: {} has confidence: {}".format(
                    document_number.value, document_number.confidence
                )
            )
        dob = id_document.fields.get("DateOfBirth")
        if dob:
            print(
                "Date of Birth: {} has confidence: {}".format(dob.value, dob.confidence)
            )
        doe = id_document.fields.get("DateOfExpiration")
        if doe:
            print(
                "Date of Expiration: {} has confidence: {}".format(
                    doe.value, doe.confidence
                )
            )
        sex = id_document.fields.get("Sex")
        if sex:
            print("Sex: {} has confidence: {}".format(sex.value, sex.confidence))
        address = id_document.fields.get("Address")
        if address:
            print(
                "Address: {} has confidence: {}".format(
                    address.value, address.confidence
                )
            )
        country_region = id_document.fields.get("CountryRegion")
        if country_region:
            print(
                "Country/Region: {} has confidence: {}".format(
                    country_region.value, country_region.confidence
                )
            )
        region = id_document.fields.get("Region")
        if region:
            print(
                "Region: {} has confidence: {}".format(region.value, region.confidence)
            )

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

if __name__ == "__main__":
    analyze_identity_documents()

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • Python 3.7 أو أحدث. يجب أن يتضمن تثبيت Python خاصتك pip. يمكنك التحقق مما إذا كان لديك pip مثبتا عن طريق التشغيل pip --version على سطر الأوامر. الحصول على نقطة عن طريق تثبيت أحدث إصدار من Python.

  • أحدث إصدار من Visual Studio Code أو IDE المفضل لديك. راجع بدء استخدام Python في Visual Studio Code.

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

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

    ميزة معرف النموذج عنوان url المستند
    نموذج القراءة prebuilt-read عينة بحث موجزة
    نموذج تخطيط prebuilt-layout تأكيد حجز العينة
    نموذج استمارة W-2 prebuilt-tax.us.w2 نموذج W-2 نموذجي
    نموذج الفاتورة prebuilt-invoice نموذج الفاتورة
    نموذج الإيصال prebuilt-receipt نموذج الإيصال
    نموذج مستند المعرف prebuilt-idDocument مستندات المعرّف مسبقة الإنشاء
    نموذج بطاقة العمل prebuilt-businessCard عينة بطاقة العمل

تعيين متغيرات البيئة الخاصة بك

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

هام

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

لتعيين متغير البيئة لمفتاح مورد Document Intelligence، افتح نافذة وحدة تحكم، واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير. استبدل yourKey> وEndpoint>< بالقيم من المورد الخاص بك في مدخل Microsoft Azure.<

متغيرات البيئة في Windows غير حساسة لحالة الأحرف. عادة ما يتم الإعلان عنها بأحرف كبيرة، مع كلمات مرتبطة بتسطير أسفل السطر. في موجه الأوامر، قم بتشغيل الأوامر التالية:

  1. تعيين متغير المفتاح الخاص بك:

    setx DI_KEY <yourKey>
    
  2. تعيين متغير نقطة النهاية

    setx DI_ENDPOINT <yourEndpoint>
    
  3. أغلق نافذة موجه الأوامر بعد تعيين متغيرات البيئة الخاصة بك. تبقى القيم حتى تقوم بتغييرها مرة أخرى.

  4. أعد تشغيل أي برامج قيد التشغيل تقرأ متغير البيئة. على سبيل المثال، إذا كنت تستخدم Visual Studio أو Visual Studio Code كمحرر، فعد التشغيل قبل تشغيل نموذج التعليمات البرمجية.

فيما يلي بعض الأوامر الأكثر فائدة لاستخدامها مع متغيرات البيئة:

الأمر الإجراء مثال
setx VARIABLE_NAME= احذف متغير البيئة عن طريق تعيين القيمة إلى سلسلة فارغة. setx DI_KEY=
setx VARIABLE_NAME=value تعيين قيمة متغير بيئة أو تغييرها. setx DI_KEY=<yourKey>
set VARIABLE_NAME عرض قيمة متغير بيئة معين. set DI_KEY
set عرض كافة متغيرات البيئة. set

إعداد بيئة البرمجة

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

pip install azure-ai-formrecognizer==3.2.0

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

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

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

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

    • يقع نموذج القراءة المعد مسبقا في صميم جميع نماذج Document Intelligence ويمكنه اكتشاف الأسطر والكلمات والمواقع واللغات. يستخدم read التخطيط والمستند العام والنماذج المعدة مسبقا والمخصصة النموذج كأساس لاستخراج النصوص من المستندات.
    • يستخرج نموذج التخطيط الذي تم إنشاؤه مسبقا مواقع النص والنص والجداول وعلامات التحديد ومعلومات البنية من المستندات والصور.
    • يستخرج نموذج prebuilt-tax.us.w2 المعلومات التي تم الإبلاغ عنها في النماذج الضريبية لخدمة الإيرادات الداخلية الأمريكية (IRS).
    • يستخرج نموذج الفاتورة الذي تم إنشاؤه مسبقا الحقول الرئيسية وعناصر السطر من فواتير المبيعات بتنسيقات مختلفة.
    • يستخرج نموذج الإيصال مسبق الإنشاء المعلومات الرئيسية من إيصالات المبيعات المطبوعة والمكتوبة بخط اليد.
    • يستخرج نموذج idDocument الذي تم إنشاؤه مسبقا معلومات رئيسية من تراخيص سائقي الولايات المتحدة؛ صفحات سيرة ذاتية لجوازات السفر الدولية؛ معرفات الولايات الأمريكية؛ بطاقات الضمان الاجتماعي؛ وبطاقات المقيمين الدائمين.
  3. قم بتشغيل التعليمات البرمجية ل Python من موجه الأوامر.

    python form_recognizer_quickstart.py
    

استخدام نموذج القراءة

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

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


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

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

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

    print("Document contains content: ", result.content)

    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 Read 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):
            print(
                "...Line # {} has text content '{}' within bounding box '{}'".format(
                    line_idx,
                    line.content,
                    format_polygon(line.polygon),
                )
            )

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

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


if __name__ == "__main__":
    analyze_read()

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

استخدام نموذج التخطيط

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

# formatting function
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/rest-api/layout.png"

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

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

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

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

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

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

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

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

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


if __name__ == "__main__":
    analyze_layout()

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

استخدام نموذج المستند "عام"

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

# formatting function
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)

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


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

    # create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
    document_analysis_client = DocumentAnalysisClient(endpoint=endpoint, credential=AzureKeyCredential(key))

    poller = document_analysis_client.begin_analyze_document_from_url(
            "prebuilt-document", docUrl)
    result = poller.result()

    for style in result.styles:
        if style.is_handwritten:
            print("Document contains handwritten content: ")
            print(",".join([result.content[span.offset:span.offset + span.length] for span in style.spans]))

    print("----Key-value pairs found in document----")
    for kv_pair in result.key_value_pairs:
        if kv_pair.key:
            print(
                    "Key '{}' found within '{}' bounding regions".format(
                        kv_pair.key.content,
                        format_bounding_region(kv_pair.key.bounding_regions),
                    )
                )
        if kv_pair.value:
            print(
                    "Value '{}' found within '{}' bounding regions\n".format(
                        kv_pair.value.content,
                        format_bounding_region(kv_pair.value.bounding_regions),
                    )
                )

    for page in result.pages:
        print("----Analyzing document 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):
            print(
                "...Line # {} has text content '{}' within bounding box '{}'".format(
                    line_idx,
                    line.content,
                    format_polygon(line.polygon),
                )
            )

        for word in page.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 '{}'\n".format(
                        region.page_number,
                        format_polygon(region.polygon),
                    )
                )
    print("----------------------------------------")


if __name__ == "__main__":
    analyze_general_documents()

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

استخدام نموذج الضريبة W-2

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

# formatting function
def format_address_value(address_value):
    return f"\n......House/building number: {address_value.house_number}\n......Road: {address_value.road}\n......City: {address_value.city}\n......State: {address_value.state}\n......Postal code: {address_value.postal_code}"


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

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

    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-tax.us.w2", formUrl
    )
    w2s = poller.result()

    for idx, w2 in enumerate(w2s.documents):
         print("--------Analyzing US Tax W-2 Form #{}--------".format(idx   1))
        form_variant = w2.fields.get("W2FormVariant")
        if form_variant:
            print(
                "Form variant: {} has confidence: {}".format(
                    form_variant.value, form_variant.confidence
                )
            )
        tax_year = w2.fields.get("TaxYear")
        if tax_year:
            print(
                "Tax year: {} has confidence: {}".format(
                    tax_year.value, tax_year.confidence
                )
            )
        w2_copy = w2.fields.get("W2Copy")
        if w2_copy:
            print(
                "W-2 Copy: {} has confidence: {}".format(
                    w2_copy.value,
                    w2_copy.confidence,
                )
            )
        employee = w2.fields.get("Employee")
        if employee:
            print("Employee data:")
            employee_name = employee.value.get("Name")
            if employee_name:
                print(
                    "...Name: {} has confidence: {}".format(
                        employee_name.value, employee_name.confidence
                    )
                )
            employee_ssn = employee.value.get("SocialSecurityNumber")
            if employee_ssn:
                print(
                    "...SSN: {} has confidence: {}".format(
                        employee_ssn.value, employee_ssn.confidence
                    )
                )
            employee_address = employee.value.get("Address")
            if employee_address:
                print(
                    "...Address: {}\n......has confidence: {}".format(
                        format_address_value(employee_address.value),
                        employee_address.confidence,
                    )
                )
            employee_zipcode = employee.value.get("ZipCode")
            if employee_zipcode:
                print(
                    "...Zipcode: {} has confidence: {}".format(
                        employee_zipcode.value, employee_zipcode.confidence
                    )
                )
        control_number = w2.fields.get("ControlNumber")
        if control_number:
            print(
                "Control Number: {} has confidence: {}".format(
                    control_number.value, control_number.confidence
                )
            )
        employer = w2.fields.get("Employer")
        if employer:
            print("Employer data:")
            employer_name = employer.value.get("Name")
            if employer_name:
                print(
                    "...Name: {} has confidence: {}".format(
                        employer_name.value, employer_name.confidence
                    )
                )
            employer_id = employer.value.get("IdNumber")
            if employer_id:
                print(
                    "...ID Number: {} has confidence: {}".format(
                        employer_id.value, employer_id.confidence
                    )
                )
            employer_address = employer.value.get("Address")
            if employer_address:
                print(
                    "...Address: {}\n......has confidence: {}".format(
                        format_address_value(employer_address.value),
                        employer_address.confidence,
                    )
                )
            employer_zipcode = employer.value.get("ZipCode")
            if employer_zipcode:
                print(
                    "...Zipcode: {} has confidence: {}".format(
                        employer_zipcode.value, employer_zipcode.confidence
                    )
                )
        wages_tips = w2.fields.get("WagesTipsAndOtherCompensation")
        if wages_tips:
            print(
                "Wages, tips, and other compensation: {} has confidence: {}".format(
                    wages_tips.value,
                    wages_tips.confidence,
                )
            )
        fed_income_tax_withheld = w2.fields.get("FederalIncomeTaxWithheld")
        if fed_income_tax_withheld:
            print(
                "Federal income tax withheld: {} has confidence: {}".format(
                    fed_income_tax_withheld.value, fed_income_tax_withheld.confidence
                )
            )
        social_security_wages = w2.fields.get("SocialSecurityWages")
        if social_security_wages:
            print(
                "Social Security wages: {} has confidence: {}".format(
                    social_security_wages.value, social_security_wages.confidence
                )
            )
        social_security_tax_withheld = w2.fields.get("SocialSecurityTaxWithheld")
        if social_security_tax_withheld:
            print(
                "Social Security tax withheld: {} has confidence: {}".format(
                    social_security_tax_withheld.value,
                    social_security_tax_withheld.confidence,
                )
            )
        medicare_wages_tips = w2.fields.get("MedicareWagesAndTips")
        if medicare_wages_tips:
            print(
                "Medicare wages and tips: {} has confidence: {}".format(
                    medicare_wages_tips.value, medicare_wages_tips.confidence
                )
            )
        medicare_tax_withheld = w2.fields.get("MedicareTaxWithheld")
        if medicare_tax_withheld:
            print(
                "Medicare tax withheld: {} has confidence: {}".format(
                    medicare_tax_withheld.value, medicare_tax_withheld.confidence
                )
            )
        social_security_tips = w2.fields.get("SocialSecurityTips")
        if social_security_tips:
            print(
                "Social Security tips: {} has confidence: {}".format(
                    social_security_tips.value, social_security_tips.confidence
                )
            )
        allocated_tips = w2.fields.get("AllocatedTips")
        if allocated_tips:
            print(
                "Allocated tips: {} has confidence: {}".format(
                    allocated_tips.value,
                    allocated_tips.confidence,
                )
            )
        verification_code = w2.fields.get("VerificationCode")
        if verification_code:
            print(
                "Verification code: {} has confidence: {}".format(
                    verification_code.value, verification_code.confidence
                )
            )
        dependent_care_benefits = w2.fields.get("DependentCareBenefits")
        if dependent_care_benefits:
            print(
                "Dependent care benefits: {} has confidence: {}".format(
                    dependent_care_benefits.value,
                    dependent_care_benefits.confidence,
                )
            )
        non_qualified_plans = w2.fields.get("NonQualifiedPlans")
        if non_qualified_plans:
            print(
                "Non-qualified plans: {} has confidence: {}".format(
                    non_qualified_plans.value,
                    non_qualified_plans.confidence,
                )
            )
        additional_info = w2.fields.get("AdditionalInfo")
        if additional_info:
            print("Additional information:")
            for item in additional_info.value:
                letter_code = item.value.get("LetterCode")
                if letter_code:
                    print(
                        "...Letter code: {} has confidence: {}".format(
                            letter_code.value, letter_code.confidence
                        )
                    )
                amount = item.value.get("Amount")
                if amount:
                    print(
                        "...Amount: {} has confidence: {}".format(
                            amount.value, amount.confidence
                        )
                    )
        is_statutory_employee = w2.fields.get("IsStatutoryEmployee")
        if is_statutory_employee:
            print(
                "Is statutory employee: {} has confidence: {}".format(
                    is_statutory_employee.value, is_statutory_employee.confidence
                )
            )
        is_retirement_plan = w2.fields.get("IsRetirementPlan")
        if is_retirement_plan:
            print(
                "Is retirement plan: {} has confidence: {}".format(
                    is_retirement_plan.value, is_retirement_plan.confidence
                )
            )
        third_party_sick_pay = w2.fields.get("IsThirdPartySickPay")
        if third_party_sick_pay:
            print(
                "Is third party sick pay: {} has confidence: {}".format(
                    third_party_sick_pay.value, third_party_sick_pay.confidence
                )
            )
        other_info = w2.fields.get("Other")
        if other_info:
            print(
                "Other information: {} has confidence: {}".format(
                    other_info.value,
                    other_info.confidence,
                )
            )
        state_tax_info = w2.fields.get("StateTaxInfos")
        if state_tax_info:
            print("State Tax info:")
            for tax in state_tax_info.value:
                state = tax.value.get("State")
                if state:
                    print(
                        "...State: {} has confidence: {}".format(
                            state.value, state.confidence
                        )
                    )
                employer_state_id_number = tax.value.get("EmployerStateIdNumber")
                if employer_state_id_number:
                    print(
                        "...Employer state ID number: {} has confidence: {}".format(
                            employer_state_id_number.value,
                            employer_state_id_number.confidence,
                        )
                    )
                state_wages_tips = tax.value.get("StateWagesTipsEtc")
                if state_wages_tips:
                    print(
                        "...State wages, tips, etc: {} has confidence: {}".format(
                            state_wages_tips.value, state_wages_tips.confidence
                        )
                    )
                state_income_tax = tax.value.get("StateIncomeTax")
                if state_income_tax:
                    print(
                        "...State income tax: {} has confidence: {}".format(
                            state_income_tax.value, state_income_tax.confidence
                        )
                    )
        local_tax_info = w2.fields.get("LocalTaxInfos")
        if local_tax_info:
            print("Local Tax info:")
            for tax in local_tax_info.value:
                local_wages_tips = tax.value.get("LocalWagesTipsEtc")
                if local_wages_tips:
                    print(
                        "...Local wages, tips, etc: {} has confidence: {}".format(
                            local_wages_tips.value, local_wages_tips.confidence
                        )
                    )
                local_income_tax = tax.value.get("LocalIncomeTax")
                if local_income_tax:
                    print(
                        "...Local income tax: {} has confidence: {}".format(
                            local_income_tax.value, local_income_tax.confidence
                        )
                    )
                locality_name = tax.value.get("LocalityName")
                if locality_name:
                    print(
                        "...Locality name: {} has confidence: {}".format(
                            locality_name.value, locality_name.confidence
                        )
                    )

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


if __name__ == "__main__":
    analyze_tax_us_w2()

قم بزيارة مستودع نماذج Azure على GitHub واعرض إخراج نموذج ضريبة W-2.

استخدام نموذج الفاتورة

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

# formatting function
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)

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

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

استخدام نموذج الإيصال

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

def analyze_receipts():
    # sample document
    receiptUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png"

    document_analysis_client = DocumentAnalysisClient(
        endpoint=endpoint, credential=AzureKeyCredential(key)
    )
    poller = document_analysis_client.begin_analyze_document_from_url(
        "prebuilt-receipt", receiptUrl, locale="en-US"
    )
    receipts = poller.result()
    for idx, receipt in enumerate(receipts.documents):
         print("--------Analysis of receipt #{}--------".format(idx   1))
        print("Receipt type: {}".format(receipt.doc_type or "N/A"))
        merchant_name = receipt.fields.get("MerchantName")
        if merchant_name:
            print(
                "Merchant Name: {} has confidence: {}".format(
                    merchant_name.value, merchant_name.confidence
                )
            )
        transaction_date = receipt.fields.get("TransactionDate")
        if transaction_date:
            print(
                "Transaction Date: {} has confidence: {}".format(
                    transaction_date.value, transaction_date.confidence
                )
            )
        if receipt.fields.get("Items"):
            print("Receipt items:")
            for idx, item in enumerate(receipt.fields.get("Items").value):
                 print("...Item #{}".format(idx   1))
                item_description = item.value.get("Description")
                if item_description:
                    print(
                        "......Item Description: {} has confidence: {}".format(
                            item_description.value, item_description.confidence
                        )
                    )
                item_quantity = item.value.get("Quantity")
                if item_quantity:
                    print(
                        "......Item Quantity: {} has confidence: {}".format(
                            item_quantity.value, item_quantity.confidence
                        )
                    )
                item_price = item.value.get("Price")
                if item_price:
                    print(
                        "......Individual Item Price: {} has confidence: {}".format(
                            item_price.value, item_price.confidence
                        )
                    )
                item_total_price = item.value.get("TotalPrice")
                if item_total_price:
                    print(
                        "......Total Item Price: {} has confidence: {}".format(
                            item_total_price.value, item_total_price.confidence
                        )
                    )
        subtotal = receipt.fields.get("Subtotal")
        if subtotal:
            print(
                "Subtotal: {} has confidence: {}".format(
                    subtotal.value, subtotal.confidence
                )
            )
        tax = receipt.fields.get("TotalTax")
        if tax:
            print("Total tax: {} has confidence: {}".format(tax.value, tax.confidence))
        tip = receipt.fields.get("Tip")
        if tip:
            print("Tip: {} has confidence: {}".format(tip.value, tip.confidence))
        total = receipt.fields.get("Total")
        if total:
            print("Total: {} has confidence: {}".format(total.value, total.confidence))
        print("--------------------------------------")


if __name__ == "__main__":
    analyze_receipts()

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

استخدام نموذج مستند معرف

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

def analyze_identity_documents():
# sample document
    identityUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png"

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

    poller = document_analysis_client.begin_analyze_document_from_url(
            "prebuilt-idDocument", identityUrl
        )
    id_documents = poller.result()

    for idx, id_document in enumerate(id_documents.documents):
        print("--------Analyzing ID document #{}--------".format(idx + 1))
        first_name = id_document.fields.get("FirstName")
        if first_name:
            print(
                "First Name: {} has confidence: {}".format(
                    first_name.value, first_name.confidence
                )
            )
        last_name = id_document.fields.get("LastName")
        if last_name:
            print(
                "Last Name: {} has confidence: {}".format(
                    last_name.value, last_name.confidence
                )
            )
        document_number = id_document.fields.get("DocumentNumber")
        if document_number:
            print(
                "Document Number: {} has confidence: {}".format(
                    document_number.value, document_number.confidence
                )
            )
        dob = id_document.fields.get("DateOfBirth")
        if dob:
            print(
                "Date of Birth: {} has confidence: {}".format(dob.value, dob.confidence)
            )
        doe = id_document.fields.get("DateOfExpiration")
        if doe:
            print(
                "Date of Expiration: {} has confidence: {}".format(
                    doe.value, doe.confidence
                )
            )
        sex = id_document.fields.get("Sex")
        if sex:
            print("Sex: {} has confidence: {}".format(sex.value, sex.confidence))
        address = id_document.fields.get("Address")
        if address:
            print(
                "Address: {} has confidence: {}".format(
                    address.value, address.confidence
                )
            )
        country_region = id_document.fields.get("CountryRegion")
        if country_region:
            print(
                "Country/Region: {} has confidence: {}".format(
                    country_region.value, country_region.confidence
                )
            )
        region = id_document.fields.get("Region")
        if region:
            print(
                "Region: {} has confidence: {}".format(region.value, region.confidence)
            )

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

if __name__ == "__main__":
    analyze_identity_documents()

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

استخدام نموذج بطاقة العمل

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

# use your `key` and `endpoint` environment variables
key = os.environ.get('FR_KEY')
endpoint = os.environ.get('FR_ENDPOINT')

def analyze_business_card():
      # sample document
    businessCardUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg"

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

    poller = document_analysis_client.begin_analyze_document_from_url(
            "prebuilt-businessCard", businessCardUrl, locale="en-US"
        )
    business_cards = poller.result()

    for idx, business_card in enumerate(business_cards.documents):
        print("--------Analyzing business card #{}--------".format(idx + 1))
        contact_names = business_card.fields.get("ContactNames")
        if contact_names:
            for contact_name in contact_names.value:
                print(
                    "Contact First Name: {} has confidence: {}".format(
                        contact_name.value["FirstName"].value,
                        contact_name.value[
                            "FirstName"
                        ].confidence,
                    )
                )
                print(
                    "Contact Last Name: {} has confidence: {}".format(
                        contact_name.value["LastName"].value,
                        contact_name.value[
                            "LastName"
                        ].confidence,
                    )
                )
        company_names = business_card.fields.get("CompanyNames")
        if company_names:
            for company_name in company_names.value:
                print(
                    "Company Name: {} has confidence: {}".format(
                        company_name.value, company_name.confidence
                    )
                )
        departments = business_card.fields.get("Departments")
        if departments:
            for department in departments.value:
                print(
                    "Department: {} has confidence: {}".format(
                        department.value, department.confidence
                    )
                )
        job_titles = business_card.fields.get("JobTitles")
        if job_titles:
            for job_title in job_titles.value:
                print(
                    "Job Title: {} has confidence: {}".format(
                        job_title.value, job_title.confidence
                    )
                )
        emails = business_card.fields.get("Emails")
        if emails:
            for email in emails.value:
                print(
                    "Email: {} has confidence: {}".format(email.value, email.confidence)
                )
        websites = business_card.fields.get("Websites")
        if websites:
            for website in websites.value:
                print(
                    "Website: {} has confidence: {}".format(
                        website.value, website.confidence
                    )
                )
        addresses = business_card.fields.get("Addresses")
        if addresses:
            for address in addresses.value:
                print(
                    "Address: {} has confidence: {}".format(
                        address.value, address.confidence
                    )
                )
        mobile_phones = business_card.fields.get("MobilePhones")
        if mobile_phones:
            for phone in mobile_phones.value:
                print(
                    "Mobile phone number: {} has confidence: {}".format(
                        phone.content, phone.confidence
                    )
                )
        faxes = business_card.fields.get("Faxes")
        if faxes:
            for fax in faxes.value:
                print(
                    "Fax number: {} has confidence: {}".format(
                        fax.content, fax.confidence
                    )
                )
        work_phones = business_card.fields.get("WorkPhones")
        if work_phones:
            for work_phone in work_phones.value:
                print(
                    "Work phone number: {} has confidence: {}".format(
                        work_phone.content, work_phone.confidence
                    )
                )
        other_phones = business_card.fields.get("OtherPhones")
        if other_phones:
            for other_phone in other_phones.value:
                print(
                    "Other phone number: {} has confidence: {}".format(
                        other_phone.value, other_phone.confidence
                    )
                )

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

if __name__ == "__main__":
    analyze_business_card()

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

إشعار

يستخدم هذا المشروع أداة سطر الأوامر cURL لتنفيذ استدعاءات REST API.

| تدعم واجهة برمجة تطبيقات | REST لذكاء المستند Azure SDKS

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • تم تثبيت أداة سطر أوامر cURL. يتم شحن Windows 10 وWindows 11 مع نسخة من cURL. في موجه الأوامر، اكتب الأمر cURL التالي. إذا تم عرض خيارات التعليمات، يتم تثبيت cURL في بيئة Windows.

    curl -help
    

    إذا لم يتم تثبيت cURL، يمكنك الحصول عليه هنا:

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

تعيين متغيرات البيئة الخاصة بك

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

هام

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

لتعيين متغير البيئة لمفتاح مورد Document Intelligence، افتح نافذة وحدة تحكم، واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير. استبدل yourKey> وEndpoint>< بالقيم من المورد الخاص بك في مدخل Microsoft Azure.<

متغيرات البيئة في Windows غير حساسة لحالة الأحرف. عادة ما يتم الإعلان عنها بأحرف كبيرة، مع كلمات مرتبطة بتسطير أسفل السطر. في موجه الأوامر، قم بتشغيل الأوامر التالية:

  1. تعيين متغير المفتاح الخاص بك:

    setx DI_KEY <yourKey>
    
  2. تعيين متغير نقطة النهاية

    setx DI_ENDPOINT <yourEndpoint>
    
  3. أغلق نافذة موجه الأوامر بعد تعيين متغيرات البيئة الخاصة بك. تبقى القيم حتى تقوم بتغييرها مرة أخرى.

  4. أعد تشغيل أي برامج قيد التشغيل تقرأ متغير البيئة. على سبيل المثال، إذا كنت تستخدم Visual Studio أو Visual Studio Code كمحرر، فعد التشغيل قبل تشغيل نموذج التعليمات البرمجية.

فيما يلي بعض الأوامر الأكثر فائدة لاستخدامها مع متغيرات البيئة:

الأمر الإجراء مثال
setx VARIABLE_NAME= احذف متغير البيئة عن طريق تعيين القيمة إلى سلسلة فارغة. setx DI_KEY=
setx VARIABLE_NAME=value تعيين قيمة متغير بيئة أو تغييرها. setx DI_KEY=<yourKey>
set VARIABLE_NAME عرض قيمة متغير بيئة معين. set DI_KEY
set عرض كافة متغيرات البيئة. set

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

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

استخدم الجدول التالي كمرجع. استبدل <modelId> و <document-url> بالقيم المطلوبة:

النموذج معرف النموذج الوصف عنوان 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
نموذج استمارة W-2 prebuilt-tax.us.w2 نموذج W-2 نموذجي 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

طلب نشر

افتح نافذة وحدة تحكم وقم بتشغيل الأمر cURL التالي. تتضمن الأوامر نقطة النهاية ومتغيرات البيئة الرئيسية التي تم إنشاؤها مسبقا في قسم متغيرات البيئة المحددة. استبدل هذه المتغيرات إذا كانت أسماء المتغيرات تختلف. تذكر استبدال معلمات modelId> و <document-url>.<

curl -i -X POST "%DI_ENDPOINT%/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-02-29-preview" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: %DI_KEY%" --data-ascii "{'urlSource': '<document-url>'}"

لتمكين قدرات الوظيفة الإضافية، استخدم معلمة features الاستعلام في طلب POST. تتوفر أربع قدرات إضافية مع 2023-07-31 (GA) والإصدارات الأحدث: ocr.highResolution وocr.formula وocr.font و queryFields.premium. لمعرفة المزيد حول كل من القدرات، راجع النماذج المخصصة.

يمكنك فقط استدعاء إمكانيات highResolution والصيغة والخطلنموذج القراءة والتخطيط، وقدرة queryFields لنموذج "المستندات العامة". يوضح المثال التالي كيفية استدعاء إمكانيات highResolution والصيغة والخط لنموذج التخطيط.

curl -i -X POST "%DI_ENDPOINT%documentintelligence/documentModels/prebuilt-layout:analyze?features=ocr.highResolution,ocr.formula,ocr.font?api-version=2024-02-29-preview" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: %DI_KEY%" --data-ascii "{'urlSource': '<document-url>'}"

استجابة POST

تتلقى استجابة 202 (Success) تتضمن عنوانا Operation-location . استخدم قيمة هذا العنوان لاسترداد نتائج الاستجابة.

تظهر لقطة الشاشة استجابة POST مع تمييز موقع العملية.

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

بعد استدعاء Analyze document واجهة برمجة التطبيقات، قم باستدعاء [Get analyze result}(/rest/api/aiservices/document-models/get-analyze-result?view=rest-aiservices-2024-02-29-preview&preserve-view=true&tabs=HTTP) API للحصول على حالة العملية والبيانات المستخرجة.

لا تنسق أداة سطر أوامر cURL استجابات واجهة برمجة التطبيقات التي تحتوي على محتوى JSON، مما قد يجعل من الصعب قراءة المحتوى. لتنسيق استجابة JSON، قم بتضمين حرف توجيه متبوعا بأداة تنسيق JSON مع طلب GET الخاص بك.

استخدم أداة NodeJS json كمنسق JSON ل cURL. إذا لم يكن لديك Node.js مثبتة، فقم بتنزيل أحدث إصدار وتثبيته.

  1. افتح نافذة وحدة تحكم وقم بتثبيت أداة json باستخدام الأمر التالي:

    npm install -g jsontool
    
  2. طباعة جميلة إخراج JSON عن طريق تضمين حرف | json توجيه مع طلبات GET الخاصة بك.

    curl -i -X GET "<endpoint>documentintelligence/documentModels/prebuilt-read/analyzeResults/0e49604a-2d8e-4b15-b6b8-bb456e5d3e0a?api-version=2024-02-29-preview"-H "Ocp-Apim-Subscription-Key: <subscription key>" | json
    

طلب GET

قبل تشغيل الأمر التالي، قم بإجراء هذه التغييرات:

  • استبدل <استجابة> POST بالعنوان Operation-location من استجابة POST.
  • استبدل <DI_KEY بالمتغير لمتغير البيئة الخاص بك إذا كان يختلف عن الاسم في التعليمات البرمجية.
  • استبدل *<json-tool> بأداة تنسيق JSON.
curl -i -X GET "<POST response>" -H "Ocp-Apim-Subscription-Key: %DI_KEY%" | `<json-tool>`

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

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

قم بزيارة مستودع نماذج Azure على GitHub لعرض الاستجابة GET لكل نموذج من نماذج Document Intelligence:

النموذج عنوان URL للإخراج
نموذج القراءة قراءة إخراج النموذج
نموذج تخطيط إخراج نموذج التخطيط
نموذج الضريبة W-2 إخراج نموذج الضريبة W-2
نموذج الفاتورة إخراج نموذج الفاتورة
نموذج الإيصال إخراج نموذج الإيصال
نموذج مستند المعرف إخراج نموذج مستند المعرف

إشعار

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • تم تثبيت أداة سطر أوامر cURL. يتم شحن Windows 10 وWindows 11 مع نسخة من cURL. في موجه الأوامر، اكتب الأمر cURL التالي. إذا تم عرض خيارات التعليمات، يتم تثبيت cURL في بيئة Windows.

    curl -help
    

    إذا لم يتم تثبيت cURL، يمكنك الحصول عليه هنا:

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

تعيين متغيرات البيئة الخاصة بك

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

هام

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

لتعيين متغير البيئة لمفتاح مورد Document Intelligence، افتح نافذة وحدة تحكم، واتبع الإرشادات الخاصة بنظام التشغيل وبيئة التطوير. استبدل yourKey> وEndpoint>< بالقيم من المورد الخاص بك في مدخل Microsoft Azure.<

متغيرات البيئة في Windows غير حساسة لحالة الأحرف. عادة ما يتم الإعلان عنها بأحرف كبيرة، مع كلمات مرتبطة بتسطير أسفل السطر. في موجه الأوامر، قم بتشغيل الأوامر التالية:

  1. تعيين متغير المفتاح الخاص بك:

    setx DI_KEY <yourKey>
    
  2. تعيين متغير نقطة النهاية

    setx DI_ENDPOINT <yourEndpoint>
    
  3. أغلق نافذة موجه الأوامر بعد تعيين متغيرات البيئة الخاصة بك. تبقى القيم حتى تقوم بتغييرها مرة أخرى.

  4. أعد تشغيل أي برامج قيد التشغيل تقرأ متغير البيئة. على سبيل المثال، إذا كنت تستخدم Visual Studio أو Visual Studio Code كمحرر، فعد التشغيل قبل تشغيل نموذج التعليمات البرمجية.

فيما يلي بعض الأوامر الأكثر فائدة لاستخدامها مع متغيرات البيئة:

الأمر الإجراء مثال
setx VARIABLE_NAME= احذف متغير البيئة عن طريق تعيين القيمة إلى سلسلة فارغة. setx DI_KEY=
setx VARIABLE_NAME=value تعيين قيمة متغير بيئة أو تغييرها. setx DI_KEY=<yourKey>
set VARIABLE_NAME عرض قيمة متغير بيئة معين. set DI_KEY
set عرض كافة متغيرات البيئة. set

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

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

استخدم الجدول التالي كمرجع. استبدل <modelId> و <document-url> بالقيم المطلوبة:

النموذج معرف النموذج الوصف عنوان 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
نموذج استمارة W-2 prebuilt-tax.us.w2 نموذج W-2 نموذجي 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

طلب نشر

افتح نافذة وحدة تحكم وقم بتشغيل الأمر cURL التالي. تتضمن الأوامر نقطة النهاية ومتغيرات البيئة الرئيسية التي تم إنشاؤها مسبقا في قسم متغيرات البيئة المحددة. استبدل هذه المتغيرات إذا كانت أسماء المتغيرات تختلف. تذكر استبدال معلمات modelId> و <document-url>.<

curl -i -X POST "%FR_ENDPOINT%formrecognizer/documentModels/<modelId>:analyze?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: %FR_KEY%" --data-ascii "{'urlSource': '<document-url>'}"

لتمكين قدرات الوظيفة الإضافية، استخدم معلمة features الاستعلام في طلب POST. تتوفر أربع قدرات إضافية مع 2023-07-31 إصدار (GA): ocr.highResolution وocr.formula وocr.font و queryFields.premium. لمعرفة المزيد حول كل من القدرات، راجع النماذج المخصصة.

يمكنك فقط استدعاء إمكانيات highResolution والصيغة والخطلنموذج القراءة والتخطيط، وقدرة queryFields لنموذج "المستندات العامة". يوضح المثال التالي كيفية استدعاء إمكانيات highResolution والصيغة والخط لنموذج التخطيط.

curl -i -X POST "%FR_ENDPOINT%formrecognizer/documentModels/prebuilt-layout:analyze?features=ocr.highResolution,ocr.formula,ocr.font?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: %FR_KEY%" --data-ascii "{'urlSource': '<document-url>'}"

استجابة POST

تتلقى استجابة 202 (Success) تتضمن عنوانا Operation-location . استخدم قيمة هذا العنوان لاسترداد نتائج الاستجابة.

تظهر لقطة الشاشة استجابة POST مع تمييز موقع العملية.

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

بعد استدعاء Analyze document واجهة برمجة التطبيقات، قم باستدعاء [Get analyze result}(/rest/api/aiservices/document-models/get-analyze-result?view=rest-aiservices-2023-07-31&preserve-view=true&s=HTTP) API للحصول على حالة العملية والبيانات المستخرجة.

لا تنسق أداة سطر أوامر cURL استجابات واجهة برمجة التطبيقات التي تحتوي على محتوى JSON، مما قد يجعل من الصعب قراءة المحتوى. لتنسيق استجابة JSON، قم بتضمين حرف توجيه متبوعا بأداة تنسيق JSON مع طلب GET الخاص بك.

استخدم أداة NodeJS json كمنسق JSON ل cURL. إذا لم يكن لديك Node.js مثبتة، فقم بتنزيل أحدث إصدار وتثبيته.

  1. افتح نافذة وحدة تحكم وقم بتثبيت أداة json باستخدام الأمر التالي:

    npm install -g jsontool
    
  2. طباعة جميلة إخراج JSON عن طريق تضمين حرف | json توجيه مع طلبات GET الخاصة بك.

    curl -i -X GET "<endpoint>formrecognizer/documentModels/prebuilt-read/analyzeResults/0e49604a-2d8e-4b15-b6b8-bb456e5d3e0a?api-version=2023-07-31"-H "Ocp-Apim-Subscription-Key: <subscription key>" | json
    

طلب GET

قبل تشغيل الأمر التالي، قم بإجراء هذه التغييرات:

  • استبدل <استجابة> POST بالعنوان Operation-location من استجابة POST.
  • استبدل <FR_KEY بالمتغير لمتغير البيئة الخاص بك إذا كان يختلف عن الاسم في التعليمات البرمجية.
  • استبدل *<json-tool> بأداة تنسيق JSON.
curl -i -X GET "<POST response>" -H "Ocp-Apim-Subscription-Key: %FR_KEY%" | `<json-tool>`

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

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

قم بزيارة مستودع نماذج Azure على GitHub لعرض الاستجابة GET لكل نموذج من نماذج Document Intelligence:

النموذج عنوان URL للإخراج
نموذج القراءة قراءة إخراج النموذج
نموذج تخطيط إخراج نموذج التخطيط
نموذج الضريبة W-2 إخراج نموذج الضريبة W-2
نموذج الفاتورة إخراج نموذج الفاتورة
نموذج الإيصال إخراج نموذج الإيصال
نموذج مستند المعرف إخراج نموذج مستند المعرف

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

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

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

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

هام

يستهدف هذا المشروع واجهة برمجة تطبيقات REST للذكاء المستند الإصدار 2.1.

تستخدم التعليمات البرمجية في هذه المقالة أساليب متزامنة وتخزين بيانات الاعتماد غير المؤمنة.

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • إصدار Visual Studio IDE أو الإصدار الحالي من .NET Core.

  • كائن التخزين الثنائي كبير الحجم من Azure الذي يحتوي على مجموعة من بيانات التدريب. راجع إنشاء نموذج مخصص وتدريبه للحصول على تلميحات وخيارات لتجميع مجموعة بيانات التدريب الخاصة بك. بالنسبة لهذا المشروع، يمكنك استخدام الملفات ضمن مجلد Train لمجموعة بيانات العينة. قم بتنزيل sample_data.zip واستخراجها.

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

إعداد بيئة البرمجة

في نافذة وحدة التحكم، استخدم dotnet new الأمر لإنشاء تطبيق وحدة تحكم جديد بالاسم formrecognizer-project. ينشئ هذا الأمر مشروع مرحبًا بالعالم «Hello World» بلغة C#‎ بسيطًا مع ملف مصدر واحد: program.cs.

dotnet new console -n formrecognizer-project

غيّر دليلك إلى مجلد التطبيق المنشأ حديثاً. يمكنك إنشاء التطبيق باستخدام الأمر التالي:

dotnet build

يجب ألا يحتوي إخراج البناء على تحذيرات أو أخطاء.

...
Build succeeded.
 0 Warning(s)
 0 Error(s)
...

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

ضمن دليل التطبيق، قم بتثبيت مكتبة عميل Document Intelligence ل .NET باستخدام الأمر التالي:

dotnet add package Azure.AI.FormRecognizer --version 3.1.1

من دليل المشروع، افتح ملف Program.cs في محرر أو IDE. أضِف توجيهات using التالية:

using Azure;
using Azure.AI.FormRecognizer;  
using Azure.AI.FormRecognizer.Models;
using Azure.AI.FormRecognizer.Training;

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

فيProgram فئة التطبيق، أنشئ متغيرات لمفتاح المورد ونقطة النهاية.

هام

انتقل إلى مدخل Azure. إذا تم نشر مورد Document Intelligence الذي أنشأته في قسم المتطلبات الأساسية بنجاح، فحدد الزر Go to Resource ضمن Next Steps. في قائمة التنقل اليسرى، ضمن Resource Management، حدد Keys and Endpoint.

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

private static readonly string endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
private static readonly string apiKey = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE";
private static readonly AzureKeyCredential credential = new AzureKeyCredential(apiKey);

في أسلوب التطبيق Main ، أضف استدعاء إلى المهام غير المتزامنة المستخدمة في هذا المشروع:

static void Main(string[] args) {
  // new code:
  var recognizeContent = RecognizeContent(recognizerClient);
  Task.WaitAll(recognizeContent);

  var analyzeReceipt = AnalyzeReceipt(recognizerClient, receiptUrl);
  Task.WaitAll(analyzeReceipt);

  var analyzeBusinessCard = AnalyzeBusinessCard(recognizerClient, bcUrl);
  Task.WaitAll(analyzeBusinessCard);

  var analyzeInvoice = AnalyzeInvoice(recognizerClient, invoiceUrl);
  Task.WaitAll(analyzeInvoice);

  var analyzeId = AnalyzeId(recognizerClient, idUrl);
  Task.WaitAll(analyzeId);

  var trainModel = TrainModel(trainingClient, trainingDataUrl);
  Task.WaitAll(trainModel);

  var trainModelWithLabels = TrainModelWithLabels(trainingClient, trainingDataUrl);
  Task.WaitAll(trainModel);

  var analyzeForm = AnalyzePdfForm(recognizerClient, modelId, formUrl);
  Task.WaitAll(analyzeForm);

  var manageModels = ManageModels(trainingClient, trainingDataUrl);
  Task.WaitAll(manageModels);

}

استخدام نموذج الكائن

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

FormRecognizerClient يوفر العمليات التالية:

  • التعرف على حقول النماذج والمحتوى باستخدام نماذج مخصصة مدربة لتحليل النماذج المخصصة. يتم إرجاع هذه القيم في مجموعة كائنات RecognizedForm. راجع تحليل النماذج باستخدام نموذج مخصص.
  • التعرف على محتوى النموذج، بما في ذلك الجداول والخطوط والكلمات، دون الحاجة إلى تدريب نموذج. يتم إرجاع محتوى النموذج في مجموعة من FormPage كائن. راجع تحليل التخطيط.
  • التعرف على الحقول المشتركة من الإيصالات الأمريكية وبطاقات العمل والفواتير ومستندات المعرف باستخدام نموذج مدرب مسبقا على خدمة Document Intelligence.

FormTrainingClient يوفر عمليات إلى:

  • تدريب النماذج المخصصة لتحليل جميع الحقول والقيم الموجودة في النماذج المخصصة. CustomFormModel يتم إرجاع يشير إلى أنواع النماذج التي يحللها النموذج والحقول التي يستخرجها لكل نوع نموذج.
  • تدريب نماذج مخصصة لتحليل حقول وقيم معينة تحددها عن طريق تسمية النماذج المخصصة. CustomFormModel يتم إرجاع الذي يشير إلى الحقول التي يستخرجها النموذج والدقة المقدرة لكل حقل.
  • إدارة النماذج التي تم إنشاؤها في حسابك.
  • انسخ نموذجا مخصصا من مورد Document Intelligence إلى آخر.

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

إشعار

يمكن أيضا تدريب النماذج باستخدام واجهة مستخدم رسومية مثل أداة تسمية العينة.

مصادقة العميل

ضمن Main، أنشئ أسلوبا باسم AuthenticateClient. استخدم هذا الأسلوب في مهام أخرى لمصادقة طلباتك إلى خدمة Document Intelligence. يستخدم هذا الأسلوب عنصر AzureKeyCredential، حتى يمكنك تحديث المفتاح دون إنشاء عناصر عميل جديدة إذا لزم الأمر.

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

كرر الخطوات لأسلوب جديد يصادق عميل تدريب.

static private FormTrainingClient AuthenticateTrainingClient()
{
    var credential = new AzureKeyCredential(apiKey);
    var client = new FormTrainingClient(new Uri(endpoint), credential);
    return client;
}

الحصول على أصول للاختبار

تحتاج أيضا إلى إضافة مراجع إلى عناوين URL لبيانات التدريب والاختبار. أضف هذه المراجع إلى جذر الفئة الخاصة بك Program .

  1. لاسترداد عنوان URL SAS لبيانات تدريب النموذج المخصص، انتقل إلى مورد التخزين في مدخل Microsoft Azure وحدد حاويات تخزين>البيانات.

  2. انتقل إلى الحاوية، وانقر بزر الماوس الأيمن، وحدد إنشاء SAS.

    احصل على SAS للحاوية الخاصة بك، وليس لحساب التخزين نفسه.

  3. تأكد من تحديد أذونات القراءة والكتابة والحذف والقائمة، وحدد إنشاء رمز SAS المميز وعنوان URL.

  4. انسخ القيمة الموجودة في قسم URL إلى موقع مؤقت. يجب أن يكون بالشكل: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

كرر الخطوات السابقة للحصول على عنوان URL SAS لمستند فردي في حاوية تخزين الكائن الثنائي كبير الحجم. احفظ عنوان URL SAS هذا في موقع مؤقت أيضا.

احفظ عنوان URL للصورة النموذجية المضمنة. تتوفر هذه الصورة أيضا على GitHub).

string trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE";
string formUrl = "PASTE_YOUR_FORM_RECOGNIZER_FORM_URL_HERE";
string receiptUrl = "https://docs.microsoft.com/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg";
string bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg";
string invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";

string idUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg";

تحليل التخطيط

يمكنك استخدام Document Intelligence لتحليل الجداول والخطوط والكلمات في المستندات، دون الحاجة إلى تدريب نموذج. القيمة التي تم إرجاعها هي مجموعة من كائنات FormPage . يوجد عنصر واحد لكل صفحة في المستند المرسل. لمزيد من المعلومات حول استخراج التخطيط، راجع نموذج تخطيط تحليل معلومات المستند.

لتحليل محتوى ملف في URI معين، استخدم طريقة StartRecognizeContentFromUri.

private static async Task RecognizeContent(FormRecognizerClient recognizerClient)
{
    var invoiceUri = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";
    FormPageCollection formPages = await recognizerClient
        .StartRecognizeContentFromUri(new Uri(invoiceUri))
        .WaitForCompletionAsync();

تلميح

يمكنك أيضاً الحصول على محتوى من ملف محلي. راجع أساليب FormRecognizerClient، مثل StartRecognizeContent. أو، راجع نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

تعمل بقية هذه المهمة على طباعة معلومات المحتوى إلى وحدة التحكم.

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

تبدو النتيجة مثل الإخراج التالي.

Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    Line 5 has 3 words, and text: '6000 Redmond, WA'.
    Line 6 has 3 words, and text: 'Sunnayvale, CA 87659'.
    Line 7 has 1 word, and text: '99243'.
    Line 8 has 2 words, and text: 'Invoice Number'.
    Line 9 has 2 words, and text: 'Invoice Date'.
    Line 10 has 3 words, and text: 'Invoice Due Date'.
    Line 11 has 1 word, and text: 'Charges'.
    Line 12 has 2 words, and text: 'VAT ID'.
    Line 13 has 1 word, and text: '34278587'.
    Line 14 has 1 word, and text: '6/18/2017'.
    Line 15 has 1 word, and text: '6/24/2017'.
    Line 16 has 1 word, and text: '$56,651.49'.
    Line 17 has 1 word, and text: 'PT'.
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    Cell (0, 3) contains text: 'Charges'.
    Cell (0, 5) contains text: 'VAT ID'.
    Cell (1, 0) contains text: '34278587'.
    Cell (1, 1) contains text: '6/18/2017'.
    Cell (1, 2) contains text: '6/24/2017'.
    Cell (1, 3) contains text: '$56,651.49'.
    Cell (1, 5) contains text: 'PT'.

تحليل الإيصالات

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

لتحليل الإيصالات من عنوان URL، استخدم الطريقة StartRecognizeReceiptsFromUri.

private static async Task AnalyzeReceipt(
    FormRecognizerClient recognizerClient, string receiptUri)
{
    RecognizedFormCollection receipts = await recognizerClient.StartRecognizeReceiptsFromUri(new Uri(receiptUrl)).WaitForCompletionAsync();

تلميح

يمكنك أيضًا تحليل صور الإيصالات المحلية. راجع أساليب FormRecognizerClient، مثل StartRecognizeReceipts. أو، راجع نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

القيمة التي تم إرجاعها هي مجموعة من RecognizedForm الكائنات. يوجد عنصر واحد لكل صفحة في المستند المرسل. تعالج التعليمات البرمجية التالية إيصالاً عند عنوان URI محدد وتطبع الحقول والقيم الرئيسية إلى وحدة التحكم.

    foreach (RecognizedForm receipt in receipts)
    {
        FormField merchantNameField;
        if (receipt.Fields.TryGetValue("MerchantName", out merchantNameField))
        {
            if (merchantNameField.Value.ValueType == FieldValueType.String)
            {
                string merchantName = merchantNameField.Value.AsString();

                Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}");
            }
        }

        FormField transactionDateField;
        if (receipt.Fields.TryGetValue("TransactionDate", out transactionDateField))
        {
            if (transactionDateField.Value.ValueType == FieldValueType.Date)
            {
                DateTime transactionDate = transactionDateField.Value.AsDate();

                Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}");
            }
        }

        FormField itemsField;
        if (receipt.Fields.TryGetValue("Items", out itemsField))
        {
            if (itemsField.Value.ValueType == FieldValueType.List)
            {
                foreach (FormField itemField in itemsField.Value.AsList())
                {
                    Console.WriteLine("Item:");

                    if (itemField.Value.ValueType == FieldValueType.Dictionary)
                    {
                        IReadOnlyDictionary<string, FormField> itemFields = itemField.Value.AsDictionary();

                        FormField itemNameField;
                        if (itemFields.TryGetValue("Name", out itemNameField))
                        {
                            if (itemNameField.Value.ValueType == FieldValueType.String)
                            {
                                string itemName = itemNameField.Value.AsString();

                                Console.WriteLine($"    Name: '{itemName}', with confidence {itemNameField.Confidence}");
                            }
                        }

                        FormField itemTotalPriceField;
                        if (itemFields.TryGetValue("TotalPrice", out itemTotalPriceField))
                        {
                            if (itemTotalPriceField.Value.ValueType == FieldValueType.Float)
                            {
                                float itemTotalPrice = itemTotalPriceField.Value.AsFloat();

                                Console.WriteLine($"    Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}");
                            }
                        }
                    }
                }
            }
        }
        FormField totalField;
        if (receipt.Fields.TryGetValue("Total", out totalField))
        {
            if (totalField.Value.ValueType == FieldValueType.Float)
            {
                float total = totalField.Value.AsFloat();

                Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'");
            }
        }
    }
}

تبدو النتيجة مثل الإخراج التالي.

Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    Line 5 has 3 words, and text: '6000 Redmond, WA'.
    Line 6 has 3 words, and text: 'Sunnayvale, CA 87659'.
    Line 7 has 1 word, and text: '99243'.
    Line 8 has 2 words, and text: 'Invoice Number'.
    Line 9 has 2 words, and text: 'Invoice Date'.
    Line 10 has 3 words, and text: 'Invoice Due Date'.
    Line 11 has 1 word, and text: 'Charges'.
    Line 12 has 2 words, and text: 'VAT ID'.
    Line 13 has 1 word, and text: '34278587'.
    Line 14 has 1 word, and text: '6/18/2017'.
    Line 15 has 1 word, and text: '6/24/2017'.
    Line 16 has 1 word, and text: '$56,651.49'.
    Line 17 has 1 word, and text: 'PT'.
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    Cell (0, 3) contains text: 'Charges'.
    Cell (0, 5) contains text: 'VAT ID'.
    Cell (1, 0) contains text: '34278587'.
    Cell (1, 1) contains text: '6/18/2017'.
    Cell (1, 2) contains text: '6/24/2017'.
    Cell (1, 3) contains text: '$56,651.49'.
    Cell (1, 5) contains text: 'PT'.
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'

تحليل بطاقات العمل

يوضح هذا القسم كيفية تحليل واستخراج الحقول المشتركة من بطاقات العمل الإنجليزية باستخدام نموذج مدرب مسبقا. لمزيد من المعلومات حول تحليل بطاقة العمل، راجع نموذج بطاقة عمل Document Intelligence.

لتحليل بطاقات العمل من عنوان URL، استخدم الطريقة StartRecognizeBusinessCardsFromUriAsync.

private static async Task AnalyzeBusinessCard(
FormRecognizerClient recognizerClient, string bcUrl) {
  RecognizedFormCollection businessCards = await recognizerClient.StartRecognizeBusinessCardsFromUriAsync(bcUrl).WaitForCompletionAsync();

تلميح

يمكنك أيضاً تحليل صور بطاقات العمل المحلية. راجع أساليب FormRecognizerClient، مثل StartRecognizeBusinessCards. أو، راجع نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

تعالج التعليمات البرمجية التالية بطاقة عمل لدى عنوان URI محدد وتطبع الحقول والقيم الرئيسية إلى وحدة التحكم.

  foreach(RecognizedForm businessCard in businessCards) {
    FormField ContactNamesField;
    if (businessCard.Fields.TryGetValue("ContactNames", out ContactNamesField)) {
      if (ContactNamesField.Value.ValueType == FieldValueType.List) {
        foreach(FormField contactNameField in ContactNamesField.Value.AsList()) {
          Console.WriteLine($ "Contact Name: {contactNameField.ValueData.Text}");

          if (contactNameField.Value.ValueType == FieldValueType.Dictionary) {
            IReadOnlyDictionary < string,
            FormField > contactNameFields = contactNameField.Value.AsDictionary();

            FormField firstNameField;
            if (contactNameFields.TryGetValue("FirstName", out firstNameField)) {
              if (firstNameField.Value.ValueType == FieldValueType.String) {
                string firstName = firstNameField.Value.AsString();

                Console.WriteLine($ "    First Name: '{firstName}', with confidence {firstNameField.Confidence}");
              }
            }

            FormField lastNameField;
            if (contactNameFields.TryGetValue("LastName", out lastNameField)) {
              if (lastNameField.Value.ValueType == FieldValueType.String) {
                string lastName = lastNameField.Value.AsString();

                Console.WriteLine($ "    Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
              }
            }
          }
        }
      }
    }

    FormField jobTitlesFields;
    if (businessCard.Fields.TryGetValue("JobTitles", out jobTitlesFields)) {
      if (jobTitlesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField jobTitleField in jobTitlesFields.Value.AsList()) {
          if (jobTitleField.Value.ValueType == FieldValueType.String) {
            string jobTitle = jobTitleField.Value.AsString();

            Console.WriteLine($ "  Job Title: '{jobTitle}', with confidence {jobTitleField.Confidence}");
          }
        }
      }
    }

    FormField departmentFields;
    if (businessCard.Fields.TryGetValue("Departments", out departmentFields)) {
      if (departmentFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField departmentField in departmentFields.Value.AsList()) {
          if (departmentField.Value.ValueType == FieldValueType.String) {
            string department = departmentField.Value.AsString();

            Console.WriteLine($ "  Department: '{department}', with confidence {departmentField.Confidence}");
          }
        }
      }
    }

    FormField emailFields;
    if (businessCard.Fields.TryGetValue("Emails", out emailFields)) {
      if (emailFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField emailField in emailFields.Value.AsList()) {
          if (emailField.Value.ValueType == FieldValueType.String) {
            string email = emailField.Value.AsString();

            Console.WriteLine($ "  Email: '{email}', with confidence {emailField.Confidence}");
          }
        }
      }
    }

    FormField websiteFields;
    if (businessCard.Fields.TryGetValue("Websites", out websiteFields)) {
      if (websiteFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField websiteField in websiteFields.Value.AsList()) {
          if (websiteField.Value.ValueType == FieldValueType.String) {
            string website = websiteField.Value.AsString();

            Console.WriteLine($ "  Website: '{website}', with confidence {websiteField.Confidence}");
          }
        }
      }
    }

    FormField mobilePhonesFields;
    if (businessCard.Fields.TryGetValue("MobilePhones", out mobilePhonesFields)) {
      if (mobilePhonesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField mobilePhoneField in mobilePhonesFields.Value.AsList()) {
          if (mobilePhoneField.Value.ValueType == FieldValueType.PhoneNumber) {
            string mobilePhone = mobilePhoneField.Value.AsPhoneNumber();

            Console.WriteLine($ "  Mobile phone number: '{mobilePhone}', with confidence {mobilePhoneField.Confidence}");
          }
        }
      }
    }

    FormField otherPhonesFields;
    if (businessCard.Fields.TryGetValue("OtherPhones", out otherPhonesFields)) {
      if (otherPhonesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField otherPhoneField in otherPhonesFields.Value.AsList()) {
          if (otherPhoneField.Value.ValueType == FieldValueType.PhoneNumber) {
            string otherPhone = otherPhoneField.Value.AsPhoneNumber();

            Console.WriteLine($ "  Other phone number: '{otherPhone}', with confidence {otherPhoneField.Confidence}");
          }
        }
      }
    }

    FormField faxesFields;
    if (businessCard.Fields.TryGetValue("Faxes", out faxesFields)) {
      if (faxesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField faxField in faxesFields.Value.AsList()) {
          if (faxField.Value.ValueType == FieldValueType.PhoneNumber) {
            string fax = faxField.Value.AsPhoneNumber();

            Console.WriteLine($ "  Fax phone number: '{fax}', with confidence {faxField.Confidence}");
          }
        }
      }
    }

    FormField addressesFields;
    if (businessCard.Fields.TryGetValue("Addresses", out addressesFields)) {
      if (addressesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField addressField in addressesFields.Value.AsList()) {
          if (addressField.Value.ValueType == FieldValueType.String) {
            string address = addressField.Value.AsString();

            Console.WriteLine($ "  Address: '{address}', with confidence {addressField.Confidence}");
          }
        }
      }
    }

    FormField companyNamesFields;
    if (businessCard.Fields.TryGetValue("CompanyNames", out companyNamesFields)) {
      if (companyNamesFields.Value.ValueType == FieldValueType.List) {
        foreach(FormField companyNameField in companyNamesFields.Value.AsList()) {
          if (companyNameField.Value.ValueType == FieldValueType.String) {
            string companyName = companyNameField.Value.AsString();

            Console.WriteLine($ "  Company name: '{companyName}', with confidence {companyNameField.Confidence}");
          }
        }
      }
    }
  }
}

تحليل الفواتير

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

لتحليل الفواتير من عنوان URL، استخدم أسلوب StartRecognizeInvoicesFromUriAsync.

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

تلميح

يمكنك أيضًا تحليل صور الفواتير المحلية. راجع أساليب FormRecognizerClient، مثل StartRecognizeInvoices. أو، راجع نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

تعالج التعليمات البرمجية التالية فاتورة لدى عنوان URI محدد وتطبع الحقول والقيم الرئيسية إلى وحدة التحكم.

  RecognizedForm invoice = invoices.Single();

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

تحليل مستندات معرف

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

لتحليل مستندات المعرّف من عنوان URI، استخدم الأسلوب StartRecognizeIdentityDocumentsFromUriAsync.

private static async Task AnalyzeId(
FormRecognizerClient recognizerClient, string idUrl) {
  RecognizedFormCollection identityDocument = await recognizerClient.StartRecognizeIdDocumentsFromUriAsync(idUrl).WaitForCompletionAsync();

تلميح

يمكنك أيضًا تحليل صور مستندات معرف محلي. راجع أساليب FormRecognizerClient، مثل StartRecognizeIdentityDocumentsAsync. راجع أيضا نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

تقوم التعليمات البرمجية التالية بمعالجة مستند معرف في URI المعطى وطباعة الحقول الرئيسية والقيم إلى وحدة التحكم.

RecognizedForm identityDocument = identityDocuments.Single();

if (identityDocument.Fields.TryGetValue("Address", out FormField addressField)) {
  if (addressField.Value.ValueType == FieldValueType.String) {
    string address = addressField.Value.AsString();
    Console.WriteLine($ "Address: '{address}', with confidence {addressField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("CountryRegion", out FormField countryRegionField)) {
  if (countryRegionField.Value.ValueType == FieldValueType.CountryRegion) {
    string countryRegion = countryRegionField.Value.AsCountryRegion();
    Console.WriteLine($ "CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("DateOfBirth", out FormField dateOfBirthField)) {
  if (dateOfBirthField.Value.ValueType == FieldValueType.Date) {
    DateTime dateOfBirth = dateOfBirthField.Value.AsDate();
    Console.WriteLine($ "Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("DateOfExpiration", out FormField dateOfExpirationField)) {
  if (dateOfExpirationField.Value.ValueType == FieldValueType.Date) {
    DateTime dateOfExpiration = dateOfExpirationField.Value.AsDate();
    Console.WriteLine($ "Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
  }
}

if (identityDocument.Fields.TryGetValue("DocumentNumber", out FormField documentNumberField)) {
  if (documentNumberField.Value.ValueType == FieldValueType.String) {
    string documentNumber = documentNumberField.Value.AsString();
    Console.WriteLine($ "Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
  }
  RecognizedForm identityDocument = identityDocuments.Single();

  if (identityDocument.Fields.TryGetValue("Address", out FormField addressField)) {
    if (addressField.Value.ValueType == FieldValueType.String) {
      string address = addressField.Value.AsString();
      Console.WriteLine($ "Address: '{address}', with confidence {addressField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("CountryRegion", out FormField countryRegionField)) {
    if (countryRegionField.Value.ValueType == FieldValueType.CountryRegion) {
      string countryRegion = countryRegionField.Value.AsCountryRegion();
      Console.WriteLine($ "CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("DateOfBirth", out FormField dateOfBirthField)) {
    if (dateOfBirthField.Value.ValueType == FieldValueType.Date) {
      DateTime dateOfBirth = dateOfBirthField.Value.AsDate();
      Console.WriteLine($ "Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("DateOfExpiration", out FormField dateOfExpirationField)) {
    if (dateOfExpirationField.Value.ValueType == FieldValueType.Date) {
      DateTime dateOfExpiration = dateOfExpirationField.Value.AsDate();
      Console.WriteLine($ "Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("DocumentNumber", out FormField documentNumberField)) {
    if (documentNumberField.Value.ValueType == FieldValueType.String) {
      string documentNumber = documentNumberField.Value.AsString();
      Console.WriteLine($ "Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("FirstName", out FormField firstNameField)) {
    if (firstNameField.Value.ValueType == FieldValueType.String) {
      string firstName = firstNameField.Value.AsString();
      Console.WriteLine($ "First Name: '{firstName}', with confidence {firstNameField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("LastName", out FormField lastNameField)) {
    if (lastNameField.Value.ValueType == FieldValueType.String) {
      string lastName = lastNameField.Value.AsString();
      Console.WriteLine($ "Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
    }
  }

  if (identityDocument.Fields.TryGetValue("Region", out FormField regionfield)) {
    if (regionfield.Value.ValueType == FieldValueType.String) {
      string region = regionfield.Value.AsString();
      Console.WriteLine($ "Region: '{region}', with confidence {regionfield.Confidence}");
    }
  }

تدريب نموذج مخصص

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

إشعار

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

التدريب على نموذج بدون تسميات

تدريب النماذج المخصصة لتحليل جميع الحقول والقيم الموجودة في النماذج المخصصة لك دون تسمية مستندات التدريب يدويًا. تعمل الطريقة التالية على تدريب نموذج على مجموعة معينة من المستندات وتطبع حالة النموذج إلى وحدة التحكم.

private static async Task<String> TrainModel(
    FormTrainingClient trainingClient, string trainingDataUrl)
{
    CustomFormModel model = await trainingClient
    .StartTrainingAsync(new Uri(trainingDataUrl), useTrainingLabels: false)
    .WaitForCompletionAsync();

    Console.WriteLine($"Custom Model Info:");
    Console.WriteLine($"    Model Id: {model.ModelId}");
    Console.WriteLine($"    Model Status: {model.Status}");
    Console.WriteLine($"    Training model started on: {model.TrainingStartedOn}");
    Console.WriteLine($"    Training model completed on: {model.TrainingCompletedOn}");

يحتوي الكائن الذي تم CustomFormModel إرجاعه على معلومات حول أنواع النماذج التي يمكن للطراز تحليلها والحقول التي يمكن استخراجها من كل نوع نموذج. تطبع كتلة التعليمات البرمجية التالية هذه المعلومات إلى وحدة التحكم.

foreach (CustomFormSubmodel submodel in model.Submodels)
{
    Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
    foreach (CustomFormModelField field in submodel.Fields.Values)
    {
        Console.Write($"    FieldName: {field.Name}");
        if (field.Label != null)
        {
            Console.Write($", FieldLabel: {field.Label}");
        }
        Console.WriteLine("");
    }
}

وأخيرًا، استرجع معرّف النموذج المدرَّب لاستخدامه في الخطوات اللاحقة.

    return model.ModelId;
}

تم اقتطاع هذا الإخراج لسهولة القراءة.

Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    ...
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    Cell (0, 3) contains text: 'Charges'.
    ...
Custom Model Info:
    Model Id: 95035721-f19d-40eb-8820-0c806b42798b
    Model Status: Ready
    Training model started on: 8/24/2020 6:36:44 PM +00:00
    Training model completed on: 8/24/2020 6:36:50 PM +00:00
Submodel Form Type: form-95035721-f19d-40eb-8820-0c806b42798b
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    ...
Custom Model Info:
    Model Id: e7a1181b-1fb7-40be-bfbe-1ee154183633
    Model Status: Ready
    Training model started on: 8/24/2020 6:36:44 PM +00:00
    Training model completed on: 8/24/2020 6:36:52 PM +00:00
Submodel Form Type: form-0
    FieldName: field-0, FieldLabel: Additional Notes:
    FieldName: field-1, FieldLabel: Address:
    FieldName: field-2, FieldLabel: Company Name:
    FieldName: field-3, FieldLabel: Company Phone:
    FieldName: field-4, FieldLabel: Dated As:
    FieldName: field-5, FieldLabel: Details
    FieldName: field-6, FieldLabel: Email:
    FieldName: field-7, FieldLabel: Hero Limited
    FieldName: field-8, FieldLabel: Name:
    FieldName: field-9, FieldLabel: Phone:
    ...

تدريب نموذج باستخدام تسميات

يمكنك أيضًا تدريب نماذج مخصصة عن طريق وضع التسميات يدويًا على مستندات التدريب. يؤدي التدريب باستخدام التسميات إلى أداء أفضل في بعض السيناريوهات. للتدريب باستخدام التسميات، تحتاج إلى ملفات معلومات التسمية الخاصة (<اسم الملف>.pdf.labels.json) في حاوية مخزن الكائنات الثنائية الكبيرة إلى جانب مستندات التدريب. توفر أداة تسمية نموذج تحليل معلومات المستند واجهة مستخدم لمساعدتك في إنشاء ملفات التسمية هذه. بعد الحصول عليها، يمكنك استدعاء StartTrainingAsync الأسلوب مع تعيين المعلمة uselabels إلى true.

private static async Task<Guid> TrainModelWithLabelsAsync(
    FormRecognizerClient trainingClient, string trainingDataUrl)
{
    CustomFormModel model = await trainingClient
    .StartTrainingAsync(new Uri(trainingDataUrl), useTrainingLabels: true)
    .WaitForCompletionAsync();
    Console.WriteLine($"Custom Model Info:");
    Console.WriteLine($"    Model Id: {model.ModelId}");
    Console.WriteLine($"    Model Status: {model.Status}");
    Console.WriteLine($"    Training model started on: {model.TrainingStartedOn}");
    Console.WriteLine($"    Training model completed on: {model.TrainingCompletedOn}");

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

    foreach (CustomFormSubmodel submodel in model.Submodels)
    {
        Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
        foreach (CustomFormModelField field in submodel.Fields.Values)
        {
            Console.Write($"    FieldName: {field.Name}");
            if (field.Label != null)
            {
                Console.Write($", FieldLabel: {field.Label}");
            }
            Console.WriteLine("");
        }
    }
    return model.ModelId;
}

تم اقتطاع هذا الإخراج لسهولة القراءة.

Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    Line 4 has 3 words, and text: '1020 Enterprise Way'.
    Line 5 has 3 words, and text: '6000 Redmond, WA'.
    ...
Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    ...
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Custom Model Info:
    Model Id: 63c013e3-1cab-43eb-84b0-f4b20cb9214c
    Model Status: Ready
    Training model started on: 8/24/2020 6:42:54 PM +00:00
    Training model completed on: 8/24/2020 6:43:01 PM +00:00
Submodel Form Type: form-63c013e3-1cab-43eb-84b0-f4b20cb9214c
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    FieldName: DatedAs
    FieldName: Email
    FieldName: Merchant
    ...

تحليل النماذج باستخدام نموذج مخصص

يوضح هذا القسم كيفية استخراج معلومات المفتاح/القيمة والمحتوى الآخر من أنواع القوالب المخصصة باستخدام النماذج التي دربتها باستخدام النماذج الخاصة بك.

هام

من أجل تنفيذ هذا السيناريو، يجب أن تكون قد دربت بالفعل نموذجا حتى تتمكن من تمرير معرفه إلى الأسلوب التالي.

StartRecognizeCustomFormsFromUri استخدم الأسلوب .

// Analyze PDF form data
private static async Task AnalyzePdfForm(
    FormRecognizerClient recognizerClient, String modelId, string formUrl)
{
    RecognizedFormCollection forms = await recognizerClient
    .StartRecognizeCustomFormsFromUri(modelId, new Uri(formUrl))
    .WaitForCompletionAsync();

تلميح

يمكنك أيضاً تحليل ملف محلي. راجع أساليب FormRecognizerClient، مثل StartRecognizeCustomForms. أو، راجع نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

القيمة التي تم إرجاعها هي مجموعة من RecognizedForm الكائنات. يوجد عنصر واحد لكل صفحة في المستند المرسل. تطبع التعليمات البرمجية التالية نتائج التحليل إلى وحدة التحكم. يطبع كل حقل مُعترف عليه والقيمة المقابلة، إضافة إلى درجة الثقة.

    foreach (RecognizedForm form in forms)
    {
        Console.WriteLine($"Form of type: {form.FormType}");
        foreach (FormField field in form.Fields.Values)
        {
            Console.WriteLine($"Field '{field.Name}: ");

            if (field.LabelData != null)
            {
                Console.WriteLine($"    Label: '{field.LabelData.Text}");
            }

            Console.WriteLine($"    Value: '{field.ValueData.Text}");
            Console.WriteLine($"    Confidence: '{field.Confidence}");
        }
        Console.WriteLine("Table data:");
        foreach (FormPage page in form.Pages)
        {
            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 {(cell.IsHeader ? "header" : "text")}: '{cell.Text}'");
                }
            }
        }
    }
}

تم اقتطاع استجابة الإخراج هذه لسهولة القراءة.

Custom Model Info:
    Model Id: 9b0108ee-65c8-450e-b527-bb309d054fc4
    Model Status: Ready
    Training model started on: 8/24/2020 7:00:31 PM +00:00
    Training model completed on: 8/24/2020 7:00:32 PM +00:00
Submodel Form Type: form-9b0108ee-65c8-450e-b527-bb309d054fc4
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    ...
Form Page 1 has 18 lines.
    Line 0 has 1 word, and text: 'Contoso'.
    Line 1 has 1 word, and text: 'Address:'.
    Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
    Line 3 has 4 words, and text: '1 Redmond way Suite'.
    ...

Table 0 has 2 rows and 6 columns.
    Cell (0, 0) contains text: 'Invoice Number'.
    Cell (0, 1) contains text: 'Invoice Date'.
    Cell (0, 2) contains text: 'Invoice Due Date'.
    ...
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
    Name: '8GB RAM (Black)', with confidence 0.916
    Total Price: '999', with confidence 0.559
Item:
    Name: 'SurfacePen', with confidence 0.858
    Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Custom Model Info:
    Model Id: dc115156-ce0e-4202-bbe4-7426e7bee756
    Model Status: Ready
    Training model started on: 8/24/2020 7:00:31 PM +00:00
    Training model completed on: 8/24/2020 7:00:41 PM +00:00
Submodel Form Type: form-0
    FieldName: field-0, FieldLabel: Additional Notes:
    FieldName: field-1, FieldLabel: Address:
    FieldName: field-2, FieldLabel: Company Name:
    FieldName: field-3, FieldLabel: Company Phone:
    FieldName: field-4, FieldLabel: Dated As:
    ...
Form of type: custom:form
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
    Value: '$56,651.49
    Confidence: '0.249
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
    Value: 'PT
    Confidence: '0.245
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
    Value: '99243
    Confidence: '0.114
   ...

إدارة النماذج المخصصة

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

private static async Task ManageModels(
    FormTrainingClient trainingClient, string trainingFileUrl)
{

التحقق من عدد النماذج في حساب مورد FormRecognizer

تتحقق كتلة التعليمات البرمجية التالية من عدد النماذج التي قمت بحفظها في حساب Document Intelligence الخاص بك وتقارنها بحد الحساب.

// Check number of models in the FormRecognizer account, 
// and the maximum number of models that can be stored.
AccountProperties accountProperties = trainingClient.GetAccountProperties();
Console.WriteLine($"Account has {accountProperties.CustomModelCount} models.");
Console.WriteLine($"It can have at most {accountProperties.CustomModelLimit} models.");

المخرجات

Account has 20 models.
It can have at most 5000 models.

إدراج النماذج المخزّنة حاليًا في حساب المورد

تحظر التعليمات البرمجية التالية النماذج الحالية في حسابك وتطبع تفاصيلها إلى وحدة التحكم.

Pageable<CustomFormModelInfo> models = trainingClient.GetCustomModels();

foreach (CustomFormModelInfo modelInfo in models)
{
    Console.WriteLine($"Custom Model Info:");
    Console.WriteLine($"    Model Id: {modelInfo.ModelId}");
    Console.WriteLine($"    Model Status: {modelInfo.Status}");
    Console.WriteLine($"    Training model started on: {modelInfo.TrainingStartedOn}");
    Console.WriteLine($"    Training model completed on: {modelInfo.TrainingCompletedOn}");
}

تم اقتطاع هذا الإخراج لسهولة القراءة.

Custom Model Info:
    Model Id: 05932d5a-a2f8-4030-a2ef-4e5ed7112515
    Model Status: Creating
    Training model started on: 8/24/2020 7:35:02 PM +00:00
    Training model completed on: 8/24/2020 7:35:02 PM +00:00
Custom Model Info:
    Model Id: 150828c4-2eb2-487e-a728-60d5d504bd16
    Model Status: Ready
    Training model started on: 8/24/2020 7:33:25 PM +00:00
    Training model completed on: 8/24/2020 7:33:27 PM +00:00
Custom Model Info:
    Model Id: 3303e9de-6cec-4dfb-9e68-36510a6ecbb2
    Model Status: Ready
    Training model started on: 8/24/2020 7:29:27 PM +00:00
    Training model completed on: 8/24/2020 7:29:36 PM +00:00

الحصول على نموذج معين باستخدام معرف النموذج

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

// Create a new model to store in the account
CustomFormModel model = await trainingClient.StartTrainingAsync(
    new Uri(trainingFileUrl)).WaitForCompletionAsync();

// Get the model that was just created
CustomFormModel modelCopy = trainingClient.GetCustomModel(model.ModelId);

Console.WriteLine($"Custom Model {modelCopy.ModelId} recognizes the following form types:");

foreach (CustomFormSubmodel submodel in modelCopy.Submodels)
{
    Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
    foreach (CustomFormModelField field in submodel.Fields.Values)
    {
        Console.Write($"    FieldName: {field.Name}");
        if (field.Label != null)
        {
            Console.Write($", FieldLabel: {field.Label}");
        }
        Console.WriteLine("");
    }
}

تم اقتطاع هذا الإخراج لسهولة القراءة.

Custom Model Info:
    Model Id: 150828c4-2eb2-487e-a728-60d5d504bd16
    Model Status: Ready
    Training model started on: 8/24/2020 7:33:25 PM +00:00
    Training model completed on: 8/24/2020 7:33:27 PM +00:00
Submodel Form Type: form-150828c4-2eb2-487e-a728-60d5d504bd16
    FieldName: CompanyAddress
    FieldName: CompanyName
    FieldName: CompanyPhoneNumber
    FieldName: DatedAs
    FieldName: Email
    FieldName: Merchant
    FieldName: PhoneNumber
    FieldName: PurchaseOrderNumber
    FieldName: Quantity
    FieldName: Signature
    FieldName: Subtotal
    FieldName: Tax
    FieldName: Total
    FieldName: VendorName
    FieldName: Website
...

حذف نموذج من حساب المورد

يمكنك أيضاً حذف نموذج من حسابك عن طريق الرجوع إلى معرفه. تؤدي هذه الخطوة أيضًا إلى إغلاق الطريقة.

    // Delete the model from the account.
    trainingClient.DeleteModel(model.ModelId);
}

شغّل التطبيق

شغّل التطبيق من دليل تطبيقك باستخدام الأمر dotnet run.

dotnet run

تنظيف الموارد

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

استكشاف الأخطاء وإصلاحها

عند التفاعل مع مكتبة عميل Azure الذكاء الاصطناعي Document Intelligence باستخدام .NET SDK، تؤدي الأخطاء التي يتم إرجاعها بواسطة الخدمة إلى RequestFailedException. وهي تتضمن نفس رمز حالة HTTP الذي سيرجعه طلب واجهة برمجة تطبيقات REST.

على سبيل المثال، إذا قمت بإرسال صورة إيصال ب URI غير صالح، 400 فسيتم إرجاع خطأ يشير إلى طلب غير صالح.

try
{
    RecognizedReceiptCollection receipts = await client.StartRecognizeReceiptsFromUri(new Uri(receiptUri)).WaitForCompletionAsync();
}
catch (RequestFailedException e)
{
    Console.WriteLine(e.ToString());
}

لاحظت أنه يتم تسجيل معلومات إضافية، مثل معرف طلب العميل للعملية.


Message:
    Azure.RequestFailedException: Service request failed.
    Status: 400 (Bad Request)

Content:
    {"error":{"code":"FailedToDownloadImage","innerError":
    {"requestId":"8ca04feb-86db-4552-857c-fde903251518"},
    "message":"Failed to download image from input URL."}}

Headers:
    Transfer-Encoding: chunked
    x-envoy-upstream-service-time: REDACTED
    apim-request-id: REDACTED
    Strict-Transport-Security: REDACTED
    X-Content-Type-Options: REDACTED
    Date: Mon, 20 Apr 2020 22:48:35 GMT
    Content-Type: application/json; charset=utf-8

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

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

هام

يستهدف هذا المشروع Document Intelligence REST API الإصدار 2.1.

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • الإصدار الحالي من Java Development Kit (JDK).

  • أداة إنشاء Gradleأو مدير تبعية آخر.

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

  • كائن التخزين الثنائي كبير الحجم من Azure الذي يحتوي على مجموعة من بيانات التدريب. راجع إنشاء نموذج مخصص وتدريبه للحصول على تلميحات وخيارات لتجميع مجموعة بيانات التدريب الخاصة بك. بالنسبة لهذا المشروع، يمكنك استخدام الملفات الموجودة في مجلد Train لمجموعة بيانات العينة. قم بتنزيل sample_data.zip واستخراجها.

إعداد بيئة البرمجة

لإعداد بيئة البرمجة الخاصة بك، قم بإنشاء مشروع Gradle وتثبيت مكتبة العميل.

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

في نافذة وحدة التحكم، قم بإنشاء دليل لتطبيقك وانتقل إليه.

mkdir myapp
cd myapp

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

gradle init --type basic

عند مطالبتك باختيار DSL، حدد Kotlin.

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

يستخدم هذا المشروع مدير تبعية 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

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

import com.azure.ai.formrecognizer.*;
import com.azure.ai.formrecognizer.training.*;
import com.azure.ai.formrecognizer.models.*;
import com.azure.ai.formrecognizer.training.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;

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

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

هام

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

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

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

  1. لاسترداد عنوان URL SAS لبيانات تدريب النموذج المخصص، انتقل إلى مورد التخزين في مدخل Microsoft Azure وحدد حاويات تخزين>البيانات.

  2. انتقل إلى الحاوية، وانقر بزر الماوس الأيمن، وحدد إنشاء SAS.

    احصل على SAS للحاوية الخاصة بك، وليس لحساب التخزين نفسه.

  3. تأكد من تحديد أذونات القراءة والكتابة والحذف والقائمة، وحدد إنشاء رمز SAS المميز وعنوان URL.

  4. انسخ القيمة الموجودة في قسم URL إلى موقع مؤقت. يجب أن يكون بالشكل: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

للحصول على عنوان URL لنموذج لاختباره، يمكنك استخدام الخطوات السابقة للحصول على عنوان URL SAS لمستند فردي في تخزين كائن ثنائي كبير الحجم. أو، خذ عنوان URL لمستند موجود في مكان آخر.

استخدم الأسلوب السابق للحصول على عنوان URL لصورة الإيصال أيضا.

String trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE";
String formUrl = "PASTE_YOUR_FORM_RECOGNIZER_FORM_URL_HERE";
String receiptUrl = "https://docs.microsoft.com/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg";
String bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg";
String invoiceUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/forms/Invoice_1.pdf";
String idUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg"
// Call Form Recognizer scenarios:
System.out.println("Get form content...");
GetContent(recognizerClient, formUrl);

System.out.println("Analyze receipt...");
AnalyzeReceipt(recognizerClient, receiptUrl);

System.out.println("Analyze business card...");
AnalyzeBusinessCard(recognizerClient, bcUrl);

System.out.println("Analyze invoice...");
AnalyzeInvoice(recognizerClient, invoiceUrl);

System.out.println("Analyze id...");
AnalyzeId(recognizerClient, idUrl);

System.out.println("Train Model with training data...");
String modelId = TrainModel(trainingClient, trainingDataUrl);

System.out.println("Analyze PDF form...");
AnalyzePdfForm(recognizerClient, modelId, formUrl);

System.out.println("Manage models...");
ManageModels(trainingClient, trainingDataUrl);

استخدام نموذج الكائن

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

FormRecognizerClient يوفر عمليات للمهام التالية:

  • التعرف على حقول النماذج والمحتوى باستخدام نماذج مخصصة مدربة لتحليل النماذج المخصصة. يتم إرجاع هذه القيم في مجموعة كائنات RecognizedForm. راجع تحليل النماذج المخصصة.
  • التعرف على محتوى النموذج، بما في ذلك الجداول والخطوط والكلمات، دون الحاجة إلى تدريب نموذج. يتم إرجاع محتوى النموذج في مجموعة من FormPage كائن. راجع تحليل التخطيط.
  • التعرف على الحقول المشتركة من الإيصالات الأمريكية وبطاقات العمل والفواتير ومستندات المعرف باستخدام نموذج مدرب مسبقا على خدمة Document Intelligence.

FormTrainingClient يوفر عمليات إلى:

  • تدريب النماذج المخصصة لتحليل جميع الحقول والقيم الموجودة في النماذج المخصصة. CustomFormModel يتم إرجاع الذي يشير إلى أنواع النماذج التي يحللها النموذج والحقول التي يستخرجها لكل نوع نموذج.
  • تدريب نماذج مخصصة لتحليل حقول وقيم معينة تحددها عن طريق تسمية النماذج المخصصة. CustomFormModel يتم إرجاع الذي يشير إلى الحقول التي يستخرجها النموذج والدقة المقدرة لكل حقل.
  • إدارة النماذج التي تم إنشاؤها في حسابك.
  • انسخ نموذجا مخصصا من مورد Document Intelligence إلى آخر.

إشعار

يمكن أيضا تدريب النماذج باستخدام واجهة مستخدم رسومية مثل أداة تسمية العينة.

مصادقة العميل

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

FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder()
        .credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();

FormTrainingClient trainingClient = new FormTrainingClientBuilder().credential(new AzureKeyCredential(key))
        .endpoint(endpoint).buildClient();

تحليل التخطيط

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

لتحليل محتوى ملف في URI معين، استخدم طريقة beginRecognizeContentFromUrl.

private static void GetContent(FormRecognizerClient recognizerClient, String invoiceUri) {
    String analyzeFilePath = invoiceUri;
    SyncPoller<FormRecognizerOperationResult, List<FormPage>> recognizeContentPoller = recognizerClient
            .beginRecognizeContentFromUrl(analyzeFilePath);

    List<FormPage> contentResult = recognizeContentPoller.getFinalResult();

تلميح

يمكنك أيضاً الحصول على محتوى من ملف محلي. راجع أساليب FormRecognizerClient، مثل beginRecognizeContent. أو، راجع نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

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

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

تبدو النتيجة مثل الإخراج التالي.

Get form content...
----Recognizing content ----
Has width: 8.500000 and height: 11.000000, measured with unit: inch.
Table has 2 rows and 6 columns.
Cell has text Invoice Number.
Cell has text Invoice Date.
Cell has text Invoice Due Date.
Cell has text Charges.
Cell has text VAT ID.
Cell has text 458176.
Cell has text 3/28/2018.
Cell has text 4/16/2018.
Cell has text $89,024.34.
Cell has text ET.

تحليل الإيصالات

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

لتحليل الإيصالات من URI، استخدم أسلوب beginRecognizeReceiptsFromUrl.

private static void AnalyzeReceipt(FormRecognizerClient recognizerClient, String receiptUri) {
    SyncPoller<FormRecognizerOperationResult, List<RecognizedForm>> syncPoller = recognizerClient
            .beginRecognizeReceiptsFromUrl(receiptUri);
    List<RecognizedForm> receiptPageResults = syncPoller.getFinalResult();

تلميح

يمكنك أيضًا تحليل صور الإيصالات المحلية. راجع أساليب FormRecognizerClient، مثل beginRecognizeReceipts. أو، راجع نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

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

for (int i = 0; i < receiptPageResults.size(); i++) {
    RecognizedForm recognizedForm = receiptPageResults.get(i);
    Map<String, FormField> recognizedFields = recognizedForm.getFields();
    System.out.printf("----------- Recognized Receipt page %d -----------%n", i);
    FormField merchantNameField = recognizedFields.get("MerchantName");
    if (merchantNameField != null) {
        if (FieldValueType.STRING == merchantNameField.getValue().getValueType()) {
            String merchantName = merchantNameField.getValue().asString();
            System.out.printf("Merchant Name: %s, confidence: %.2f%n", merchantName,
                    merchantNameField.getConfidence());
        }
    }
    FormField merchantAddressField = recognizedFields.get("MerchantAddress");
    if (merchantAddressField != null) {
        if (FieldValueType.STRING == merchantAddressField.getValue().getValueType()) {
            String merchantAddress = merchantAddressField.getValue().asString();
            System.out.printf("Merchant Address: %s, confidence: %.2f%n", merchantAddress,
                    merchantAddressField.getConfidence());
        }
    }
    FormField transactionDateField = recognizedFields.get("TransactionDate");
    if (transactionDateField != null) {
        if (FieldValueType.DATE == transactionDateField.getValue().getValueType()) {
            LocalDate transactionDate = transactionDateField.getValue().asDate();
            System.out.printf("Transaction Date: %s, confidence: %.2f%n", transactionDate,
                    transactionDateField.getConfidence());
        }
    }

تتكرر الكتلة التالية للتعليمات البرمجية من خلال عناصر فردية تم تحديدها على الإيصال وتطبع معلوماتها إلى وحدة التحكم.

        FormField receiptItemsField = recognizedFields.get("Items");
        if (receiptItemsField != null) {
            System.out.printf("Receipt Items: %n");
            if (FieldValueType.LIST == receiptItemsField.getValue().getValueType()) {
                List<FormField> receiptItems = receiptItemsField.getValue().asList();
                receiptItems.stream()
                        .filter(receiptItem -> FieldValueType.MAP == receiptItem.getValue().getValueType())
                        .map(formField -> formField.getValue().asMap())
                        .forEach(formFieldMap -> formFieldMap.forEach((key, formField) -> {
                            if ("Name".equals(key)) {
                                if (FieldValueType.STRING == formField.getValue().getValueType()) {
                                    String name = formField.getValue().asString();
                                    System.out.printf("Name: %s, confidence: %.2fs%n", name,
                                            formField.getConfidence());
                                }
                            }
                            if ("Quantity".equals(key)) {
                                if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
                                    Float quantity = formField.getValue().asFloat();
                                    System.out.printf("Quantity: %f, confidence: %.2f%n", quantity,
                                            formField.getConfidence());
                                }
                            }
                            if ("Price".equals(key)) {
                                if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
                                    Float price = formField.getValue().asFloat();
                                    System.out.printf("Price: %f, confidence: %.2f%n", price,
                                            formField.getConfidence());
                                }
                            }
                            if ("TotalPrice".equals(key)) {
                                if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
                                    Float totalPrice = formField.getValue().asFloat();
                                    System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice,
                                            formField.getConfidence());
                                }
                            }
                        }));
            }
        }
    }
}

تبدو النتيجة مثل الإخراج التالي.

Analyze receipt...
----------- Recognized Receipt page 0 -----------
Merchant Name: Contoso Contoso, confidence: 0.62
Merchant Address: 123 Main Street Redmond, WA 98052, confidence: 0.99
Transaction Date: 2020-06-10, confidence: 0.90
Receipt Items:
Name: Cappuccino, confidence: 0.96s
Quantity: null, confidence: 0.957s]
Total Price: 2.200000, confidence: 0.95
Name: BACON & EGGS, confidence: 0.94s
Quantity: null, confidence: 0.927s]
Total Price: null, confidence: 0.93

تحليل بطاقات العمل

يوضح هذا القسم كيفية تحليل واستخراج الحقول المشتركة من بطاقات العمل الإنجليزية باستخدام نموذج مدرب مسبقا. لمزيد من المعلومات حول تحليل بطاقة العمل، راجع نموذج بطاقة عمل Document Intelligence.

لتحليل بطاقات العمل من عنوان URL، استخدم الطريقة beginRecognizeBusinessCardsFromUrl.

private static void AnalyzeBusinessCard(FormRecognizerClient recognizerClient, String bcUrl) {
    SyncPoller < FormRecognizerOperationResult,
    List < RecognizedForm >> recognizeBusinessCardPoller = client.beginRecognizeBusinessCardsFromUrl(businessCardUrl);

    List < RecognizedForm > businessCardPageResults = recognizeBusinessCardPoller.getFinalResult();

تلميح

يمكنك أيضاً تحليل صور بطاقات العمل المحلية. راجع أساليب FormRecognizerClient، مثل beginRecognizeBusinessCards. أو، راجع نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

القيمة التي تم إرجاعها هي مجموعة من RecognizedForm الكائنات. يوجد كائن واحد لكل بطاقة في المستند. تعالج التعليمات البرمجية التالية بطاقة عمل لدى عنوان URI محدد وتطبع الحقول والقيم الرئيسية إلى وحدة التحكم.

    for (int i = 0; i < businessCardPageResults.size(); i++) {
        RecognizedForm recognizedForm = businessCardPageResults.get(i);
        Map < String,
        FormField > recognizedFields = recognizedForm.getFields();
        System.out.printf("----------- Recognized business card info for page %d -----------%n", i);
        FormField contactNamesFormField = recognizedFields.get("ContactNames");
        if (contactNamesFormField != null) {
            if (FieldValueType.LIST == contactNamesFormField.getValue().getValueType()) {
                List < FormField > contactNamesList = contactNamesFormField.getValue().asList();
                contactNamesList.stream().filter(contactName - >FieldValueType.MAP == contactName.getValue().getValueType()).map(contactName - >{
                    System.out.printf("Contact name: %s%n", contactName.getValueData().getText());
                    return contactName.getValue().asMap();
                }).forEach(contactNamesMap - >contactNamesMap.forEach((key, contactName) - >{
                    if ("FirstName".equals(key)) {
                        if (FieldValueType.STRING == contactName.getValue().getValueType()) {
                            String firstName = contactName.getValue().asString();
                            System.out.printf("\tFirst Name: %s, confidence: %.2f%n", firstName, contactName.getConfidence());
                        }
                    }
                    if ("LastName".equals(key)) {
                        if (FieldValueType.STRING == contactName.getValue().getValueType()) {
                            String lastName = contactName.getValue().asString();
                            System.out.printf("\tLast Name: %s, confidence: %.2f%n", lastName, contactName.getConfidence());
                        }
                    }
                }));
            }
        }

        FormField jobTitles = recognizedFields.get("JobTitles");
        if (jobTitles != null) {
            if (FieldValueType.LIST == jobTitles.getValue().getValueType()) {
                List < FormField > jobTitlesItems = jobTitles.getValue().asList();
                jobTitlesItems.stream().forEach(jobTitlesItem - >{
                    if (FieldValueType.STRING == jobTitlesItem.getValue().getValueType()) {
                        String jobTitle = jobTitlesItem.getValue().asString();
                        System.out.printf("Job Title: %s, confidence: %.2f%n", jobTitle, jobTitlesItem.getConfidence());
                    }
                });
            }
        }

        FormField departments = recognizedFields.get("Departments");
        if (departments != null) {
            if (FieldValueType.LIST == departments.getValue().getValueType()) {
                List < FormField > departmentsItems = departments.getValue().asList();
                departmentsItems.stream().forEach(departmentsItem - >{
                    if (FieldValueType.STRING == departmentsItem.getValue().getValueType()) {
                        String department = departmentsItem.getValue().asString();
                        System.out.printf("Department: %s, confidence: %.2f%n", department, departmentsItem.getConfidence());
                    }
                });
            }
        }

        FormField emails = recognizedFields.get("Emails");
        if (emails != null) {
            if (FieldValueType.LIST == emails.getValue().getValueType()) {
                List < FormField > emailsItems = emails.getValue().asList();
                emailsItems.stream().forEach(emailsItem - >{
                    if (FieldValueType.STRING == emailsItem.getValue().getValueType()) {
                        String email = emailsItem.getValue().asString();
                        System.out.printf("Email: %s, confidence: %.2f%n", email, emailsItem.getConfidence());
                    }
                });
            }
        }

        FormField websites = recognizedFields.get("Websites");
        if (websites != null) {
            if (FieldValueType.LIST == websites.getValue().getValueType()) {
                List < FormField > websitesItems = websites.getValue().asList();
                websitesItems.stream().forEach(websitesItem - >{
                    if (FieldValueType.STRING == websitesItem.getValue().getValueType()) {
                        String website = websitesItem.getValue().asString();
                        System.out.printf("Web site: %s, confidence: %.2f%n", website, websitesItem.getConfidence());
                    }
                });
            }
        }

        FormField mobilePhones = recognizedFields.get("MobilePhones");
        if (mobilePhones != null) {
            if (FieldValueType.LIST == mobilePhones.getValue().getValueType()) {
                List < FormField > mobilePhonesItems = mobilePhones.getValue().asList();
                mobilePhonesItems.stream().forEach(mobilePhonesItem - >{
                    if (FieldValueType.PHONE_NUMBER == mobilePhonesItem.getValue().getValueType()) {
                        String mobilePhoneNumber = mobilePhonesItem.getValue().asPhoneNumber();
                        System.out.printf("Mobile phone number: %s, confidence: %.2f%n", mobilePhoneNumber, mobilePhonesItem.getConfidence());
                    }
                });
            }
        }

        FormField otherPhones = recognizedFields.get("OtherPhones");
        if (otherPhones != null) {
            if (FieldValueType.LIST == otherPhones.getValue().getValueType()) {
                List < FormField > otherPhonesItems = otherPhones.getValue().asList();
                otherPhonesItems.stream().forEach(otherPhonesItem - >{
                    if (FieldValueType.PHONE_NUMBER == otherPhonesItem.getValue().getValueType()) {
                        String otherPhoneNumber = otherPhonesItem.getValue().asPhoneNumber();
                        System.out.printf("Other phone number: %s, confidence: %.2f%n", otherPhoneNumber, otherPhonesItem.getConfidence());
                    }
                });
            }
        }

        FormField faxes = recognizedFields.get("Faxes");
        if (faxes != null) {
            if (FieldValueType.LIST == faxes.getValue().getValueType()) {
                List < FormField > faxesItems = faxes.getValue().asList();
                faxesItems.stream().forEach(faxesItem - >{
                    if (FieldValueType.PHONE_NUMBER == faxesItem.getValue().getValueType()) {
                        String faxPhoneNumber = faxesItem.getValue().asPhoneNumber();
                        System.out.printf("Fax phone number: %s, confidence: %.2f%n", faxPhoneNumber, faxesItem.getConfidence());
                    }
                });
            }
        }

        FormField addresses = recognizedFields.get("Addresses");
        if (addresses != null) {
            if (FieldValueType.LIST == addresses.getValue().getValueType()) {
                List < FormField > addressesItems = addresses.getValue().asList();
                addressesItems.stream().forEach(addressesItem - >{
                    if (FieldValueType.STRING == addressesItem.getValue().getValueType()) {
                        String address = addressesItem.getValue().asString();
                        System.out.printf("Address: %s, confidence: %.2f%n", address, addressesItem.getConfidence());
                    }
                });
            }
        }

        FormField companyName = recognizedFields.get("CompanyNames");
        if (companyName != null) {
            if (FieldValueType.LIST == companyName.getValue().getValueType()) {
                List < FormField > companyNameItems = companyName.getValue().asList();
                companyNameItems.stream().forEach(companyNameItem - >{
                    if (FieldValueType.STRING == companyNameItem.getValue().getValueType()) {
                        String companyNameValue = companyNameItem.getValue().asString();
                        System.out.printf("Company name: %s, confidence: %.2f%n", companyNameValue, companyNameItem.getConfidence());
                    }
                });
            }
        }
    }
}

تحليل الفواتير

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

لتحليل الفواتير من عنوان URL، استخدم أسلوب beginRecognizeInvoicesFromUrl.

private static void AnalyzeInvoice(FormRecognizerClient recognizerClient, String invoiceUrl) {
    SyncPoller < FormRecognizerOperationResult,
    List < RecognizedForm >> recognizeInvoicesPoller = client.beginRecognizeInvoicesFromUrl(invoiceUrl);

    List < RecognizedForm > recognizedInvoices = recognizeInvoicesPoller.getFinalResult();

تلميح

يمكنك أيضاً تحليل صور الفواتير المحلية. راجع أساليب FormRecognizerClient، مثل beginRecognizeInvoices. أو، راجع نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

القيمة التي تم إرجاعها هي مجموعة من RecognizedForm الكائنات. يوجد عنصر واحد لكل فاتورة في المستند. تعالج التعليمات البرمجية التالية فاتورة لدى عنوان URI محدد وتطبع الحقول والقيم الرئيسية إلى وحدة التحكم.

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

تحليل مستندات معرف

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

لتحليل مستندات المعرّف من عنوان URI، استخدم الأسلوب beginRecognizeIdentityDocumentsFromUrl.

private static void AnalyzeId(FormRecognizerClient client, String idUrl) {
    SyncPoller < FormRecognizerOperationResult,
    List < RecognizedForm >> analyzeIdentityDocumentPoller = client.beginRecognizeIdentityDocumentsFromUrl(licenseDocumentUrl);

    List < RecognizedForm > identityDocumentResults = analyzeIdentityDocumentPoller.getFinalResult();

تلميح

يمكنك أيضًا تحليل صور مستندات معرف محلي. راجع أساليب FormRecognizerClient، مثل beginRecognizeIdentityDocuments. راجع أيضا نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

تقوم التعليمات البرمجية التالية بمعالجة مستند معرف في URI المعطى وطباعة الحقول الرئيسية والقيم إلى وحدة التحكم.

for (int i = 0; i < identityDocumentResults.size(); i++) {
    RecognizedForm recognizedForm = identityDocumentResults.get(i);
    Map < String,
    FormField > recognizedFields = recognizedForm.getFields();
    System.out.printf("----------- Recognized license info for page %d -----------%n", i);
    FormField addressField = recognizedFields.get("Address");
    if (addressField != null) {
        if (FieldValueType.STRING == addressField.getValue().getValueType()) {
            String address = addressField.getValue().asString();
            System.out.printf("Address: %s, confidence: %.2f%n", address, addressField.getConfidence());
        }
    }

    FormField countryRegionFormField = recognizedFields.get("CountryRegion");
    if (countryRegionFormField != null) {
        if (FieldValueType.STRING == countryRegionFormField.getValue().getValueType()) {
            String countryRegion = countryRegionFormField.getValue().asCountryRegion();
            System.out.printf("Country or region: %s, confidence: %.2f%n", countryRegion, countryRegionFormField.getConfidence());
        }
    }

    FormField dateOfBirthField = recognizedFields.get("DateOfBirth");
    if (dateOfBirthField != null) {
        if (FieldValueType.DATE == dateOfBirthField.getValue().getValueType()) {
            LocalDate dateOfBirth = dateOfBirthField.getValue().asDate();
            System.out.printf("Date of Birth: %s, confidence: %.2f%n", dateOfBirth, dateOfBirthField.getConfidence());
        }
    }

    FormField dateOfExpirationField = recognizedFields.get("DateOfExpiration");
    if (dateOfExpirationField != null) {
        if (FieldValueType.DATE == dateOfExpirationField.getValue().getValueType()) {
            LocalDate expirationDate = dateOfExpirationField.getValue().asDate();
            System.out.printf("Document date of expiration: %s, confidence: %.2f%n", expirationDate, dateOfExpirationField.getConfidence());
        }
    }

    FormField documentNumberField = recognizedFields.get("DocumentNumber");
    if (documentNumberField != null) {
        if (FieldValueType.STRING == documentNumberField.getValue().getValueType()) {
            String documentNumber = documentNumberField.getValue().asString();
            System.out.printf("Document number: %s, confidence: %.2f%n", documentNumber, documentNumberField.getConfidence());
        }
    }

    FormField firstNameField = recognizedFields.get("FirstName");
    if (firstNameField != null) {
        if (FieldValueType.STRING == firstNameField.getValue().getValueType()) {
            String firstName = firstNameField.getValue().asString();
            System.out.printf("First Name: %s, confidence: %.2f%n", firstName, documentNumberField.getConfidence());
        }
    }

    FormField lastNameField = recognizedFields.get("LastName");
    if (lastNameField != null) {
        if (FieldValueType.STRING == lastNameField.getValue().getValueType()) {
            String lastName = lastNameField.getValue().asString();
            System.out.printf("Last name: %s, confidence: %.2f%n", lastName, lastNameField.getConfidence());
        }
    }

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

تدريب نموذج مخصص

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

إشعار

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

التدريب على نموذج بدون تسميات

تدريب نماذج مخصصة لتحليل جميع الحقول والقيم الموجودة في النماذج المخصصة لك دون تسمية مستندات التدريب يدوياً.

تعمل الطريقة التالية على تدريب نموذج على مجموعة معينة من المستندات وتطبع حالة النموذج إلى وحدة التحكم.

private static String TrainModel(FormTrainingClient trainingClient, String trainingDataUrl) {
    SyncPoller<FormRecognizerOperationResult, CustomFormModel> trainingPoller = trainingClient
            .beginTraining(trainingDataUrl, false);

    CustomFormModel customFormModel = trainingPoller.getFinalResult();

    // Model Info
    System.out.printf("Model Id: %s%n", customFormModel.getModelId());
    System.out.printf("Model Status: %s%n", customFormModel.getModelStatus());
    System.out.printf("Training started on: %s%n", customFormModel.getTrainingStartedOn());
    System.out.printf("Training completed on: %s%n%n", customFormModel.getTrainingCompletedOn());

يحتوي الكائن الذي تم CustomFormModel إرجاعه على معلومات حول أنواع النماذج التي يمكن للطراز تحليلها والحقول التي يمكن استخراجها من كل نوع نموذج. تطبع كتلة التعليمات البرمجية التالية هذه المعلومات إلى وحدة التحكم.

System.out.println("Recognized Fields:");
// looping through the subModels, which contains the fields they were trained on
// Since the given training documents are unlabeled, we still group them but
// they do not have a label.
customFormModel.getSubmodels().forEach(customFormSubmodel -> {
    // Since the training data is unlabeled, we are unable to return the accuracy of
    // this model
    System.out.printf("The subModel has form type %s%n", customFormSubmodel.getFormType());
    customFormSubmodel.getFields().forEach((field, customFormModelField) -> System.out
            .printf("The model found field '%s' with label: %s%n", field, customFormModelField.getLabel()));
});

في النهاية، يعيد هذا الأسلوب المُعرف المميز للنموذج.

    return customFormModel.getModelId();
}

تبدو النتيجة مثل الإخراج التالي.

Train Model with training data...
Model Id: 20c3544d-97b4-49d9-b39b-dc32d85f1358
Model Status: ready
Training started on: 2020-08-31T16:52:09Z
Training completed on: 2020-08-31T16:52:23Z

Recognized Fields:
The subModel has form type form-0
The model found field 'field-0' with label: Address:
The model found field 'field-1' with label: Charges
The model found field 'field-2' with label: Invoice Date
The model found field 'field-3' with label: Invoice Due Date
The model found field 'field-4' with label: Invoice For:
The model found field 'field-5' with label: Invoice Number
The model found field 'field-6' with label: VAT ID

تدريب نموذج باستخدام تسميات

يمكنك أيضًا تدريب نماذج مخصصة عن طريق وضع التسميات يدويًا على مستندات التدريب. يؤدي التدريب باستخدام التسميات إلى أداء أفضل في بعض السيناريوهات. للتدريب باستخدام التسميات، تحتاج إلى ملفات معلومات التسمية الخاصة (<اسم الملف>.pdf.labels.json) في حاوية مخزن الكائنات الثنائية الكبيرة إلى جانب مستندات التدريب. توفر أداة تسمية نموذج تحليل معلومات المستند واجهة مستخدم لمساعدتك في إنشاء ملفات التسمية هذه. بعد الحصول عليها، يمكنك استدعاء beginTraining الأسلوب مع تعيين المعلمة useTrainingLabels إلى true.

private static String TrainModelWithLabels(FormTrainingClient trainingClient, String trainingDataUrl) {
    // Train custom model
    String trainingSetSource = trainingDataUrl;
    SyncPoller<FormRecognizerOperationResult, CustomFormModel> trainingPoller = trainingClient
            .beginTraining(trainingSetSource, true);

    CustomFormModel customFormModel = trainingPoller.getFinalResult();

    // Model Info
    System.out.printf("Model Id: %s%n", customFormModel.getModelId());
    System.out.printf("Model Status: %s%n", customFormModel.getModelStatus());
    System.out.printf("Training started on: %s%n", customFormModel.getTrainingStartedOn());
    System.out.printf("Training completed on: %s%n%n", customFormModel.getTrainingCompletedOn());

تشير CustomFormModel التي تم إرجاعها إلى الحقول التي يمكن للنموذج استخراجها، بالإضافة إلى دقتها المقدرة في كل حقل. تطبع كتلة التعليمات البرمجية التالية هذه المعلومات إلى وحدة التحكم.

    // looping through the subModels, which contains the fields they were trained on
    // The labels are based on the ones you gave the training document.
    System.out.println("Recognized Fields:");
    // Since the data is labeled, we are able to return the accuracy of the model
    customFormModel.getSubmodels().forEach(customFormSubmodel -> {
        System.out.printf("The subModel with form type %s has accuracy: %.2f%n", customFormSubmodel.getFormType(),
                customFormSubmodel.getAccuracy());
        customFormSubmodel.getFields()
                .forEach((label, customFormModelField) -> System.out.printf(
                        "The model found field '%s' to have name: %s with an accuracy: %.2f%n", label,
                        customFormModelField.getName(), customFormModelField.getAccuracy()));
    });
    return customFormModel.getModelId();
}

تبدو النتيجة مثل الإخراج التالي.

Train Model with training data...
Model Id: 20c3544d-97b4-49d9-b39b-dc32d85f1358
Model Status: ready
Training started on: 2020-08-31T16:52:09Z
Training completed on: 2020-08-31T16:52:23Z

Recognized Fields:
The subModel has form type form-0
The model found field 'field-0' with label: Address:
The model found field 'field-1' with label: Charges
The model found field 'field-2' with label: Invoice Date
The model found field 'field-3' with label: Invoice Due Date
The model found field 'field-4' with label: Invoice For:
The model found field 'field-5' with label: Invoice Number
The model found field 'field-6' with label: VAT ID

تحليل النماذج باستخدام نموذج مخصص

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

هام

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

beginRecognizeCustomFormsFromUrl استخدم الأسلوب .

// Analyze PDF form data
private static void AnalyzePdfForm(FormRecognizerClient formClient, String modelId, String pdfFormUrl) {
    SyncPoller<FormRecognizerOperationResult, List<RecognizedForm>> recognizeFormPoller = formClient
            .beginRecognizeCustomFormsFromUrl(modelId, pdfFormUrl);

    List<RecognizedForm> recognizedForms = recognizeFormPoller.getFinalResult();

تلميح

يمكنك أيضاً تحليل ملف محلي. راجع أساليب FormRecognizerClient، مثل beginRecognizeCustomForms. أو، راجع نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورا محلية.

القيمة التي تم إرجاعها هي مجموعة من RecognizedForm الكائنات. يوجد عنصر واحد لكل صفحة في المستند المرسل. تطبع التعليمات البرمجية التالية نتائج التحليل إلى وحدة التحكم. يطبع كل حقل مُعترف عليه والقيمة المقابلة، إضافة إلى درجة الثقة.

    for (int i = 0; i < recognizedForms.size(); i++) {
        final RecognizedForm form = recognizedForms.get(i);
        System.out.printf("----------- Recognized custom form info for page %d -----------%n", i);
        System.out.printf("Form type: %s%n", form.getFormType());
        form.getFields().forEach((label, formField) ->
        // label data is populated if you are using a model trained with unlabeled data,
        // since the service needs to make predictions for labels if not explicitly
        // given to it.
        System.out.printf("Field '%s' has label '%s' with a confidence " + "score of %.2f.%n", label,
                formField.getLabelData().getText(), formField.getConfidence()));
    }
}

تبدو النتيجة مثل الإخراج التالي.

Analyze PDF form...
----------- Recognized custom template info for page 0 -----------
Form type: form-0
Field 'field-0' has label 'Address:' with a confidence score of 0.91.
Field 'field-1' has label 'Invoice For:' with a confidence score of 1.00.
Field 'field-2' has label 'Invoice Number' with a confidence score of 1.00.
Field 'field-3' has label 'Invoice Date' with a confidence score of 1.00.
Field 'field-4' has label 'Invoice Due Date' with a confidence score of 1.00.
Field 'field-5' has label 'Charges' with a confidence score of 1.00.
Field 'field-6' has label 'VAT ID' with a confidence score of 1.00.

إدارة النماذج المخصصة

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

private static void ManageModels(FormTrainingClient trainingClient, String trainingFileUrl) {

التحقق من عدد النماذج في حساب مورد FormRecognizer

تتحقق كتلة التعليمات البرمجية التالية من عدد النماذج التي حفظتها في حساب Document Intelligence الخاص بك وتقارنها بحد الحساب.

AtomicReference<String> modelId = new AtomicReference<>();

// First, we see how many custom models we have, and what our limit is
AccountProperties accountProperties = trainingClient.getAccountProperties();
System.out.printf("The account has %s custom models, and we can have at most %s custom models",
        accountProperties.getCustomModelCount(), accountProperties.getCustomModelLimit());

تبدو النتيجة مثل الإخراج التالي.

The account has 12 custom models, and we can have at most 250 custom models

إدراج النماذج المخزّنة حاليًا في حساب المورد

تحظر التعليمات البرمجية التالية النماذج الحالية في حسابك وتطبع تفاصيلها إلى وحدة التحكم.

// Next, we get a paged list of all of our custom models
PagedIterable<CustomFormModelInfo> customModels = trainingClient.listCustomModels();
System.out.println("We have following models in the account:");
customModels.forEach(customFormModelInfo -> {
    System.out.printf("Model Id: %s%n", customFormModelInfo.getModelId());
    // get custom model info
    modelId.set(customFormModelInfo.getModelId());
    CustomFormModel customModel = trainingClient.getCustomModel(customFormModelInfo.getModelId());
    System.out.printf("Model Id: %s%n", customModel.getModelId());
    System.out.printf("Model Status: %s%n", customModel.getModelStatus());
    System.out.printf("Training started on: %s%n", customModel.getTrainingStartedOn());
    System.out.printf("Training completed on: %s%n", customModel.getTrainingCompletedOn());
    customModel.getSubmodels().forEach(customFormSubmodel -> {
        System.out.printf("Custom Model Form type: %s%n", customFormSubmodel.getFormType());
        System.out.printf("Custom Model Accuracy: %.2f%n", customFormSubmodel.getAccuracy());
        if (customFormSubmodel.getFields() != null) {
            customFormSubmodel.getFields().forEach((fieldText, customFormModelField) -> {
                System.out.printf("Field Text: %s%n", fieldText);
                System.out.printf("Field Accuracy: %.2f%n", customFormModelField.getAccuracy());
            });
        }
    });
});

تبدو النتيجة مثل الإخراج التالي.

تم اختصار هذه الاستجابة لسهولة القراءة.

We have following models in the account:
Model Id: 0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Model Id: 0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Model Status: ready
Training started on: 2020-06-04T18:33:08Z
Training completed on: 2020-06-04T18:33:10Z
Custom Model Form type: form-0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Custom Model Accuracy: 1.00
Field Text: invoice date
Field Accuracy: 1.00
Field Text: invoice number
Field Accuracy: 1.00
...

حذف نموذج من حساب المورد

يمكنك أيضاً حذف نموذج من حسابك عن طريق الرجوع إلى معرفه.

    // Delete Custom Model
    System.out.printf("Deleted model with model Id: %s, operation completed with status: %s%n", modelId.get(),
            trainingClient.deleteModelWithResponse(modelId.get(), Context.NONE).getStatusCode());
}

شغّل التطبيق

انتقل مجدداً إلى الدليل الرئيسي للمشروع الخاص بك. أيضاً، قم بإنشاء التطبيق مع الأمر التالي:

gradle build

تشغيل التطبيق run بهدف:

gradle run

تنظيف الموارد

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

استكشاف الأخطاء وإصلاحها

يرفع ErrorResponseException عملاء Document Intelligence استثناءات. على سبيل المثال، إذا حاولت توفير URL مصدر ملف غير صالح، ErrorResponseException فسيتم رفع مع خطأ يشير إلى سبب الفشل. في القصاصة البرمجية التالية، يُعالج الخطأ بأمان من خلال معرفة الاستثناء وعرض معلومات إضافية حول الخطأ.

try {
    formRecognizerClient.beginRecognizeContentFromUrl("invalidSourceUrl");
} catch (ErrorResponseException e) {
    System.out.println(e.getMessage());
}

تمكين تسجيل دخول العميل

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

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

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

هام

يستهدف هذا المشروع Document Intelligence REST API الإصدار 2.1.

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • أحدث إصدار من Visual Studio Code.

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

  • كائن التخزين الثنائي كبير الحجم من Azure الذي يحتوي على مجموعة من بيانات التدريب. راجع إنشاء نموذج مخصص وتدريبه للحصول على تلميحات وخيارات لتجميع مجموعة بيانات التدريب الخاصة بك. بالنسبة لهذا المشروع، يمكنك استخدام الملفات ضمن مجلد Train لمجموعة بيانات العينة. قم بتنزيل sample_data.zip واستخراجها.

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

إعداد بيئة البرمجة

إنشاء تطبيق وتثبيت مكتبة العميل.

إنشاء تطبيق Node.js جديد

  1. في نافذة وحدة التحكم، قم بإنشاء دليل لتطبيقك، وانتقل إليه.

    mkdir myapp
    cd myapp
    
  2. npm init قم بتشغيل الأمر لإنشاء تطبيق عقدة مع ملف package.json.

    npm init
    

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

  1. تثبيت حزمة npm ai-form-recognizer:

    npm install @azure/ai-form-recognizer
    

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

  2. إنشاء ملف باسم index.js وفتحه واستيراد المكتبات التالية:

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

    const apiKey = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE";
    const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
    

هام

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

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

استخدام نموذج الكائن

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

FormRecognizerClient يوفر العمليات التالية:

  • التعرف على حقول النماذج والمحتوى باستخدام نماذج مخصصة مدربة لتحليل النماذج المخصصة. يتم إرجاع هذه القيم في مجموعة كائنات RecognizedForm.
  • التعرف على محتوى النموذج بما في ذلك الجداول والخطوط والكلمات دون الحاجة إلى التدريب على نموذج. يتم إرجاع محتوى النموذج في مجموعة من FormPage كائن.
  • التعرف على الحقول المشتركة من الإيصالات الأمريكية وبطاقات العمل والفواتير ومستندات المعرف باستخدام نموذج مدرب مسبقا على خدمة Document Intelligence.

FormTrainingClient يوفر عمليات إلى:

  • تدريب النماذج المخصصة لتحليل جميع الحقول والقيم الموجودة في النماذج المخصصة. CustomFormModel يتم إرجاع يشير إلى أنواع النماذج التي يحللها النموذج والحقول التي يستخرجها لكل نوع نموذج. لمزيد من المعلومات، راجع وثائق الخدمة حول تدريب النموذج غير المسمى.
  • تدريب نماذج مخصصة لتحليل حقول وقيم معينة تحددها عن طريق تسمية النماذج المخصصة. CustomFormModel يتم إرجاع الذي يشير إلى الحقول التي يستخرجها النموذج والدقة المقدرة لكل حقل. لمزيد من المعلومات، راجع تدريب نموذج باستخدام التسميات في هذه المقالة.
  • إدارة النماذج التي تم إنشاؤها في حسابك.
  • انسخ نموذجا مخصصا من مورد Document Intelligence إلى آخر.

إشعار

يمكن أيضا تدريب النماذج باستخدام واجهة مستخدم رسومية مثل أداة تسمية العينة.

مصادقة العميل

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

const trainingClient = new FormTrainingClient(endpoint, new AzureKeyCredential(apiKey));
const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(apiKey));

الحصول على أصول للاختبار

تحتاج أيضا إلى إضافة مراجع إلى عناوين URL لبيانات التدريب والاختبار.

  1. لاسترداد عنوان URL SAS لبيانات تدريب النموذج المخصص، انتقل إلى مورد التخزين في مدخل Microsoft Azure وحدد حاويات تخزين>البيانات.

  2. انتقل إلى الحاوية، وانقر بزر الماوس الأيمن، وحدد إنشاء SAS.

    احصل على SAS للحاوية الخاصة بك، وليس لحساب التخزين نفسه.

  3. تأكد من تحديد أذونات القراءة والكتابة والحذف والقائمة، وحدد إنشاء رمز SAS المميز وعنوان URL.

  4. انسخ القيمة الموجودة في قسم URL إلى موقع مؤقت. يجب أن يكون بالشكل: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

استخدم العينة من وصور الإيصال المضمنة في العينات. تتوفر هذه الصور أيضا على GitHub. يمكنك استخدام الخطوات السابقة للحصول على عنوان URL SAS لمستند فردي في تخزين كائن ثنائي كبير الحجم.

تحليل التخطيط

يمكنك استخدام Document Intelligence لتحليل الجداول والخطوط والكلمات في المستندات، دون الحاجة إلى تدريب نموذج. لمزيد من المعلومات حول استخراج التخطيط، راجع نموذج تخطيط تحليل معلومات المستند. لتحليل محتوى ملف في URI معين، استخدم أسلوب beginRecognizeContentFromUrl.

async function recognizeContent() {
    const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";
    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);
});

تلميح

يمكنك أيضا الحصول على محتوى من ملف محلي باستخدام أساليب FormRecognizerClient ، مثل beginRecognizeContent.

Page 1: width 8.5 and height 11 with unit inch
cell [0,0] has text Invoice Number
cell [0,1] has text Invoice Date
cell [0,2] has text Invoice Due Date
cell [0,3] has text Charges
cell [0,5] has text VAT ID
cell [1,0] has text 34278587
cell [1,1] has text 6/18/2017
cell [1,2] has text 6/24/2017
cell [1,3] has text $56,651.49
cell [1,5] has text PT

تحليل الإيصالات

يوضح هذا القسم كيفية تحليل واستخراج الحقول المشتركة من إيصالات الولايات المتحدة، باستخدام نموذج إيصال مدرب مسبقا. لمزيد من المعلومات حول تحليل الإيصال، راجع نموذج إيصال ذكاء المستند.

لتحليل الإيصالات من URI، استخدم أسلوب beginRecognizeReceiptsFromUrl. تعالج التعليمات البرمجية التالية إيصالًا عند URI محدد وتطبع الحقول والقيم الرئيسية إلى وحدة التحكم.

async function recognizeReceipt() {
    receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png";
    const poller = await client.beginRecognizeReceiptsFromUrl(receiptUrl, {
        onProgress: (state) => { console.log(`status: ${state.status}`); }
    });

    const receipts = await poller.pollUntilDone();

    if (!receipts || receipts.length <= 0) {
        throw new Error("Expecting at lease one receipt in analysis result");
    }

    const receipt = receipts[0];
    console.log("First receipt:");
    const receiptTypeField = receipt.fields["ReceiptType"];
    if (receiptTypeField.valueType === "string") {
        console.log(`  Receipt Type: '${receiptTypeField.value || "<missing>"}', with confidence of ${receiptTypeField.confidence}`);
    }
    const merchantNameField = receipt.fields["MerchantName"];
    if (merchantNameField.valueType === "string") {
        console.log(`  Merchant Name: '${merchantNameField.value || "<missing>"}', with confidence of ${merchantNameField.confidence}`);
    }
    const transactionDate = receipt.fields["TransactionDate"];
    if (transactionDate.valueType === "date") {
        console.log(`  Transaction Date: '${transactionDate.value || "<missing>"}', with confidence of ${transactionDate.confidence}`);
    }
    const itemsField = receipt.fields["Items"];
    if (itemsField.valueType === "array") {
        for (const itemField of itemsField.value || []) {
            if (itemField.valueType === "object") {
                const itemNameField = itemField.value["Name"];
                if (itemNameField.valueType === "string") {
                    console.log(`    Item Name: '${itemNameField.value || "<missing>"}', with confidence of ${itemNameField.confidence}`);
                }
            }
        }
    }
    const totalField = receipt.fields["Total"];
    if (totalField.valueType === "number") {
        console.log(`  Total: '${totalField.value || "<missing>"}', with confidence of ${totalField.confidence}`);
    }
}

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

تلميح

يمكنك أيضا تحليل صور الإيصالات المحلية باستخدام أساليب FormRecognizerClient ، مثل beginRecognizeReceipts.

status: notStarted
status: running
status: succeeded
First receipt:
  Receipt Type: 'Itemized', with confidence of 0.659
  Merchant Name: 'Contoso Contoso', with confidence of 0.516
  Transaction Date: 'Sun Jun 09 2019 17:00:00 GMT-0700 (Pacific Daylight Time)', with confidence of 0.985
    Item Name: '8GB RAM (Black)', with confidence of 0.916
    Item Name: 'SurfacePen', with confidence of 0.858
  Total: '1203.39', with confidence of 0.774

تحليل بطاقات العمل

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

لتحليل بطاقات العمل من عنوان URL، استخدم الطريقة beginRecognizeBusinessCardsFromURL.

async function recognizeBusinessCards() {
    bcUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/businessCard.png";
    const poller = await client.beginRecognizeBusinessCardsFromUrl(bcUrl, {
        onProgress: (state) => {
            console.log(`status: ${state.status}`);
        }
    });

    const [businessCard] = await poller.pollUntilDone();

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

    const contactNames = businessCard.fields["ContactNames"].value;
    if (Array.isArray(contactNames)) {
        console.log("- Contact Names:");
        for (const contactName of contactNames) {
            if (contactName.valueType === "object") {
                const firstName = contactName.value?.["FirstName"].value ?? "<no first name>";
                const lastName = contactName.value?.["LastName"].value ?? "<no last name>";
                console.log(`  - ${firstName} ${lastName} (${contactName.confidence} confidence)`);
            }
        }
    }

    printSimpleArrayField(businessCard, "CompanyNames");
    printSimpleArrayField(businessCard, "Departments");
    printSimpleArrayField(businessCard, "JobTitles");
    printSimpleArrayField(businessCard, "Emails");
    printSimpleArrayField(businessCard, "Websites");
    printSimpleArrayField(businessCard, "Addresses");
    printSimpleArrayField(businessCard, "MobilePhones");
    printSimpleArrayField(businessCard, "Faxes");
    printSimpleArrayField(businessCard, "WorkPhones");
    printSimpleArrayField(businessCard, "OtherPhones");
}

// Helper function to print array field values. 
function printSimpleArrayField(businessCard, fieldName) {
    const fieldValues = businessCard.fields[fieldName]?.value;
    if (Array.isArray(fieldValues)) {
        console.log(`- ${fieldName}:`);
        for (const item of fieldValues) {
            console.log(`  - ${item.value ?? "<no value>"} (${item.confidence} confidence)`);
        }
    } else if (fieldValues === undefined) {
        console.log(`No ${fieldName} were found in the document.`);
    } else {
        console.error(
            `Error: expected field "${fieldName}" to be an Array, but it was a(n) ${businessCard.fields[fieldName].valueType}`
        );
    }
}

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

تلميح

يمكنك أيضا تحليل صور بطاقة العمل المحلية باستخدام أساليب FormRecognizerClient ، مثل beginRecognizeBusinessCards.

تحليل الفواتير

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

لتحليل الفواتير من عنوان URL، استخدم أسلوب beginRecognizeInvoicesFromUrl.

async function recognizeInvoices() {
    invoiceUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/invoice_sample.jpg";

    const poller = await client.beginRecognizeInvoicesFromUrl(invoiceUrl, {
        onProgress: (state) => {
            console.log(`status: ${state.status}`);
        }
    });

    const [invoice] = await poller.pollUntilDone();
    if (invoice === undefined) {
        throw new Error("Failed to extract data from at least one invoice.");
    }

    // Helper function to print fields.
    function fieldToString(field) {
        const {
            name,
            valueType,
            value,
            confidence
        } = field;
        return `${name} (${valueType}): '${value}' with confidence ${confidence}'`;
    }

    console.log("Invoice fields:");

    for (const [name, field] of Object.entries(invoice.fields)) {
        if (field.valueType !== "array" && field.valueType !== "object") {
            console.log(`- ${name} ${fieldToString(field)}`);
        }
    }

    let idx = 0;

    console.log("- Items:");

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

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

تلميح

يمكنك أيضا تحليل صور الإيصالات المحلية باستخدام أساليب FormRecognizerClient ، مثل beginRecognizeInvoices.

تحليل مستندات معرف

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

لتحليل مستندات المعرّف من عنوان URL، استخدم أسلوب beginRecognizeIdDocumentsFromUrl.

async function recognizeIdDocuments() {
    idUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/id-license.jpg";
    const poller = await client.beginRecognizeIdDocumentsFromUrl(idUrl, {
        onProgress: (state) => {
            console.log(`status: ${state.status}`);
        }
    });

    const [idDocument] = await poller.pollUntilDone();

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

    console.log("Document Type:", idDocument.formType);

    console.log("Identity Document Fields:");

    function printField(fieldName) {
        // Fields are extracted from the `fields` property of the document result
        const field = idDocument.fields[fieldName];
        console.log(
            `- ${fieldName} (${field?.valueType}): '${field?.value ?? "<missing>"}', with confidence ${field?.confidence
            }`
        );
    }

    printField("FirstName");
    printField("LastName");
    printField("DocumentNumber");
    printField("DateOfBirth");
    printField("DateOfExpiration");
    printField("Sex");
    printField("Address");
    printField("Country");
    printField("Region");
}

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

تدريب نموذج مخصص

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

إشعار

يمكنك أيضا تدريب النماذج باستخدام واجهة مستخدم رسومية (GUI) مثل أداة تسمية نموذج تحليل معلومات المستند.

التدريب على نموذج بدون تسميات

تدريب النماذج المخصصة لتحليل جميع الحقول والقيم الموجودة في النماذج المخصصة لك دون تسمية مستندات التدريب يدويًا.

تقوم الدالة التالية بتدريب نموذج على مجموعة معينة من المستندات وتطبع حالة النموذج إلى وحدة التحكم.

async function trainModel() {

    const containerSasUrl = "<SAS-URL-of-your-form-folder-in-blob-storage>";

    const poller = await trainingClient.beginTraining(containerSasUrl, false, {
        onProgress: (state) => { console.log(`training status: ${state.status}`); }
    });
    const model = await poller.pollUntilDone();

    if (!model) {
        throw new Error("Expecting valid training result!");
    }

    console.log(`Model ID: ${model.modelId}`);
    console.log(`Status: ${model.status}`);
    console.log(`Training started on: ${model.trainingStartedOn}`);
    console.log(`Training completed on: ${model.trainingCompletedOn}`);

    if (model.submodels) {
        for (const submodel of model.submodels) {
            // since the training data is unlabeled, we are unable to return the accuracy of this model
            console.log("We have recognized the following fields");
            for (const key in submodel.fields) {
                const field = submodel.fields[key];
                console.log(`The model found field '${field.name}'`);
            }
        }
    }
    // Training document information
    if (model.trainingDocuments) {
        for (const doc of model.trainingDocuments) {
            console.log(`Document name: ${doc.name}`);
            console.log(`Document status: ${doc.status}`);
            console.log(`Document page count: ${doc.pageCount}`);
            console.log(`Document errors: ${doc.errors}`);
        }
    }
}

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

فيما يلي مخرجات نموذج تم تدريبه باستخدام بيانات التدريب المتوفرة من JavaScript SDK. تم اقتطاع هذه النتيجة النموذجية لسهولة القراءة.

training status: creating
training status: ready
Model ID: 9d893595-1690-4cf2-a4b1-fbac0fb11909
Status: ready
Training started on: Thu Aug 20 2020 20:27:26 GMT-0700 (Pacific Daylight Time)
Training completed on: Thu Aug 20 2020 20:27:37 GMT-0700 (Pacific Daylight Time)
We have recognized the following fields
The model found field 'field-0'
The model found field 'field-1'
The model found field 'field-2'
The model found field 'field-3'
The model found field 'field-4'
The model found field 'field-5'
The model found field 'field-6'
The model found field 'field-7'
...
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors:
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors:
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors:
...

تدريب نموذج باستخدام تسميات

يمكنك أيضًا تدريب نماذج مخصصة عن طريق وضع التسميات يدويًا على مستندات التدريب. يؤدي التدريب باستخدام التسميات إلى أداء أفضل في بعض السيناريوهات. للتدريب باستخدام التسميات، تحتاج إلى ملفات معلومات التسمية الخاصة (<اسم الملف>.pdf.labels.json) في حاوية مخزن الكائنات الثنائية الكبيرة إلى جانب مستندات التدريب. توفر أداة تسمية نموذج ذكاء المستند واجهة مستخدم لمساعدتك في إنشاء ملفات التسمية هذه. بعد الحصول عليها، يمكنك استدعاء beginTraining الأسلوب مع تعيين المعلمة uselabels إلى true.

async function trainModelLabels() {

    const containerSasUrl = "<SAS-URL-of-your-form-folder-in-blob-storage>";

    const poller = await trainingClient.beginTraining(containerSasUrl, true, {
        onProgress: (state) => { console.log(`training status: ${state.status}`); }
    });
    const model = await poller.pollUntilDone();

    if (!model) {
        throw new Error("Expecting valid training result!");
    }

    console.log(`Model ID: ${model.modelId}`);
    console.log(`Status: ${model.status}`);
    console.log(`Training started on: ${model.trainingStartedOn}`);
    console.log(`Training completed on: ${model.trainingCompletedOn}`);

    if (model.submodels) {
        for (const submodel of model.submodels) {
            // since the training data is unlabeled, we are unable to return the accuracy of this model
            console.log("We have recognized the following fields");
            for (const key in submodel.fields) {
                const field = submodel.fields[key];
                console.log(`The model found field '${field.name}'`);
            }
        }
    }
    // Training document information
    if (model.trainingDocuments) {
        for (const doc of model.trainingDocuments) {
            console.log(`Document name: ${doc.name}`);
            console.log(`Document status: ${doc.status}`);
            console.log(`Document page count: ${doc.pageCount}`);
            console.log(`Document errors: ${doc.errors}`);
        }
    }
}

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

فيما يلي مخرجات نموذج تم تدريبه باستخدام بيانات التدريب المتوفرة من JavaScript SDK. تم اقتطاع هذه النتيجة النموذجية لسهولة القراءة.

training status: creating
training status: ready
Model ID: 789b1b37-4cc3-4e36-8665-9dde68618072
Status: ready
Training started on: Thu Aug 20 2020 20:30:37 GMT-0700 (Pacific Daylight Time)
Training completed on: Thu Aug 20 2020 20:30:43 GMT-0700 (Pacific Daylight Time)
We have recognized the following fields
The model found field 'CompanyAddress'
The model found field 'CompanyName'
The model found field 'CompanyPhoneNumber'
The model found field 'DatedAs'
...
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
...

تحليل النماذج باستخدام نموذج مخصص

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

هام

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

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

async function recognizeCustom() {
    // Model ID from when you trained your model.
    const modelId = "<modelId>";
    const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";

    const poller = await client.beginRecognizeCustomForms(modelId, formUrl, {
        onProgress: (state) => { console.log(`status: ${state.status}`); }
    });
    const forms = await poller.pollUntilDone();

    console.log("Forms:");
    for (const form of forms || []) {
        console.log(`${form.formType}, page range: ${form.pageRange}`);
        console.log("Pages:");
        for (const page of form.pages || []) {
            console.log(`Page number: ${page.pageNumber}`);
            console.log("Tables");
            for (const table of page.tables || []) {
                for (const cell of table.cells) {
                    console.log(`cell (${cell.rowIndex},${cell.columnIndex}) ${cell.text}`);
                }
            }
        }

        console.log("Fields:");
        for (const fieldName in form.fields) {
            // each field is of type FormField
            const field = form.fields[fieldName];
            console.log(
                `Field ${fieldName} has value '${field.value}' with a confidence score of ${field.confidence}`
            );
        }
    }
}

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

تلميح

يمكنك أيضا تحليل الملفات المحلية باستخدام أساليب FormRecognizerClient ، مثل beginRecognizeCustomForms.

status: notStarted
status: succeeded
Forms:
custom:form, page range: [object Object]
Pages:
Page number: 1
Tables
cell (0,0) Invoice Number
cell (0,1) Invoice Date
cell (0,2) Invoice Due Date
cell (0,3) Charges
cell (0,5) VAT ID
cell (1,0) 34278587
cell (1,1) 6/18/2017
cell (1,2) 6/24/2017
cell (1,3) $56,651.49
cell (1,5) PT
Fields:
Field Merchant has value 'Invoice For:' with a confidence score of 0.116
Field CompanyPhoneNumber has value '$56,651.49' with a confidence score of 0.249
Field VendorName has value 'Charges' with a confidence score of 0.145
Field CompanyAddress has value '1 Redmond way Suite 6000 Redmond, WA' with a confidence score of 0.258
Field CompanyName has value 'PT' with a confidence score of 0.245
Field Website has value '99243' with a confidence score of 0.114
Field DatedAs has value 'undefined' with a confidence score of undefined
Field Email has value 'undefined' with a confidence score of undefined
Field PhoneNumber has value 'undefined' with a confidence score of undefined
Field PurchaseOrderNumber has value 'undefined' with a confidence score of undefined
Field Quantity has value 'undefined' with a confidence score of undefined
Field Signature has value 'undefined' with a confidence score of undefined
Field Subtotal has value 'undefined' with a confidence score of undefined
Field Tax has value 'undefined' with a confidence score of undefined
Field Total has value 'undefined' with a confidence score of undefined

إدارة النماذج المخصصة

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

الحصول على عدد من النماذج

تحصل كتل التعليمات البرمجية التالية على عدد النماذج الموجودة حالياً في حسابك.

async function countModels() {
    // First, we see how many custom models we have, and what our limit is
    const accountProperties = await trainingClient.getAccountProperties();
    console.log(
        `Our account has ${accountProperties.customModelCount} custom models, and we can have at most ${accountProperties.customModelLimit} custom models`
    );
}
countModels().catch((err) => {
    console.error("The sample encountered an error:", err);
});

الحصول على قائمة النماذج في الحساب

توفر كتل التعليمات البرمجية التالية قائمة كاملة بالنماذج المتوفرة في حسابك بما في ذلك معلومات حول وقت إنشاء النموذج وحالته الحالية.

async function listModels() {

    // returns an async iteratable iterator that supports paging
    const result = trainingClient.listCustomModels();
    let i = 0;
    for await (const modelInfo of result) {
        console.log(`model ${i++}:`);
        console.log(modelInfo);
    }
}

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

تبدو النتيجة مثل الإخراج التالي.

model 0:
{
  modelId: '453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e',
  status: 'invalid',
  trainingStartedOn: 2020-08-20T22:28:52.000Z,
  trainingCompletedOn: 2020-08-20T22:28:53.000Z
}
model 1:
{
  modelId: '628739de-779c-473d-8214-d35c72d3d4f7',
  status: 'ready',
  trainingStartedOn: 2020-08-20T23:16:51.000Z,
  trainingCompletedOn: 2020-08-20T23:16:59.000Z
}
model 2:
{
  modelId: '789b1b37-4cc3-4e36-8665-9dde68618072',
  status: 'ready',
  trainingStartedOn: 2020-08-21T03:30:37.000Z,
  trainingCompletedOn: 2020-08-21T03:30:43.000Z
}
model 3:
{
  modelId: '9d893595-1690-4cf2-a4b1-fbac0fb11909',
  status: 'ready',
  trainingStartedOn: 2020-08-21T03:27:26.000Z,
  trainingCompletedOn: 2020-08-21T03:27:37.000Z
}

الحصول على قائمة معرفات النماذج حسب الصفحة

توفر كتلة التعليمات البرمجية هذه قائمة مرقمة من النماذج ومعرفات النموذج.

async function listModelsByPage() {
    // using `byPage()`
    i = 1;
    for await (const response of trainingClient.listCustomModels().byPage()) {
        for (const modelInfo of response.modelList) {
            console.log(`model ${i++}: ${modelInfo.modelId}`);
        }
    }
}
listModelsByPage().catch((err) => {
    console.error("The sample encountered an error:", err);
});

تبدو النتيجة مثل الإخراج التالي.

model 1: 453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e
model 2: 628739de-779c-473d-8214-d35c72d3d4f7
model 3: 789b1b37-4cc3-4e36-8665-9dde68618072

الحصول على النماذج حسب المعرف

تأخذ الدالة التالية معرف النموذج وتحصل على كائن النموذج المطابق. لا يتم استدعاء هذه الدالة بشكلٍ افتراضي.

async function getModel(modelId) {
    // Now we'll get the first custom model in the paged list
    const model = await client.getCustomModel(modelId);
    console.log("--- First Custom Model ---");
    console.log(`Model Id: ${model.modelId}`);
    console.log(`Status: ${model.status}`);
    console.log("Documents used in training:");
    for (const doc of model.trainingDocuments || []) {
        console.log(`- ${doc.name}`);
    }
}

حذف نموذج من حساب المورد

يمكنك أيضاً حذف نموذج من حسابك عن طريق الرجوع إلى معرفه. تقوم هذه الدالة بحذف النموذج مع معرف معين. لا يتم استدعاء هذه الدالة بشكلٍ افتراضي.

async function deleteModel(modelId) {
    await client.deleteModel(modelId);
    try {
        const deleted = await client.getCustomModel(modelId);
        console.log(deleted);
    } catch (err) {
        // Expected
        console.log(`Model with id ${modelId} has been deleted`);
    }
}

تبدو النتيجة مثل الإخراج التالي.

Model with id 789b1b37-4cc3-4e36-8665-9dde68618072 has been deleted

شغّل التطبيق

شغّل التطبيق باستخدام الأمر node المُتاح على ملف المشروع.

node index.js

تنظيف الموارد

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

استكشاف الأخطاء وإصلاحها

يمكنك تعيين متغير البيئة التالية لمشاهدة سجلات التصحيح عند استخدام هذه المكتبة.

export DEBUG=azure*

لمزيد من الإرشادات التفصيلية حول طريقة تمكين السجلات، راجع مستندات حزمة @azure/logger.

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

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

هام

يستهدف هذا المشروع Document Intelligence REST API الإصدار 2.1.

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

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • Python 3.x. يجب أن يتضمن تثبيت Python خاصتك pip. يمكنك التحقق مما إذا كان لديك pip مثبتا عن طريق التشغيل pip --version على سطر الأوامر. الحصول على نقطة عن طريق تثبيت أحدث إصدار من Python.

  • كائن التخزين الثنائي كبير الحجم من Azure الذي يحتوي على مجموعة من بيانات التدريب. راجع إنشاء نموذج مخصص وتدريبه للحصول على تلميحات وخيارات لتجميع مجموعة بيانات التدريب الخاصة بك. بالنسبة لهذا المشروع، يمكنك استخدام الملفات ضمن مجلد Train لمجموعة بيانات العينة. قم بتنزيل sample_data.zip واستخراجها.

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

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

إعداد بيئة البرمجة

تثبيت مكتبة العميل وإنشاء تطبيق Python.

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

  • بعد تثبيت Python، قم بتشغيل الأمر التالي لتثبيت أحدث إصدار من مكتبة عميل Document Intelligence.

    pip install azure-ai-formrecognizer 
    

إنشاء تطبيق Python

  1. إنشاء تطبيق Python يسمى form-recognizer.py في محرر أو IDE.

  2. استيراد المكتبات التالية.

    import os
    from azure.core.exceptions import ResourceNotFoundError
    from azure.ai.formrecognizer import FormRecognizerClient
    from azure.ai.formrecognizer import FormTrainingClient
    from azure.core.credentials import AzureKeyCredential
    
  3. أنشئ متغيرات لنقطة النهاية، ومفتاح موردك Azure.

    endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"
    key = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE"
    

استخدام نموذج الكائن

باستخدام Document Intelligence، يمكنك إنشاء نوعين مختلفين من العملاء. الأول، ، form_recognizer_clientيستعلم عن الخدمة للتعرف على حقول النموذج والمحتوى. الثاني، form_training_client، ينشئ ويدير نماذج مخصصة لتحسين التعرف.

form_recognizer_client يوفر العمليات التالية:

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

form_training_client يوفر عمليات إلى:

  • تدريب النماذج المخصصة لتحليل جميع الحقول والقيم الموجودة في النماذج المخصصة. راجع تدريب نموذج بدون تسميات في هذه المقالة.
  • تدريب نماذج مخصصة لتحليل حقول وقيم معينة تحددها عن طريق تسمية النماذج المخصصة. راجع تدريب نموذج مع تسميات في هذه المقالة.
  • إدارة النماذج التي تم إنشاؤها في حسابك.
  • انسخ نموذجا مخصصا من مورد Document Intelligence إلى آخر.

إشعار

يمكن أيضا تدريب النماذج باستخدام واجهة مستخدم رسومية مثل Document Intelligence Labeling Tool.

مصادقة العميل

مصادقة كائنين للعميل باستخدام متغيرات الاشتراك التي قمت بتعريفها مسبقا. استخدم كائنا AzureKeyCredential ، بحيث يمكنك تحديث المفتاح دون إنشاء كائنات عميل جديدة إذا لزم الأمر.

form_recognizer_client = FormRecognizerClient(endpoint, AzureKeyCredential(key))
form_training_client = FormTrainingClient(endpoint, AzureKeyCredential(key))

الحصول على أصول للاختبار

تحتاج إلى إضافة مراجع إلى عناوين URL لبيانات التدريب والاختبار.

  1. لاسترداد عنوان URL SAS لبيانات تدريب النموذج المخصص، انتقل إلى مورد التخزين في مدخل Microsoft Azure وحدد حاويات تخزين>البيانات.

  2. انتقل إلى الحاوية، وانقر بزر الماوس الأيمن، وحدد إنشاء SAS.

    احصل على SAS للحاوية الخاصة بك، وليس لحساب التخزين نفسه.

  3. تأكد من تحديد أذونات القراءة والكتابة والحذف والقائمة، وحدد إنشاء رمز SAS المميز وعنوان URL.

  4. انسخ القيمة الموجودة في قسم URL إلى موقع مؤقت. يجب أن يكون بالشكل: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

استخدم نموذج العينة وصور الإيصال المضمنة في العينات، والتي تتوفر أيضا على GitHub. بدلا من ذلك، أو يمكنك استخدام الخطوات المذكورة أعلاه للحصول على عنوان URL SAS لمستند فردي في تخزين blob.

إشعار

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

تحليل التخطيط

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

لتحليل محتوى ملف في URI معين، استخدم طريقة begin_recognize_content_from_url. القيمة التي تم إرجاعها هي مجموعة من FormPage الكائنات. يوجد عنصر واحد لكل صفحة في المستند المرسل. تتكرر التعليمات البرمجية التالية خلال هذه الكائنات كذا طباعة أزواج المفتاح/القيم المستخرجة وبيانات الجدول.

formUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/forms/Form_1.jpg"

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

table = page[0].tables[0] # page 1, table 1
print("Table found on page {}:".format(table.page_number))
for cell in table.cells:
    print("Cell text: {}".format(cell.text))
    print("Location: {}".format(cell.bounding_box))
    print("Confidence score: {}\n".format(cell.confidence))

تلميح

يمكنك أيضاً الحصول على محتوى من الصور المحلية باستخدام أساليب FormRecognizerClient، مثل begin_recognize_content .

Table found on page 1:
Cell text: Invoice Number
Location: [Point(x=0.5075, y=2.8088), Point(x=1.9061, y=2.8088), Point(x=1.9061, y=3.3219), Point(x=0.5075, y=3.3219)]
Confidence score: 1.0

Cell text: Invoice Date
Location: [Point(x=1.9061, y=2.8088), Point(x=3.3074, y=2.8088), Point(x=3.3074, y=3.3219), Point(x=1.9061, y=3.3219)]
Confidence score: 1.0

Cell text: Invoice Due Date
Location: [Point(x=3.3074, y=2.8088), Point(x=4.7074, y=2.8088), Point(x=4.7074, y=3.3219), Point(x=3.3074, y=3.3219)]
Confidence score: 1.0

Cell text: Charges
Location: [Point(x=4.7074, y=2.8088), Point(x=5.386, y=2.8088), Point(x=5.386, y=3.3219), Point(x=4.7074, y=3.3219)]
Confidence score: 1.0
...

تحليل الإيصالات

يوضح هذا القسم كيفية تحليل واستخراج الحقول المشتركة من الإيصالات الأمريكية باستخدام نموذج إيصال مدرب مسبقا. لمزيد من المعلومات حول تحليل الإيصال، راجع نموذج إيصال ذكاء المستند. لتحليل الإيصالات من عنوان URL، استخدم الطريقة begin_recognize_receipts_from_url.

receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png"

poller = form_recognizer_client.begin_recognize_receipts_from_url(receiptUrl)
result = poller.result()

for receipt in result:
    for name, field in receipt.fields.items():
        if name == "Items":
            print("Receipt Items:")
            for idx, items in enumerate(field.value):
                print("...Item #{}".format(idx + 1))
                for item_name, item in items.value.items():
                    print("......{}: {} has confidence {}".format(item_name, item.value, item.confidence))
        else:
            print("{}: {} has confidence {}".format(name, field.value, field.confidence))

تلميح

يمكنك أيضاً تحليل صور الاستلام المحلية باستخدام أساليب FormRecognizerClient، مثل begin_recognize_receipts .

ReceiptType: Itemized has confidence 0.659
MerchantName: Contoso Contoso has confidence 0.516
MerchantAddress: 123 Main Street Redmond, WA 98052 has confidence 0.986
MerchantPhoneNumber: None has confidence 0.99
TransactionDate: 2019-06-10 has confidence 0.985
TransactionTime: 13:59:00 has confidence 0.968
Receipt Items:
...Item #1
......Name: 8GB RAM (Black) has confidence 0.916
......TotalPrice: 999.0 has confidence 0.559
...Item #2
......Quantity: None has confidence 0.858
......Name: SurfacePen has confidence 0.858
......TotalPrice: 99.99 has confidence 0.386
Subtotal: 1098.99 has confidence 0.964
Tax: 104.4 has confidence 0.713
Total: 1203.39 has confidence 0.774

تحليل بطاقات العمل

يوضح هذا القسم كيفية تحليل واستخراج الحقول المشتركة من بطاقات العمل الإنجليزية، باستخدام نموذج مدرب مسبقا. لمزيد من المعلومات حول تحليل بطاقة العمل، راجع نموذج بطاقة عمل Document Intelligence.

لتحليل بطاقات العمل من عنوان URL، استخدم الطريقة begin_recognize_business_cards_from_url.

bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg"

poller = form_recognizer_client.begin_recognize_business_cards_from_url(bcUrl)
business_cards = poller.result()

for idx, business_card in enumerate(business_cards):
    print("--------Recognizing business card #{}--------".format(idx+1))
    contact_names = business_card.fields.get("ContactNames")
    if contact_names:
        for contact_name in contact_names.value:
            print("Contact First Name: {} has confidence: {}".format(
                contact_name.value["FirstName"].value, contact_name.value["FirstName"].confidence
            ))
            print("Contact Last Name: {} has confidence: {}".format(
                contact_name.value["LastName"].value, contact_name.value["LastName"].confidence
            ))
    company_names = business_card.fields.get("CompanyNames")
    if company_names:
        for company_name in company_names.value:
            print("Company Name: {} has confidence: {}".format(company_name.value, company_name.confidence))
    departments = business_card.fields.get("Departments")
    if departments:
        for department in departments.value:
            print("Department: {} has confidence: {}".format(department.value, department.confidence))
    job_titles = business_card.fields.get("JobTitles")
    if job_titles:
        for job_title in job_titles.value:
            print("Job Title: {} has confidence: {}".format(job_title.value, job_title.confidence))
    emails = business_card.fields.get("Emails")
    if emails:
        for email in emails.value:
            print("Email: {} has confidence: {}".format(email.value, email.confidence))
    websites = business_card.fields.get("Websites")
    if websites:
        for website in websites.value:
            print("Website: {} has confidence: {}".format(website.value, website.confidence))
    addresses = business_card.fields.get("Addresses")
    if addresses:
        for address in addresses.value:
            print("Address: {} has confidence: {}".format(address.value, address.confidence))
    mobile_phones = business_card.fields.get("MobilePhones")
    if mobile_phones:
        for phone in mobile_phones.value:
            print("Mobile phone number: {} has confidence: {}".format(phone.value, phone.confidence))
    faxes = business_card.fields.get("Faxes")
    if faxes:
        for fax in faxes.value:
            print("Fax number: {} has confidence: {}".format(fax.value, fax.confidence))
    work_phones = business_card.fields.get("WorkPhones")
    if work_phones:
        for work_phone in work_phones.value:
            print("Work phone number: {} has confidence: {}".format(work_phone.value, work_phone.confidence))
    other_phones = business_card.fields.get("OtherPhones")
    if other_phones:
        for other_phone in other_phones.value:
            print("Other phone number: {} has confidence: {}".format(other_phone.value, other_phone.confidence))

تلميح

يمكنك أيضاً تحليل صور بطاقات العمل المحلية باستخدام أساليب FormRecognizerClient، مثل begin_recognize_business_cards.

تحليل الفواتير

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

لتحليل الفواتير من عنوان URL، استخدم أسلوب begin_recognize_invoices_from_url.

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

poller = form_recognizer_client.begin_recognize_invoices_from_url(invoiceUrl)
invoices = poller.result()

for idx, invoice in enumerate(invoices):
    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))
    customer_name = invoice.fields.get("CustomerName")
    if customer_name:
        print("Customer Name: {} has confidence: {}".format(customer_name.value, customer_name.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))

تلميح

يمكنك أيضاً تحليل صور الفاتورة المحلية باستخدام أساليب FormRecognizerClient، مثل begin_recognize_invoices.

تحليل مستندات معرف

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

لتحليل مستندات المعرّف من عنوان URL، استخدم أسلوب begin_recognize_id_documents_from_url.

idURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg"

for idx, id_document in enumerate(id_documents):
    print("--------Recognizing ID document #{}--------".format(idx+1))
    first_name = id_document.fields.get("FirstName")
    if first_name:
        print("First Name: {} has confidence: {}".format(first_name.value, first_name.confidence))
    last_name = id_document.fields.get("LastName")
    if last_name:
        print("Last Name: {} has confidence: {}".format(last_name.value, last_name.confidence))
    document_number = id_document.fields.get("DocumentNumber")
    if document_number:
        print("Document Number: {} has confidence: {}".format(document_number.value, document_number.confidence))
    dob = id_document.fields.get("DateOfBirth")
    if dob:
        print("Date of Birth: {} has confidence: {}".format(dob.value, dob.confidence))
    doe = id_document.fields.get("DateOfExpiration")
    if doe:
        print("Date of Expiration: {} has confidence: {}".format(doe.value, doe.confidence))
    sex = id_document.fields.get("Sex")
    if sex:
        print("Sex: {} has confidence: {}".format(sex.value, sex.confidence))
    address = id_document.fields.get("Address")
    if address:
        print("Address: {} has confidence: {}".format(address.value, address.confidence))
    country_region = id_document.fields.get("CountryRegion")
    if country_region:
        print("Country/Region: {} has confidence: {}".format(country_region.value, country_region.confidence))
    region = id_document.fields.get("Region")
    if region:
        print("Region: {} has confidence: {}".format(region.value, region.confidence))

تلميح

يمكنك أيضًا تحليل صور مستندات المعرّف باستخدام أساليب FormRecognizerClient، مثل begin_recognize_identity_documents.

تدريب نموذج مخصص

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

إشعار

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

التدريب على نموذج بدون تسميات

تدريب نماذج مخصصة لتحليل جميع الحقول والقيم الموجودة في النماذج المخصصة لك دون تسمية مستندات التدريب يدوياً.

التعليمات البرمجية التالية يستخدم عميل التدريب مع begin_training الدالة لتدريب نموذج على مجموعة معينة من المستندات. يحتوي الكائن الذي تم CustomFormModel إرجاعه على معلومات حول أنواع النماذج التي يمكن للطراز تحليلها والحقول التي يمكن استخراجها من كل نوع نموذج. تطبع كتلة التعليمات البرمجية التالية هذه المعلومات إلى وحدة التحكم.

# To train a model you need an Azure Storage account.
# Use the SAS URL to access your training files.
trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE"

poller = form_training_client.begin_training(trainingDataUrl, use_training_labels=False)
model = poller.result()

print("Model ID: {}".format(model.model_id))
print("Status: {}".format(model.status))
print("Training started on: {}".format(model.training_started_on))
print("Training completed on: {}".format(model.training_completed_on))

print("\nRecognized fields:")
for submodel in model.submodels:
    print(
        "The submodel with form type '{}' has recognized the following fields: {}".format(
            submodel.form_type,
            ", ".join(
                [
                    field.label if field.label else name
                    for name, field in submodel.fields.items()
                ]
            ),
        )
    )

# Training result information
for doc in model.training_documents:
    print("Document name: {}".format(doc.name))
    print("Document status: {}".format(doc.status))
    print("Document page count: {}".format(doc.page_count))
    print("Document errors: {}".format(doc.errors))

هذا هو إخراج نموذج مُدرّب باستخدام بيانات التدريب المتوفرة من عدة تطوير البرامج Python.

Model ID: 628739de-779c-473d-8214-d35c72d3d4f7
Status: ready
Training started on: 2020-08-20 23:16:51+00:00
Training completed on: 2020-08-20 23:16:59+00:00

Recognized fields:
The submodel with form type 'form-0' has recognized the following fields: Additional Notes:, Address:, Company Name:, Company Phone:, Dated As:, Details, Email:, Hero Limited, Name:, Phone:, Purchase Order, Purchase Order #:, Quantity, SUBTOTAL, Seattle, WA 93849 Phone:, Shipped From, Shipped To, TAX, TOTAL, Total, Unit Price, Vendor Name:, Website:
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_4.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_5.jpg
Document status: succeeded
Document page count: 1
Document errors: []

تدريب نموذج باستخدام تسميات

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

هام

للتدريب باستخدام التسميات، تحتاج إلى ملفات معلومات التسمية الخاصة (<اسم الملف>.pdf.labels.json) في حاوية مخزن الكائنات الثنائية الكبيرة إلى جانب مستندات التدريب. توفر أداة تسمية نموذج ذكاء المستند واجهة مستخدم لمساعدتك في إنشاء ملفات التسمية هذه. بعد الحصول عليها، يمكنك استدعاء الدالة begin_training مع تعيين المعلمة use_training_labels إلى true.

# To train a model you need an Azure Storage account.
# Use the SAS URL to access your training files.
trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE"

poller = form_training_client.begin_training(trainingDataUrl, use_training_labels=True)
model = poller.result()
trained_model_id = model.model_id

print("Model ID: {}".format(trained_model_id))
print("Status: {}".format(model.status))
print("Training started on: {}".format(model.training_started_on))
print("Training completed on: {}".format(model.training_completed_on))

print("\nRecognized fields:")
for submodel in model.submodels:
    print(
        "The submodel with form type '{}' has recognized the following fields: {}".format(
            submodel.form_type,
            ", ".join(
                [
                    field.label if field.label else name
                    for name, field in submodel.fields.items()
                ]
            ),
        )
    )

# Training result information
for doc in model.training_documents:
    print("Document name: {}".format(doc.name))
    print("Document status: {}".format(doc.status))
    print("Document page count: {}".format(doc.page_count))
    print("Document errors: {}".format(doc.errors))

هذا هو إخراج نموذج مُدرّب باستخدام بيانات التدريب المتوفرة من عدة تطوير البرامج Python.

Model ID: ae636292-0b14-4e26-81a7-a0bfcbaf7c91

Status: ready
Training started on: 2020-08-20 23:20:56+00:00
Training completed on: 2020-08-20 23:20:57+00:00

Recognized fields:
The submodel with form type 'form-ae636292-0b14-4e26-81a7-a0bfcbaf7c91' has recognized the following fields: CompanyAddress, CompanyName, CompanyPhoneNumber, DatedAs, Email, Merchant, PhoneNumber, PurchaseOrderNumber, Quantity, Signature, Subtotal, Tax, Total, VendorName, Website
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_4.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_5.jpg
Document status: succeeded
Document page count: 1
Document errors: []

تحليل النماذج باستخدام نموذج مخصص

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

هام

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

يمكنك استخدام begin_recognize_custom_forms_from_url الأسلوب. القيمة التي تم إرجاعها هي مجموعة من RecognizedForm الكائنات. يوجد عنصر واحد لكل صفحة في المستند المرسل. تطبع التعليمات البرمجية التالية نتائج التحليل إلى وحدة التحكم. يطبع كل حقل مُعترف عليه والقيمة المقابلة، إضافة إلى درجة الثقة.


poller = form_recognizer_client.begin_recognize_custom_forms_from_url(
    model_id=trained_model_id, form_url=formUrl)
result = poller.result()

for recognized_form in result:
    print("Form type: {}".format(recognized_form.form_type))
    for name, field in recognized_form.fields.items():
        print("Field '{}' has label '{}' with value '{}' and a confidence score of {}".format(
            name,
            field.label_data.text if field.label_data else name,
            field.value,
            field.confidence
        ))

تلميح

يمكنك أيضاً تحليل الصور المحلية. راجع أساليب FormRecognizerClient، مثل begin_recognize_custom_forms. أو راجع نموذج التعليمات البرمجية على GitHub لمعرفة السيناريوهات التي تتضمن صورًا محلية.

يعرض النموذج من المثال السابق الإخراج التالي:

Form type: form-ae636292-0b14-4e26-81a7-a0bfcbaf7c91
Field 'Merchant' has label 'Merchant' with value 'Invoice For:' and a confidence score of 0.116
Field 'CompanyAddress' has label 'CompanyAddress' with value '1 Redmond way Suite 6000 Redmond, WA' and a confidence score of 0.258
Field 'Website' has label 'Website' with value '99243' and a confidence score of 0.114
Field 'VendorName' has label 'VendorName' with value 'Charges' and a confidence score of 0.145
Field 'CompanyPhoneNumber' has label 'CompanyPhoneNumber' with value '$56,651.49' and a confidence score of 0.249
Field 'CompanyName' has label 'CompanyName' with value 'PT' and a confidence score of 0.245
Field 'DatedAs' has label 'DatedAs' with value 'None' and a confidence score of None
Field 'Email' has label 'Email' with value 'None' and a confidence score of None
Field 'PhoneNumber' has label 'PhoneNumber' with value 'None' and a confidence score of None
Field 'PurchaseOrderNumber' has label 'PurchaseOrderNumber' with value 'None' and a confidence score of None
Field 'Quantity' has label 'Quantity' with value 'None' and a confidence score of None
Field 'Signature' has label 'Signature' with value 'None' and a confidence score of None
Field 'Subtotal' has label 'Subtotal' with value 'None' and a confidence score of None
Field 'Tax' has label 'Tax' with value 'None' and a confidence score of None
Field 'Total' has label 'Total' with value 'None' and a confidence score of None

إدارة النماذج المخصصة

يوضح هذا القسم كيفية إدارة النماذج المخصصة المخزنة في حسابك.

التحقق من عدد النماذج في حساب مورد FormRecognizer

تتحقق كتلة التعليمات البرمجية التالية من عدد النماذج التي حفظتها في حساب Document Intelligence الخاص بك وتقارنها بحد الحساب.

account_properties = form_training_client.get_account_properties()
print("Our account has {} custom models, and we can have at most {} custom models".format(
    account_properties.custom_model_count, account_properties.custom_model_limit
))

تبدو النتيجة مثل الإخراج التالي.

Our account has 5 custom models, and we can have at most 5000 custom models

إدراج النماذج المخزّنة حاليًا في حساب المورد

تحظر التعليمات البرمجية التالية النماذج الحالية في حسابك وتطبع تفاصيلها إلى وحدة التحكم. كما أنه يحفظ إشارة إلى النموذج الأول.

# Next, we get a paged list of all of our custom models
custom_models = form_training_client.list_custom_models()

print("We have models with the following ids:")

# Let's pull out the first model
first_model = next(custom_models)
print(first_model.model_id)
for model in custom_models:
    print(model.model_id)

تبدو النتيجة مثل الإخراج التالي.

فيما يلي إخراج عينة حساب الاختبار.

We have models with the following ids:
453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e
628739de-779c-473d-8214-d35c72d3d4f7
ae636292-0b14-4e26-81a7-a0bfcbaf7c91
b4b5df77-8538-4ffb-a996-f67158ecd305
c6309148-6b64-4fef-aea0-d39521452699

الحصول على نموذج معين باستخدام معرف النموذج

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

custom_model = form_training_client.get_custom_model(model_id=trained_model_id)
print("Model ID: {}".format(custom_model.model_id))
print("Status: {}".format(custom_model.status))
print("Training started on: {}".format(custom_model.training_started_on))
print("Training completed on: {}".format(custom_model.training_completed_on))

فيما يلي إخراج عينة النموذج المخصص الذي أنشئ في المثال السابق.

Model ID: ae636292-0b14-4e26-81a7-a0bfcbaf7c91
Status: ready
Training started on: 2020-08-20 23:20:56+00:00
Training completed on: 2020-08-20 23:20:57+00:00

حذف نموذج من حساب المورد

يمكنك أيضاً حذف نموذج من حسابك عن طريق الرجوع إلى معرفه. هذا الرمز حذف الطراز المستخدم في المقطع السابق.

form_training_client.delete_model(model_id=custom_model.model_id)

try:
    form_training_client.get_custom_model(model_id=custom_model.model_id)
except ResourceNotFoundError:
    print("Successfully deleted model with id {}".format(custom_model.model_id))

شغّل التطبيق

قم بتشغيل التطبيق باستخدام الأمر python:

python form-recognizer.py

تنظيف الموارد

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

استكشاف الأخطاء وإصلاحها

قد تكون هذه المشكلات مفيدة في استكشاف الأخطاء وإصلاحها.

عام

تطرح مكتبة عميل Document Intelligence استثناءات محددة في Azure Core.

تسجيل الدخول

تستخدم هذه المكتبة مكتبة تسجيل قياسية لتسجيل الدخول. يتم تسجيل المعلومات الأساسية حول جلسات عمل HTTP، مثل عناوين URL والعناوين، على مستوى INFO.

يمكن تمكين تسجيل مستوى DEBUG مفصلة بما في ذلك الهيئات طلب /استجابة ورؤوس غير منقحة على عميل مع logging_enable وسيطة الكلمة الأساسية:

import sys
import logging
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential

# Create a logger for the 'azure' SDK
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)

# Configure a console output
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)

endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"
credential = AzureKeyCredential("PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE")

# This client will log detailed information about its HTTP sessions, at DEBUG level
form_recognizer_client = FormRecognizerClient(endpoint, credential, logging_enable=True)

وبالمثل، logging_enable يمكن تمكين تسجيل مفصل لعملية واحدة، حتى عندما لا يتم تمكين للعميل:

receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png"
poller = form_recognizer_client.begin_recognize_receipts_from_url(receiptUrl, logging_enable=True)

نماذج REST على GitHub

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

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

إشعار

يستهدف هذا المشروع Azure الذكاء الاصطناعي Document Intelligence API الإصدار 2.1 باستخدام cURL لتنفيذ استدعاءات REST API.

مرجع واجهة برمجة تطبيقات | REST لذكاء المستند Azure REST API

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

  • اشتراك Azure - أنشئ اشتراكاً مجاناً.

  • تم تثبيت أداة سطر أوامر cURL. يتم شحن Windows 10 وWindows 11 مع نسخة من cURL. في موجه الأوامر، اكتب الأمر cURL التالي. إذا تم عرض خيارات التعليمات، يتم تثبيت cURL في بيئة Windows.

    curl -help
    

    إذا لم يتم تثبيت cURL، يمكنك الحصول عليه هنا:

  • الإصدار 6.0+ من PowerShell، أو تطبيق سطر أوامر مشابهة.

  • كائن التخزين الثنائي كبير الحجم من Azure الذي يحتوي على مجموعة من بيانات التدريب. راجع إنشاء نموذج مخصص وتدريبه للحصول على تلميحات وخيارات لتجميع مجموعة بيانات التدريب الخاصة بك. يمكنك استخدام الملفات ضمن المجلد Train لمجموعة بيانات العينة. قم بتنزيل sample_data.zip واستخراجها.

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

  • المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل التطبيق الخاص بك بخدمة Azure Document Intelligence.

    1. بعد نشر المورد الخاص بك، حدد»Go to resource».
    2. في قائمة التنقل اليسرى، حدد المفاتيح ونقطة النهاية.
    3. انسخ أحد المفاتيح ونقطة النهاية لاستخدامها لاحقا في هذه المقالة.

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

  • عنوان URL لصورة إيصال. يمكنك استخدام صورة عينة.

  • عنوان URL لصورة إيصال لبطاقة العمل. يمكنك استخدام صورة عينة.

  • عنوان URL لصورة فاتورة. يمكنك استخدام نموذج مستند.

  • عنوان URL لصورة مستند معرّف. يمكنك استخدام صورة نموذج

تحليل التخطيط

يمكنك استخدام Document Intelligence لتحليل واستخراج الجداول وعلامات التحديد والنص والبنية في المستندات، دون الحاجة إلى تدريب نموذج. لمزيد من المعلومات حول استخراج التخطيط، راجع نموذج تخطيط تحليل معلومات المستند.

قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل <المفتاح> بالمفتاح الذي نسخته من الخطوة السابقة.
  3. استبدل <your-document-url> بأحد أمثلة عناوين URL.
curl -v -i POST "https://<endpoint>/formrecognizer/v2.1/layout/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{​​​​​​​'source': '<your-document-url>'}​​​​​​​​"

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

https://cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/<resultId>

إن السلسلة، في المثال التالي، كجزء من عنوان URL، بعد analyzeResults/ هي معرّف النتيجة.

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

الحصول على نتائج المخطط

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

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل <المفتاح> بالمفتاح الذي نسخته من الخطوة السابقة.
  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.

{
    "status": "succeeded",
    "createdDateTime": "2020-08-20T20:40:50Z",
    "lastUpdatedDateTime": "2020-08-20T20:40:55Z",
    "analyzeResult": {
        "version": "2.1.0",
        "readResults": [
            {
                "page": 1,
                "angle": 0,
                "width": 8.5,
                "height": 11,
                "unit": "inch",
                "lines": [
                    {
                        "boundingBox": [
                            0.5826,
                            0.4411,
                            2.3387,
                            0.4411,
                            2.3387,
                            0.7969,
                            0.5826,
                            0.7969
                        ],
                        "text": "Contoso, Ltd.",
                        "words": [
                            {
                                "boundingBox": [
                                    0.5826,
                                    0.4411,
                                    1.744,
                                    0.4411,
                                    1.744,
                                    0.7969,
                                    0.5826,
                                    0.7969
                                ],
                                "text": "Contoso,",
                                "confidence": 1
                            },
                            {
                                "boundingBox": [
                                    1.8448,
                                    0.4446,
                                    2.3387,
                                    0.4446,
                                    2.3387,
                                    0.7631,
                                    1.8448,
                                    0.7631
                                ],
                                "text": "Ltd.",
                                "confidence": 1
                            }
                        ]
                    },
                    ...
                        ]
                    }
                ],
                "selectionMarks": [
                    {
                        "boundingBox": [
                            3.9737,
                            3.7475,
                            4.1693,
                            3.7475,
                            4.1693,
                            3.9428,
                            3.9737,
                            3.9428
                        ],
                        "confidence": 0.989,
                        "state": "selected"
                    },
                    ...
                ]
            }
        ],
        "pageResults": [
            {
                "page": 1,
                "tables": [
                    {
                        "rows": 5,
                        "columns": 5,
                        "cells": [
                            {
                                "rowIndex": 0,
                                "columnIndex": 0,
                                "text": "Training Date",
                                "boundingBox": [
                                    0.5133,
                                    4.2167,
                                    1.7567,
                                    4.2167,
                                    1.7567,
                                    4.4492,
                                    0.5133,
                                    4.4492
                                ],
                                "elements": [
                                    "#/readResults/0/lines/12/words/0",
                                    "#/readResults/0/lines/12/words/1"
                                ]
                            },
                            ...
                        ]
                    },
                    ...
                ]
            }
        ]
    }
}

تحليل الإيصالات

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

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل <عنوان URL> للإيصال بعنوان URL لصورة الإيصال.
  3. استبدل <المفتاح> بالمفتاح الذي نسخته من الخطوة السابقة.
curl -i -X POST "https://<endpoint>/formrecognizer/v2.1/prebuilt/receipt/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{ 'source': '<your receipt URL>'}"

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

https://cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/<resultId>

إن السلسلة، في المثال التالي، بعد operations/ هي معرّف النتيجة:

https://cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/operations/aeb13e15-555d-4f02-ba47-04d89b487ed5

الحصول على نتائج الإيصالات

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

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها بمفتاح Document Intelligence.
  2. استبدل <resultId> بمعرف النتيجة من الخطوة السابقة.
  3. استبدل <المفتاح> بمفتاحك.
curl -X GET "https://<endpoint>/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/<resultId>" -H "Ocp-Apim-Subscription-Key: <key>"

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

"readResults" تحتوي العقدة على كل النص الذي تم التعرف عليه، إذا قمت بتعيين المعلمة الاختيارية includeTextDetails إلى true). تنظم الاستجابة النص حسب الصفحة، ثم سطرا، ثم حسب الكلمات الفردية. تحتوي العقدة "documentResults" على قيم خاصة بالإيصال التي اكتشفها النموذج. العقدة "documentResults" هي المكان الذي تجد فيه أزواج مفتاح/قيمة مفيدة مثل الضريبة والإجمالي وعنوان التاجر وما إلى ذلك.

راجع صورة الإيصال التالية وناتج JSON المقابل لها.

تظهر الصورة إيصالا مطبوعا من شركة Contoso.

تم اختصار إخراج نص الاستجابة هذا من أجل قابلية القراءة. راجع ناتج النموذج الكامل على GitHub.

{
  "status":"succeeded",
  "createdDateTime":"2019-12-17T04:11:24Z",
  "lastUpdatedDateTime":"2019-12-17T04:11:32Z",
  "analyzeResult":{
    "version":"2.1.0",
    "readResults":[
      {
        "page":1,
        "angle":0.6893,
        "width":1688,
        "height":3000,
        "unit":"pixel",
        "language":"en",
        "lines":[
          {
            "text":"Contoso",
            "boundingBox":[
              635,
              510,
              1086,
              461,
              1098,
              558,
              643,
              604
            ],
            "words":[
              {
                "text":"Contoso",
                "boundingBox":[
                  639,
                  510,
                  1087,
                  461,
                  1098,
                  551,
                  646,
                  604
                ],
                "confidence":0.955
              }
            ]
          },
          ...
        ]
      }
    ],
    "documentResults":[
      {
        "docType":"prebuilt:receipt",
        "pageRange":[
          1,
          1
        ],
        "fields":{
          "ReceiptType":{
            "type":"string",
            "valueString":"Itemized",
            "confidence":0.692
          },
          "MerchantName":{
            "type":"string",
            "valueString":"Contoso Contoso",
            "text":"Contoso Contoso",
            "boundingBox":[
              378.2,
              292.4,
              1117.7,
              468.3,
              1035.7,
              812.7,
              296.3,
              636.8
            ],
            "page":1,
            "confidence":0.613,
            "elements":[
              "#/readResults/0/lines/0/words/0",
              "#/readResults/0/lines/1/words/0"
            ]
          },
          "MerchantAddress":{
            "type":"string",
            "valueString":"123 Main Street Redmond, WA 98052",
            "text":"123 Main Street Redmond, WA 98052",
            "boundingBox":[
              302,
              675.8,
              848.1,
              793.7,
              809.9,
              970.4,
              263.9,
              852.5
            ],
            "page":1,
            "confidence":0.99,
            "elements":[
              "#/readResults/0/lines/2/words/0",
              "#/readResults/0/lines/2/words/1",
              "#/readResults/0/lines/2/words/2",
              "#/readResults/0/lines/3/words/0",
              "#/readResults/0/lines/3/words/1",
              "#/readResults/0/lines/3/words/2"
            ]
          },
          "MerchantPhoneNumber":{
            "type":"phoneNumber",
            "valuePhoneNumber":"+19876543210",
            "text":"987-654-3210",
            "boundingBox":[
              278,
              1004,
              656.3,
              1054.7,
              646.8,
              1125.3,
              268.5,
              1074.7
            ],
            "page":1,
            "confidence":0.99,
            "elements":[
              "#/readResults/0/lines/4/words/0"
            ]
          },
          "TransactionDate":{
            "type":"date",
            "valueDate":"2019-06-10",
            "text":"6/10/2019",
            "boundingBox":[
              265.1,
              1228.4,
              525,
              1247,
              518.9,
              1332.1,
              259,
              1313.5
            ],
            "page":1,
            "confidence":0.99,
            "elements":[
              "#/readResults/0/lines/5/words/0"
            ]
          },
          "TransactionTime":{
            "type":"time",
            "valueTime":"13:59:00",
            "text":"13:59",
            "boundingBox":[
              541,
              1248,
              677.3,
              1261.5,
              668.9,
              1346.5,
              532.6,
              1333
            ],
            "page":1,
            "confidence":0.977,
            "elements":[
              "#/readResults/0/lines/5/words/1"
            ]
          },
          "Items":{
            "type":"array",
            "valueArray":[
              {
                "type":"object",
                "valueObject":{
                  "Quantity":{
                    "type":"number",
                    "text":"1",
                    "boundingBox":[
                      245.1,
                      1581.5,
                      300.9,
                      1585.1,
                      295,
                      1676,
                      239.2,
                      1672.4
                    ],
                    "page":1,
                    "confidence":0.92,
                    "elements":[
                      "#/readResults/0/lines/7/words/0"
                    ]
                  },
                  "Name":{
                    "type":"string",
                    "valueString":"Cappuccino",
                    "text":"Cappuccino",
                    "boundingBox":[
                      322,
                      1586,
                      654.2,
                      1601.1,
                      650,
                      1693,
                      317.8,
                      1678
                    ],
                    "page":1,
                    "confidence":0.923,
                    "elements":[
                      "#/readResults/0/lines/7/words/1"
                    ]
                  },
                  "TotalPrice":{
                    "type":"number",
                    "valueNumber":2.2,
                    "text":"$2.20",
                    "boundingBox":[
                      1107.7,
                      1584,
                      1263,
                      1574,
                      1268.3,
                      1656,
                      1113,
                      1666
                    ],
                    "page":1,
                    "confidence":0.918,
                    "elements":[
                      "#/readResults/0/lines/8/words/0"
                    ]
                  }
                }
              },
              ...
            ]
          },
          "Subtotal":{
            "type":"number",
            "valueNumber":11.7,
            "text":"11.70",
            "boundingBox":[
              1146,
              2221,
              1297.3,
              2223,
              1296,
              2319,
              1144.7,
              2317
            ],
            "page":1,
            "confidence":0.955,
            "elements":[
              "#/readResults/0/lines/13/words/1"
            ]
          },
          "Tax":{
            "type":"number",
            "valueNumber":1.17,
            "text":"1.17",
            "boundingBox":[
              1190,
              2359,
              1304,
              2359,
              1304,
              2456,
              1190,
              2456
            ],
            "page":1,
            "confidence":0.979,
            "elements":[
              "#/readResults/0/lines/15/words/1"
            ]
          },
          "Tip":{
            "type":"number",
            "valueNumber":1.63,
            "text":"1.63",
            "boundingBox":[
              1094,
              2479,
              1267.7,
              2485,
              1264,
              2591,
              1090.3,
              2585
            ],
            "page":1,
            "confidence":0.941,
            "elements":[
              "#/readResults/0/lines/17/words/1"
            ]
          },
          "Total":{
            "type":"number",
            "valueNumber":14.5,
            "text":"$14.50",
            "boundingBox":[
              1034.2,
              2617,
              1387.5,
              2638.2,
              1380,
              2763,
              1026.7,
              2741.8
            ],
            "page":1,
            "confidence":0.985,
            "elements":[
              "#/readResults/0/lines/19/words/0"
            ]
          }
        }
      }
    ]
  }
}

تحليل بطاقات العمل

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

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل <عنوان URL> لبطاقة العمل بعنوان URL لصورة الإيصال.
  3. استبدل <المفتاح> بالمفتاح الذي نسخته من الخطوة السابقة.
curl -i -X POST "https://<endpoint>/formrecognizer/v2.1/prebuilt/businessCard/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{ 'source': '<your receipt URL>'}"

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

https://cognitiveservice/formrecognizer/v2.1/prebuilt/businessCard/analyzeResults/<resultId>

إن السلسلة، في المثال التالي، كجزء من عنوان URL، بعد analyzeResults/ هي معرّف النتيجة.

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

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

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها بمفتاح Document Intelligence.
  2. استبدل <resultId> بمعرف النتيجة من الخطوة السابقة.
  3. استبدل <المفتاح> بمفتاحك.
curl -v -X GET https://<endpoint>/formrecognizer/v2.1/prebuilt/businessCard/analyzeResults/<resultId>"
-H "Ocp-Apim-Subscription-Key: <key>"

تتلقى استجابة 200 (Success) مع إخراج JSON.

تحتوي العقدة "readResults" على النص الذي تم التعرف عليه بالكامل. تنظم الاستجابة النص حسب الصفحة، ثم سطرا، ثم حسب الكلمات الفردية. تحتوي العقدة "documentResults" على قيم خاصة ببطاقة العمل التي اكتشفها النموذج. العقدة "documentResults" هي المكان الذي تجد فيه معلومات اتصال مفيدة مثل اسم الشركة والاسم الأول واسم العائلة ورقم الهاتف وما إلى ذلك.

تظهر الصورة بطاقة عمل من شركة تسمى Contoso.

تم اختصار ناتج JSON من أجل إمكانية القراءة. راجع ناتج النموذج الكامل على GitHub.

{
    "status": "succeeded",
    "createdDateTime":"2021-02-09T18:14:05Z",
    "lastUpdatedDateTime":"2021-02-09T18:14:10Z",
    "analyzeResult": {
        "version": "2.1.0",
        "readResults": [
            {
             "page":1,
             "angle":-16.6836,
             "width":4032,
             "height":3024,
             "unit":"pixel"
          }
        ],
        "documentResults": [
            {
                "docType": "prebuilt:businesscard",
                "pageRange": [
                    1,
                    1
                ],
                "fields": {
                    "ContactNames": {
                        "type": "array",
                        "valueArray": [
                            {
                                "type": "object",
                                "valueObject": {
                                    "FirstName": {
                                        "type": "string",
                                        "valueString": "Avery",
                                        "text": "Avery",
                                        "boundingBox": [
                                            703,
                                            1096,
                                            1134,
                                            989,
                                            1165,
                                            1109,
                                            733,
                                            1206
                                        ],
                                        "page": 1
                                },
                                "text": "Dr. Avery Smith",
                                "boundingBox": [
                                    419.3,
                                    1154.6,
                                    1589.6,
                                    877.9,
                                    1618.9,
                                    1001.7,
                                    448.6,
                                    1278.4
                                ],
                                "confidence": 0.993
                            }
                        ]
                    },
                    "Emails": {
                        "type": "array",
                        "valueArray": [
                            {
                                "type": "string",
                                "valueString": "avery.smith@contoso.com",
                                "text": "avery.smith@contoso.com",
                                "boundingBox": [
                                    2107,
                                    934,
                                    2917,
                                    696,
                                    2935,
                                    764,
                                    2126,
                                    995
                                ],
                                "page": 1,
                                "confidence": 0.99
                            }
                        ]
                    },
                    "Websites": {
                        "type": "array",
                        "valueArray": [
                            {
                                "type": "string",
                                "valueString": "https://www.contoso.com/",
                                "text": "https://www.contoso.com/",
                                "boundingBox": [
                                    2121,
                                    1002,
                                    2992,
                                    755,
                                    3014,
                                    826,
                                    2143,
                                    1077
                                ],
                                "page": 1,
                                "confidence": 0.995
                            }
                        ]
                    }
                }
            }
        ]
    }
}

يطبع البرنامج النصي الاستجابات إلى وحدة التحكم حتى تكتمل عملية تحليل بطاقة العمل.

تحليل الفواتير

يمكنك استخدام Document Intelligence لاستخراج نص الحقل والقيم الدلالية من مستند فاتورة معين. لبدء تحليل فاتورة، استخدم الأمر cURL. للحصول على المزيد من المعلومات حول تحليل الفاتورة، راجع الدليل التصوري للفواتير. لبدء تحليل فاتورة، اتصل بواجهة برمجة تطبيقات تحليل الفاتورة باستخدام الأمر cURL.

قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل <عنوان URL> للفاتورة بعنوان URL لمستند فاتورة.
  3. استبدل <المفتاح> بمفتاحك.
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 "{​​​​​​​'source': '<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

بعد استدعاء واجهة برمجة تطبيقات تحليل الفاتورة، اتصل بواجهة برمجة تطبيقات Get Analyze Invoice Result للحصول على حالة العملية والبيانات المستخرجة.

قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها بمفتاح Document Intelligence.
  2. استبدل <resultId> بمعرف النتيجة من الخطوة السابقة.
  3. استبدل <المفتاح> بمفتاحك.
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" على معلومات المفتاح/القيمة للأجزاء الأكثر صلة بالفاتورة.

راجع مستند الفاتورة التالية وناتج JSON المقابل له.

تم اختصار محتوى JSON لنص الاستجابة هذا لسهولة القراءة. راجع ناتج النموذج الكامل على GitHub.

{
    "status": "succeeded",
    "createdDateTime": "2020-11-06T23:32:11Z",
    "lastUpdatedDateTime": "2020-11-06T23:32:20Z",
    "analyzeResult": {
        "version": "2.1.0",
        "readResults": [{
            "page": 1,
            "angle": 0,
            "width": 8.5,
            "height": 11,
            "unit": "inch"
        }],
        "pageResults": [{
            "page": 1,
            "tables": [{
                "rows": 3,
                "columns": 4,
                "cells": [{
                    "rowIndex": 0,
                    "columnIndex": 0,
                    "text": "QUANTITY",
                    "boundingBox": [0.4953,
                    5.7306,
                    1.8097,
                    5.7306,
                    1.7942,
                    6.0122,
                    0.4953,
                    6.0122]
                },
                {
                    "rowIndex": 0,
                    "columnIndex": 1,
                    "text": "DESCRIPTION",
                    "boundingBox": [1.8097,
                    5.7306,
                    5.7529,
                    5.7306,
                    5.7452,
                    6.0122,
                    1.7942,
                    6.0122]
                },
                ...
                ],
                "boundingBox": [0.4794,
                5.7132,
                8.0158,
                5.714,
                8.0118,
                6.5627,
                0.4757,
                6.5619]
            },
            {
                "rows": 2,
                "columns": 6,
                "cells": [{
                    "rowIndex": 0,
                    "columnIndex": 0,
                    "text": "SALESPERSON",
                    "boundingBox": [0.4979,
                    4.963,
                    1.8051,
                    4.963,
                    1.7975,
                    5.2398,
                    0.5056,
                    5.2398]
                },
                {
                    "rowIndex": 0,
                    "columnIndex": 1,
                    "text": "P.O. NUMBER",
                    "boundingBox": [1.8051,
                    4.963,
                    3.3047,
                    4.963,
                    3.3124,
                    5.2398,
                    1.7975,
                    5.2398]
                },
                ...
                ],
                "boundingBox": [0.4976,
                4.961,
                7.9959,
                4.9606,
                7.9959,
                5.5204,
                0.4972,
                5.5209]
            }]
        }],
        "documentResults": [{
            "docType": "prebuilt:invoice",
            "pageRange": [1,
            1],
            "fields": {
                "AmountDue": {
                    "type": "number",
                    "valueNumber": 610,
                    "text": "$610.00",
                    "boundingBox": [7.3809,
                    7.8153,
                    7.9167,
                    7.8153,
                    7.9167,
                    7.9591,
                    7.3809,
                    7.9591],
                    "page": 1,
                    "confidence": 0.875
                },
                "BillingAddress": {
                    "type": "string",
                    "valueString": "123 Bill St, Redmond WA, 98052",
                    "text": "123 Bill St, Redmond WA, 98052",
                    "boundingBox": [0.594,
                    4.3724,
                    2.0125,
                    4.3724,
                    2.0125,
                    4.7125,
                    0.594,
                    4.7125],
                    "page": 1,
                    "confidence": 0.997
                },
                "BillingAddressRecipient": {
                    "type": "string",
                    "valueString": "Microsoft Finance",
                    "text": "Microsoft Finance",
                    "boundingBox": [0.594,
                    4.1684,
                    1.7907,
                    4.1684,
                    1.7907,
                    4.2837,
                    0.594,
                    4.2837],
                    "page": 1,
                    "confidence": 0.998
                },
                ...
            }
        }]
    }
}

تحليل مستندات الهوية

لبدء تحليل مستند تعريف (ID)، استخدم الأمر cURL. لمزيد من المعلومات حول تحليل مستند المعرف، راجع نموذج مستند معرف معلومات المستند. لبدء تحليل مستند معرف، يمكنك استدعاء واجهة برمجة تطبيقات تحليل مستند المعرف باستخدام الأمر cURL.

قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل <عنوان URL> لمستند المعرف بعنوان URL لصورة الإيصال.
  3. استبدل <المفتاح> بالمفتاح الذي نسخته من الخطوة السابقة.
curl -i -X POST "https://<endpoint>/formrecognizer/v2.1/prebuilt/idDocument/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{ 'source': '<your ID document URL>'}"

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

https://cognitiveservice/formrecognizer/v2.1/prebuilt/documentId/analyzeResults/<resultId>

إن السلسلة، في المثال التالي، بعد analyzeResults/ هي معرّف النتيجة:

https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/prebuilt/idDocument/analyzeResults/3bc1d6e0-e24c-41d2-8c50-14e9edc336d1

الحصول على تحليل نتيجة مستند المعرّف

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

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها بمفتاح Document Intelligence.
  2. استبدل <resultId> بمعرف النتيجة من الخطوة السابقة.
  3. استبدل <المفتاح> بمفتاحك.
curl -X GET "https://<endpoint>/formrecognizer/v2.1/prebuilt/idDocument/analyzeResults/<resultId>" -H "Ocp-Apim-Subscription-Key: <key>"

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

  • يحتوي الحقل "readResults" على كل سطر من النص تم استخراجه من مستند المعرّف.
  • يحتوي الحقل "documentResults" على مصفوفة من العناصر، يمثل كل منها مستندًا معرّفًا تم اكتشافه في مستند الإدخال.

فيما يلي نموذج لمستند المعرف وإخراج JSON المقابل له.

لقطة شاشة تعرض نموذج رخصة قيادة.

إليك نص الاستجابة.

{
    "status": "succeeded",
    "createdDateTime": "2021-04-13T17:24:52Z",
    "lastUpdatedDateTime": "2021-04-13T17:24:55Z",
    "analyzeResult": {
      "version": "2.1.0",
      "readResults": [
        {
          "page": 1,
          "angle": -0.2823,
          "width": 450,
          "height": 294,
          "unit": "pixel"
        }
      ],
      "documentResults": [
        {
          "docType": "prebuilt:idDocument:driverLicense",
          "docTypeConfidence": 0.995,
          "pageRange": [
            1,
            1
          ],
          "fields": {
            "Address": {
              "type": "string",
              "valueString": "123 STREET ADDRESS YOUR CITY WA 99999-1234",
              "text": "123 STREET ADDRESS YOUR CITY WA 99999-1234",
              "boundingBox": [
                158,
                151,
                326,
                151,
                326,
                177,
                158,
                177
              ],
              "page": 1,
              "confidence": 0.965
            },
            "CountryRegion": {
              "type": "countryRegion",
              "valueCountryRegion": "USA",
              "confidence": 0.99
            },
            "DateOfBirth": {
              "type": "date",
              "valueDate": "1958-01-06",
              "text": "01/06/1958",
              "boundingBox": [
                187,
                133,
                272,
                132,
                272,
                148,
                187,
                149
              ],
              "page": 1,
              "confidence": 0.99
            },
            "DateOfExpiration": {
              "type": "date",
              "valueDate": "2020-08-12",
              "text": "08/12/2020",
              "boundingBox": [
                332,
                230,
                414,
                228,
                414,
                244,
                332,
                245
              ],
              "page": 1,
              "confidence": 0.99
            },
            "DocumentNumber": {
              "type": "string",
              "valueString": "LICWDLACD5DG",
              "text": "LIC#WDLABCD456DG",
              "boundingBox": [
                162,
                70,
                307,
                68,
                307,
                84,
                163,
                85
              ],
              "page": 1,
              "confidence": 0.99
            },
            "FirstName": {
              "type": "string",
              "valueString": "LIAM R.",
              "text": "LIAM R.",
              "boundingBox": [
                158,
                102,
                216,
                102,
                216,
                116,
                158,
                116
              ],
              "page": 1,
              "confidence": 0.985
            },
            "LastName": {
              "type": "string",
              "valueString": "TALBOT",
              "text": "TALBOT",
              "boundingBox": [
                160,
                86,
                213,
                85,
                213,
                99,
                160,
                100
              ],
              "page": 1,
              "confidence": 0.987
            },
            "Region": {
              "type": "string",
              "valueString": "Washington",
              "confidence": 0.99
            },
            "Sex": {
              "type": "string",
              "valueString": "M",
              "text": "M",
              "boundingBox": [
                226,
                190,
                232,
                190,
                233,
                201,
                226,
                201
              ],
              "page": 1,
              "confidence": 0.99
            }
          }
        }
      ]
    }
  }

تدريب نموذج مخصص

لتدريب نموذج مخصص، تحتاج إلى مجموعة من بيانات التدريب في كائن ثنائي كبير الحجم ل Azure Storage. أنت بحاجة إلى ما لا يقل عن خمسة نماذج مملوءة (مستندات و/ أو صور PDF) من نفس النوع/ التصميم. راجع إنشاء نموذج مخصص وتدريبه للحصول على تلميحات وخيارات لتجميع بيانات التدريب الخاصة بك.

التدريب بدون البيانات المسماة هو العملية الافتراضية بل وأبسط منها. بدلاً من ذلك، يمكنك تسمية بعض بيانات التدريب مسبقًا يدويًّا أو جميعها. التسمية اليدوية عملية أعقد ولكنها تؤدي إلى نموذج مُدرب بصورة أفضل.

إشعار

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

التدريب على نموذج بدون تسميات

لتدريب نموذج Document Intelligence مع المستندات في حاوية Azure blob، استدع واجهة برمجة تطبيقات Train Custom Model عن طريق تشغيل الأمر cURL التالي. قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل <المفتاح> بالمفتاح الذي نسخته من الخطوة السابقة.
  3. استبدل <SAS URL> بعنوان URL لتوقيع الوصول المشترك (SAS) الخاص بحاوية تخزين Azure Blob.

لاسترداد عنوان URL SAS لبيانات تدريب النموذج المخصص:

  1. انتقل إلى مورد التخزين في مدخل Microsoft Azure وحدد حاويات تخزين>البيانات.

  2. انتقل إلى الحاوية، وانقر بزر الماوس الأيمن، وحدد إنشاء SAS.

    احصل على SAS للحاوية الخاصة بك، وليس لحساب التخزين نفسه.

  3. تأكد من تحديد أذونات القراءة والكتابة والحذف والقائمة، وحدد إنشاء رمز SAS المميز وعنوان URL.

  4. انسخ القيمة الموجودة في قسم URL إلى موقع مؤقت. يجب أن يكون بالشكل: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

قم بإجراء التغييرات ثم قم بتشغيل الأمر:

curl -i -X POST "https://<endpoint>/formrecognizer/v2.1/custom/models" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{ 'source': '<SAS URL>'}"

تتلقى استجابة 201 (Success) مع Location عنوان. تحتوي قيمة هذا العنوان على معرّف للنموذج الذي تم التدريب عليه حديثًا حتى يمكنك استخدامه للاستعلام عن حالة العملية والحصول على النتائج:

https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>

إن السلسلة، في المثال التالي، كجزء من عنوان URL، بعد models/ هي معرّف النموذج.

https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/custom/models/77d8ecad-b8c1-427e-ac20-a3fe4af503e9

تدريب نموذج باستخدام تسميات

للتدريب باستخدام التسميات، تحتاج إلى ملفات معلومات التسمية الخاصة (<اسم الملف>.pdf.labels.json) في حاوية مخزن الكائنات الثنائية الكبيرة إلى جانب مستندات التدريب. توفر أداة تسمية نموذج ذكاء المستند واجهة مستخدم لمساعدتك في إنشاء ملفات التسمية هذه. بعد الحصول عليها، اتصل بواجهة برمجة تطبيقات تدريب النموذج المخصص، مع تعيين المعلمة "useLabelFile" إلى true في نص JSON.

قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل <المفتاح> بالمفتاح الذي نسخته من الخطوة السابقة.
  3. استبدل <SAS URL> بعنوان URL لتوقيع الوصول المشترك (SAS) الخاص بحاوية تخزين Azure Blob.

لاسترداد عنوان URL SAS لبيانات تدريب النموذج المخصص:

  1. انتقل إلى مورد التخزين في مدخل Microsoft Azure وحدد Data storage>Containers.1. انتقل إلى الحاوية، وانقر بزر الماوس الأيمن، وحدد إنشاء SAS.

    احصل على SAS للحاوية الخاصة بك، وليس لحساب التخزين نفسه.

  2. تأكد من تحديد أذونات القراءة والكتابة والحذف والقائمة، وحدد إنشاء رمز SAS المميز وعنوان URL.

  3. انسخ القيمة الموجودة في قسم URL إلى موقع مؤقت. يجب أن يكون بالشكل: https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.

قم بإجراء التغييرات ثم قم بتشغيل الأمر:

curl -i -X POST "https://<endpoint>/formrecognizer/v2.1/custom/models" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" --data-ascii "{ 'source': '<SAS URL>', 'useLabelFile':true}"

تتلقى استجابة 201 (Success) مع Location عنوان. تحتوي قيمة هذا العنوان على معرّف للنموذج الذي تم التدريب عليه حديثًا حتى يمكنك استخدامه للاستعلام عن حالة العملية والحصول على النتائج:

https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>

إن السلسلة، في المثال التالي، كجزء من عنوان URL، بعد models/ هي معرّف النموذج.

https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/custom/models/62e79d93-78a7-4d18-85be-9540dbb8e792

بعد بدء عملية التدريب، استخدم Get Custom Model للتحقق من حالة التدريب. مرر معرّف النموذج إلى طلب واجهة برمجة التطبيقات للتحقق من حالة التدريب:

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها بمفتاح Document Intelligence.
  2. استبدال <المفتاح> بالمفتاح الخاص بك
  3. استبدل <معرف> النموذج بمعرف النموذج الذي تلقيته في الخطوة السابقة
curl -X GET "https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>"

تحليل النماذج باستخدام نموذج مخصص

بعد ذلك، استخدم النموذج المدرب حديثا لتحليل مستند واستخراج الحقول والجداول منه. استدعِ واجهة برمجة تطبيقات تحليل نموذج عن طريق تشغيل الأمر cURL التالي. قبل تشغيل الأمر، يرجى إجراء هذه التغييرات:

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها من مفتاح Document Intelligence.
  2. استبدل <معرف> النموذج بمعرف النموذج الذي تلقيته في القسم السابق.
  3. استبدل <SAS URL> بعنوان SAS URL إلى ملفك في تخزين Azure. اتبع الخطوات الموجودة في قسم التدريب، ولكن بدلاً من الحصول على عنوان URL لتوقيع وصول مشترك لحاوية الكائنات الثنائية كبيرة الحجم بأكملها، احصل على عنوان للملف المحدد الذي تريد تحليله.
  4. استبدل <المفتاح> بمفتاحك.
curl -v "https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>/analyze?includeTextDetails=true" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: <key>" -d "{ 'source': '<SAS URL>' } "

تتلقى استجابة 202 (Success) مع Operation-Location عنوان. تتضمن قيمة هذا العنوان معرف نتيجة تستخدمه لتعقب نتائج عملية التحليل:

https://cognitiveservice/formrecognizer/v2.1/custom/models/<modelId>/analyzeResults/<resultId>

إن السلسلة، في المثال التالي، كجزء من عنوان URL، بعد analyzeResults/ هي معرّف النتيجة.

https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/e175e9db-d920-4c7d-bc44-71d1653cdd06

احفظ معرّف النتائج هذا للخطوة التالية.

استدعاء واجهة برمجة تطبيقات تحليل نتائج النموذج للاستعلام عن نتائج عملية التحليل.

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها من مفتاح Document Intelligence.
  2. استبدل <معرف> النتيجة بالمعرف الذي تلقيته في القسم السابق.
  3. استبدل <المفتاح> بمفتاحك.
curl -X GET "https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>/analyzeResults/<resultId>" -H "Ocp-Apim-Subscription-Key: <key>"

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

في النماذج المخصصة التي تم التدريب عليها بدون تسميات، تكون اقترانات وجداول أزواج من المفتاح/ القيمة موجودة في عقدة "pageResults" لناتج JSON. في النماذج المخصصة التي تم التدريب عليها بتسميات، تكون اقترانات أزواج من المفتاح/القيمة موجودة في عقدة "documentResults". إذا قمت أيضا بتحديد استخراج النص العادي من خلال معلمة عنوان URL includeTextDetails ، فإن العقدة "readResults" تعرض محتوى ومواضع كل النص في المستند.

تم اختصار ناتج JSON من أجل إمكانية التبسيط. راجع ناتج النموذج الكامل على GitHub.

{
  "status": "succeeded",
  "createdDateTime": "2020-08-21T01:13:28Z",
  "lastUpdatedDateTime": "2020-08-21T01:13:42Z",
  "analyzeResult": {
    "version": "2.1.0",
    "readResults": [
      {
        "page": 1,
        "angle": 0,
        "width": 8.5,
        "height": 11,
        "unit": "inch",
        "lines": [
          {
            "text": "Project Statement",
            "boundingBox": [
              5.0444,
              0.3613,
              8.0917,
              0.3613,
              8.0917,
              0.6718,
              5.0444,
              0.6718
            ],
            "words": [
              {
                "text": "Project",
                "boundingBox": [
                  5.0444,
                  0.3587,
                  6.2264,
                  0.3587,
                  6.2264,
                  0.708,
                  5.0444,
                  0.708
                ]
              },
              {
                "text": "Statement",
                "boundingBox": [
                  6.3361,
                  0.3635,
                  8.0917,
                  0.3635,
                  8.0917,
                  0.6396,
                  6.3361,
                  0.6396
                ]
              }
            ]
          },
          ...
        ]
      }
    ],
    "pageResults": [
      {
        "page": 1,
        "keyValuePairs": [
          {
            "key": {
              "text": "Date:",
              "boundingBox": [
                6.9833,
                1.0615,
                7.3333,
                1.0615,
                7.3333,
                1.1649,
                6.9833,
                1.1649
              ],
              "elements": [
                "#/readResults/0/lines/2/words/0"
              ]
            },
            "value": {
              "text": "9/10/2020",
              "boundingBox": [
                7.3833,
                1.0802,
                7.925,
                1.0802,
                7.925,
                1.174,
                7.3833,
                1.174
              ],
              "elements": [
                "#/readResults/0/lines/3/words/0"
              ]
            },
            "confidence": 1
          },
          ...
        ],
        "tables": [
          {
            "rows": 5,
            "columns": 5,
            "cells": [
              {
                "text": "Training Date",
                "rowIndex": 0,
                "columnIndex": 0,
                "boundingBox": [
                  0.6944,
                  4.2779,
                  1.5625,
                  4.2779,
                  1.5625,
                  4.4005,
                  0.6944,
                  4.4005
                ],
                "confidence": 1,
                "rowSpan": 1,
                "columnSpan": 1,
                "elements": [
                  "#/readResults/0/lines/15/words/0",
                  "#/readResults/0/lines/15/words/1"
                ],
                "isHeader": true,
                "isFooter": false
              },
              ...
            ]
          }
        ],
        "clusterId": 0
      }
    ],
    "documentResults": [],
    "errors": []
  }
}

تحسين النتائج

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

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

تعتمد درجات الثقة التي تستهدفها على حالة الاستخدام الخاصة بك، ولكن بشكل عام من الممارسات الجيدة استهداف درجة 80 بالمائة أو أعلى. بالنسبة للحالات الأكثر حساسية، مثل قراءة السجلات الطبية أو بيانات الفوترة، نوصي بالحصول على درجة 100 بالمائة.

إدارة النماذج المخصصة

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

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل <المفتاح> بالمفتاح الذي نسخته من الخطوة السابقة.
curl -v -X GET "https://<endpoint>/formrecognizer/v2.1/custom/models?op=full"
-H "Ocp-Apim-Subscription-Key: <key>"

تتلقى استجابة 200 نجاح، مع بيانات JSON مثل ما يلي. يحتوي العنصر "modelList" على كافة النماذج التي تم إنشاؤها وعلى معلوماتها.

{
  "summary": {
    "count": 0,
    "limit": 0,
    "lastUpdatedDateTime": "string"
  },
  "modelList": [
    {
      "modelId": "string",
      "status": "creating",
      "createdDateTime": "string",
      "lastUpdatedDateTime": "string"
    }
  ],
  "nextLink": "string"
}

الحصول على نموذج معين

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

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل <المفتاح> بالمفتاح الذي نسخته من الخطوة السابقة.
  3. استبدل <modelId> بمعرف النموذج المخصص الذي تريد البحث عنه.
curl -v -X GET "https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>" -H "Ocp-Apim-Subscription-Key: <key>"

تتلقى استجابة 200 نجاح، مع بيانات JSON لنص الطلب مثل ما يلي.

{
  "modelInfo": {
    "modelId": "string",
    "status": "creating",
    "createdDateTime": "string",
    "lastUpdatedDateTime": "string"
  },
  "keys": {
    "clusters": {}
  },
  "trainResult": {
    "trainingDocuments": [
      {
        "documentName": "string",
        "pages": 0,
        "errors": [
          "string"
        ],
        "status": "succeeded"
      }
    ],
    "fields": [
      {
        "fieldName": "string",
        "accuracy": 0.0
      }
    ],
    "averageModelAccuracy": 0.0,
    "errors": [
      {
        "message": "string"
      }
    ]
  }
}

حذف نموذج من حساب المورد

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

  1. استبدل <نقطة> النهاية بنقطة النهاية التي حصلت عليها باشتراك Document Intelligence.
  2. استبدل <المفتاح> بالمفتاح الذي نسخته من الخطوة السابقة.
  3. استبدل <modelId> بمعرف النموذج المخصص الذي تريد البحث عنه.
curl -v -X DELETE "https://<endpoint>/formrecognizer/v2.1/custom/models/<modelId>" -H "Ocp-Apim-Subscription-Key: <key>"

تتلقى استجابة 204 نجاح، تشير إلى أنه تم وضع علامة على النموذج الخاص بك للحذف. تتم إزالة البيانات الاصطناعية للنموذج في غضون 48 ساعة.

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

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