استخراج نص PDF csharp

تنسيق ملف PDF شائع لأنه لا يمكن تعديل محتويات الملف بسهولة ، مقارنة بتنسيقات ملفات معالجة الكلمات الأخرى. ومع ذلك ، في C# يمكنك استخراج نص من مستندات PDF باستخدام Aspose.PDF for .NET API. في هذه المقالة ، دعنا نستكشف بعض الاحتمالات العديدة للبحث واستخراج النص من ملفات PDF باستخدام C#. فيما يلي قائمة بالميزات التي سنناقشها في هذه المدونة:

استخراج نص من مستند PDF كامل باستخدام C#

تعد قراءة محتويات النص من مستند PDF ميزة شائعة الاستخدام. باستخدام C# ، يمكنك استخراج كل النص من جميع صفحات المستند باتباع الخطوات التالية:

  1. قم بتحميل مستند PDF
  2. قم بإنشاء كائن TextAbsorber
  3. تقبل الممتص لجميع الصفحات
  4. اكتب نصًا مستخرجًا إلى ملف واحفظه

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

// افتح مستند PDF
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// إنشاء كائن TextAbsorber لاستخراج النص
TextAbsorber textAbsorber = new TextAbsorber();
// تقبل الممتص لجميع الصفحات
pdfDocument.Pages.Accept(textAbsorber);
// احصل على النص المستخرج
string extractedText = textAbsorber.Text;
// قم بإنشاء كاتب وافتح الملف
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// اكتب سطرًا من النص في الملف
tw.WriteLine(extractedText);
// أغلق الدفق
tw.Close();

البحث عن نص واستخراجه من صفحة محددة في PDF في C#

بعد استكشاف استخراج النص على مستوى المستند ، دعنا نستخرج النص من صفحة معينة من مستند PDF. ما عليك سوى اتباع الخطوات التالية لتحقيق متطلباتك:

  1. قم بتحميل مستند PDF
  2. قم بإنشاء كائن TextAbsorber
  3. تقبل الممتص لصفحة معينة
  4. اكتب نصًا مستخرجًا إلى ملف واحفظه

يتبع مقتطف الشفرة التالي الخطوات التالية لقراءة النص من أي صفحة في ملف PDF باستخدام C#:

// افتح مستند PDF
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// الوصول إلى الصفحة المطلوبة في مستند PDF
Page page = pdfDocument.Pages[1];
// إنشاء كائن TextAbsorber لاستخراج النص
TextAbsorber textAbsorber = new TextAbsorber();
// تقبل الممتص لصفحة محددة
page.Accept(textAbsorber);
// احصل على النص المستخرج
string extractedText = textAbsorber.Text;
// قم بإنشاء كاتب وافتح الملف
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// اكتب سطرًا من النص في الملف
tw.WriteLine(extractedText);
// أغلق الدفق
tw.Close();

البحث واستخراج النص من منطقة معينة من صفحة PDF في C#

لنأخذ استخراج النص هذا خطوة أخرى إلى الأمام. ضع في اعتبارك العثور على نص من منطقة معينة من الصفحة. من المهم أن نفهم هنا أن وحدة القياس الأساسية في Aspose.PDF لـ .NET هي النقطة ، حيث 72 نقطة تساوي 1 بوصة. علاوة على ذلك ، تعتبر الزاوية السفلية اليسرى أصل الصفحة (0،0).فيما يلي خطوات قراءة النص من منطقة أو قسم معين من الصفحة في مستند PDF:

  1. تحميل مستند PDF المصدر
  2. قم بإنشاء كائن TextAbsorber
  3. اضبط TextSearchOptions وحدد إحداثيات مستطيلة
  4. تقبل الممتص لصفحة معينة
  5. اكتب نصًا مستخرجًا إلى ملف

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

// افتح المستند
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// إنشاء كائن TextAbsorber لاستخراج النص
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// تقبل الممتص للصفحة الأولى
pdfDocument.Pages[1].Accept(absorber);
// احصل على النص المستخرج
string extractedText = absorber.Text;
// قم بإنشاء كاتب وافتح الملف
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// اكتب سطرًا من النص في الملف
tw.WriteLine(extractedText);
// أغلق الدفق
tw.Close();

ابحث عن نص معين أو استخرجه من ملف PDF باستخدام التعبيرات العادية باستخدام C#

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

  • تحميل وثيقة PDF الإدخال
  • قم بإنشاء كائن TextAbsorber
  • صمم تعبيرًا عاديًا وعيّنه لمطابقة بعض النصوص
  • حلقة خلال كل جزء نص مستخرج

يستخدم مقتطف كود C# تعبيرًا عاديًا يبحث عن النص الذي يحتوي على 4 أرقام ، على سبيل المثال ، 1999 ، 2000 ، وما إلى ذلك عبر جميع صفحات المستند.

// افتح المستند
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// قم بإنشاء كائن TextAbsorber للعثور على جميع مثيلات عبارة البحث المدخلة
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usage
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;
// تقبل الممتص لجميع الصفحات
pdfDocument.Pages.Accept(textFragmentAbsorber);
// الحصول على أجزاء النص المستخرجة
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// حلقة من خلال الأجزاء
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

استخراج النص من خلايا الجدول في مستند PDF باستخدام C#

