แยกข้อความ 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 for .NET คือ point โดยที่ 72 point เท่ากับ 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 ด้วย Regular Expressions โดยใช้ C#

คุณสามารถแยกข้อความเฉพาะจากเอกสาร PDF ที่ตรงกับรูปแบบบางอย่างได้ ตัวอย่างเช่น คุณอาจต้องการแยกคำหรือตัวเลขเฉพาะบางคำ เพื่อจุดประสงค์นี้ คุณจะต้องออกแบบนิพจน์ทั่วไป API จะใช้ regex นั้นเพื่อค้นหาข้อความที่ตรงกันในเอกสาร PDF ขั้นตอนด้านล่างนี้เป็นแนวทางในการค้นหาและแยกข้อความเฉพาะจากไฟล์ PDF:

  • โหลดเอกสาร PDF อินพุต
  • สร้างวัตถุ TextAbsorber
  • ออกแบบและตั้งค่านิพจน์ทั่วไปให้ตรงกับข้อความบางส่วน
  • วนซ้ำแต่ละส่วนของข้อความที่แยกออกมา

ข้อมูลโค้ด C# ต่อไปนี้ใช้ regex ที่ค้นหาข้อความที่มีตัวเลข 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)
{
    // ตัวกรอง TextMarkup คำอธิบายประกอบ
    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#

i) การใช้ Reset() และ FreeMemory() วิธีการ

บางครั้งการดึงข้อความอาจใช้หน่วยความจำและตัวประมวลผลขนาดใหญ่ เป็นไปได้ว่าไฟล์อินพุตมีขนาดใหญ่และมีข้อความจำนวนมาก เนื่องจากอ็อบเจกต์ TextFragmentAbsorber เก็บเศษข้อความทั้งหมดที่พบในหน่วยความจำ

ดังนั้น วิธีแก้ปัญหาที่เราแนะนำคือเรียกเมธอด absorber.Reset() หลังจากประมวลผลแต่ละหน้า ยิ่งไปกว่านั้น หากคุณกำลังดำเนินการอ่านเพียงอย่างเดียว คุณยังสามารถเพิ่มหน่วยความจำที่จัดเก็บโดยวัตถุเพจได้ด้วยเมธอด page.FreeMemory() ดังนั้นคุณต้องทำตามขั้นตอนด้านล่างเพื่อใช้ทรัพยากรให้น้อยที่สุด:

  1. โหลดเอกสาร PDF ต้นทาง
  2. ระบุ TextEditOptions
  3. อ่าน ส่วนข้อความ
  4. เรียกใช้เมธอด Reset()
  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 และรูปภาพแรสเตอร์และเวกเตอร์จำนวนมาก กระบวนการนี้ใช้หน่วยความจำเพียง 500MB เคล็ดลับอีกอย่างคือคุณอาจเรียกเก็บเงินจากตัวรวบรวมขยะ .NET เพื่อลดการใช้หน่วยความจำสูงสุดให้เหลือประมาณ 250MB โดยมีค่าใช้จ่ายเพิ่มเติม 10 วินาทีในการประมวลผล

ii) การใช้การแจงนับ 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();

        // ตั้งค่าตัวเลือกการดึงข้อความ - ตั้งค่าโหมดการดึงข้อความ (ดิบหรือบริสุทธิ์)
        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 for .NET API คุณสามารถเรียนรู้เพิ่มเติมผ่าน เอกสาร API ในกรณีที่มีคำถามใดๆ โปรดติดต่อเราที่ ฟอรัมสนับสนุนฟรี

ดูสิ่งนี้ด้วย