يختلف استخراج النص من الجداول الموجودة في صفحة PDF قليلاً. لقد عملنا مع فئة TextAbsorber في الأمثلة السابقة ، لكن استخراج النص من جدول يختلف قليلاً. لذلك ، تحتاج إلى اتباع الخطوات التالية لاستخراج النص من كائنات الجدول:

  1. قم بتحميل ملف PDF المصدر
  2. قم بإنشاء كائن من فئة TableAbsorber
  3. كرر من خلال AbsorbedTable
  4. حلقة خلال كل خلية في كل صف من الجدول

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

Document pdfDocument = new Document(dataDir + "Test.pdf");
TableAbsorber absorber = new TableAbsorber();
absorber.Visit(pdfDocument.Pages[1]);
foreach (AbsorbedTable table in absorber.TableList)
{
    foreach (AbsorbedRow row in table.RowList)
    {
        foreach (AbsorbedCell cell in row.CellList)
        {
            TextFragment textfragment = new TextFragment();
            TextFragmentCollection textFragmentCollection = cell.TextFragments;
            foreach (TextFragment fragment in textFragmentCollection)
            {
                Console.WriteLine(fragment.Text);
            }
        }
    }
}

بحث واستخراج النص المميز من مستند PDF باستخدام C#

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

  1. تحميل وثيقة المصدر
  2. حلقة خلال جميع التعليقات التوضيحية
  3. عامل التصفية TextMarkupAnnotation
  4. استرداد أجزاء النص المميزة

فيما يلي مقتطف الشفرة بناءً على الخطوات المذكورة أعلاه ، ويمكن استخدامه للحصول على نص مميز من ملفات PDF:

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// حلقة خلال جميع التعليقات التوضيحية
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // عامل التصفية TextMarkupAnnotation
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // استرجاع أجزاء النص المميزة
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // عرض النص المميز
            Console.WriteLine(tf.Text);
        }
    }
}

استخراج نص PDF مع استهلاك منخفض للذاكرة باستخدام C#

فيما يلي طريقتان مختلفتان لتحسين استهلاك الذاكرة أثناء استخراج النص من مستندات PDF باستخدام لغة C#.

ط) استخدام أسلوب إعادة التعيين() و FreeMemory()

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

لذلك ، فإن الحل الذي نوصي به هنا هو استدعاء طريقة Abser.Reset() بعد معالجة كل صفحة. علاوة على ذلك ، إذا كنت تقوم بعمليات القراءة فقط ، فيمكنك أيضًا تحرير الذاكرة التي تحتفظ بها كائنات الصفحة ، باستخدام طريقة page.FreeMemory().لذلك عليك اتباع الخطوات التالية للاستفادة من الحد الأدنى من الموارد:

  1. تحميل مستند PDF المصدر
  2. حدد TextEditOptions
  3. قراءة جزء نص
  4. استدعاء طريقة إعادة تعيين()
  5. استدعاء طريقة FreeMemory()

يوضح مقتطف الشفرة التالي استخراج النص من مستندات PDF باستخدام C#:

Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
foreach (Page page in pdfDocument.Pages)
{
    page.Accept(absorber);
    //اقرأ شيئًا من الأجزاء
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Collect() ؛        
}

لقد اختبرنا مقتطف الشفرة هذا باستخدام ملف نموذج ضخم يحتوي على 450 صفحة و 24500 جزء نصي والكثير من الصور النقطية والمتجهة. استهلكت العملية 500 ميغا بايت فقط من الذاكرة. نصيحة أخرى هنا هي أنه يمكنك شحن .NET garbage collector لتقليل الحد الأقصى لاستهلاك الذاكرة إلى حوالي 250 ميجا بايت بتكلفة إضافية تبلغ 10 ثوانٍ من وقت المعالجة.

ب) استخدام تعداد MemorySaving

Aspose.PDF for .NET API يدعم تكوين وضع حفظ الذاكرة أثناء قراءة النص من ملف PDF. تعداد TextExtractionOptions.TextFormattingMode يخدم غرض الاستهلاك الأمثل للموارد. تلخص الخطوات التالية الخطوات التي تحتاج إلى اتباعها لهذا النهج:

  1. قم بتحميل ملف PDF المصدر
  2. قم بإنشاء كائن TextDevice
  3. تعيين TextExtractionOptions
  4. استخراج نص وكتابة نص إلى ملف

يوضح مقتطف الكود أدناه طريقة توفير الذاكرة باستخدام C#:

// افتح المستند
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// سلسلة لعقد النص المستخرج
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // إنشاء جهاز نصي
        TextDevice textDevice = new TextDevice();

        // تعيين خيارات استخراج النص - تعيين وضع استخراج النص (Raw أو Pure)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // تحويل صفحة معينة وحفظ النص في الدفق
        textDevice.Process(pdfPage, textStream);
        // تحويل صفحة معينة وحفظ النص في الدفق
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // إغلاق دفق الذاكرة
        textStream.Close();
        // احصل على نص من دفق الذاكرة
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// احفظ النص المستخرج في ملف نصي
File.WriteAllText(dataDir, builder.ToString());

استنتاج

لقد اكتشفنا عددًا قليلاً من حالات الاستخدام المفيدة العديدة في هذه المقالة ، فهناك احتمالات لا حصر لها لاستخراج نص من مستندات PDF باستخدام C# مع Aspose.PDF لـ .NET API. يمكنك معرفة المزيد من خلال وثائق API. في حالة وجود أي استفسار ، يرجى التواصل معنا على منتديات الدعم المجاني.

أنظر أيضا