การสกัดข้อความ
การสกัดข้อความ
Aspose.PDF FOSS for .NET มีหลายกลไกสำหรับการสกัดข้อความจากหน้า PDF. TextFragmentAbsorber เป็นเครื่องมือหลัก — มันสแกนเนื้อหาหน้าและส่งคืนวัตถุ TextFragment ที่มีโครงสร้างพร้อมข้อมูลตำแหน่ง, แบบอักษร, และสไตล์.
การสกัดข้อความพื้นฐาน
TextAbsorber ดึงข้อความทั้งหมดจากหน้า หรือเอกสารเป็นสตริงเดียว.
using var doc = Document.Open(pdfBytes);
var absorber = new TextAbsorber();
doc.Pages[1].Accept(absorber);
string pageText = absorber.Text;การสกัดชิ้นส่วนข้อความ
TextFragmentAbsorber ให้ผลลัพธ์ที่มีโครงสร้าง แต่ละ TextFragment รวมถึงข้อความที่สกัด, ตำแหน่งบนหน้า, และรายละเอียดฟอนต์.
using var doc = Document.Open(pdfBytes);
var absorber = new TextFragmentAbsorber();
doc.Pages[1].Accept(absorber);
foreach (var fragment in absorber.TextFragments)
{
Console.WriteLine($"Text: {fragment.Text}");
Console.WriteLine($"Position: ({fragment.Position.XIndent}, {fragment.Position.YIndent})");
Console.WriteLine($"Font: {fragment.TextState.Font.FontName}");
}การค้นหาด้วยนิพจน์ปกติ
ส่งรูปแบบ regex ไปยัง TextFragmentAbsorber เพื่อค้นหาข้อความเฉพาะ
var absorber = new TextFragmentAbsorber(@"\d{3}-\d{2}-\d{4}");
doc.Pages.Accept(absorber); // Search all pages
foreach (var fragment in absorber.TextFragments)
{
Console.WriteLine($"Found: {fragment.Text}");
}ส่วนข้อความ
แต่ละ TextFragment อาจมีหลายวัตถุ TextSegment เมื่อข้อความขยายครอบคลุมหลายรันของแบบอักษร.
foreach (var fragment in absorber.TextFragments)
{
foreach (var segment in fragment.Segments)
{
Console.WriteLine($"Segment: {segment.Text}, Font: {segment.TextState.Font.FontName}");
}
}การจัดการฟอนต์
FontRepository มีเมธอดสำหรับค้นหาและโหลดฟอนต์.
var font = FontRepository.FindFont("Helvetica");การสร้างย่อหน้าข้อความ
TextParagraph อนุญาตให้สร้างบล็อกข้อความหลายบรรทัดสำหรับแทรกลงในหน้า.
var paragraph = new TextParagraph();
paragraph.AppendLine(new TextFragment("First line"));
paragraph.AppendLine(new TextFragment("Second line"));เคล็ดลับและแนวทางปฏิบัติที่ดีที่สุด
- ใช้
TextFragmentAbsorberเมื่อคุณต้องการข้อมูลตำแหน่งและแบบอักษร; ใช้TextAbsorberสำหรับการสกัดข้อความแบบธรรมดา - ยอมรับตัวดูดบนหน้าเดียวเพื่อผลลัพธ์ที่เร็วขึ้น, หรือบน
doc.Pagesเพื่อค้นหาทั้งเอกสาร - การค้นหาแบบ regular expression มีความไวต่อขนาดตัวอักษรเป็นค่าเริ่มต้น — ใช้คำนำหน้า
(?i)สำหรับการจับคู่ที่ไม่สนใจขนาดตัวอักษร - ตรวจสอบ
TextState.Font.IsEmbeddedเพื่อกำหนดว่าแบบอักษรถูกฝังใน PDF หรือไม่ - สำหรับเอกสารขนาดใหญ่, ประมวลผลแต่ละหน้าแยกกัน เพื่อจัดการการใช้หน่วยความจำ
ปัญหาทั่วไป
| Issue | Cause | Fix |
|---|---|---|
| Extracted text is garbled | PDF uses a non-standard encoding or CID font mapping | Check font embedding; some scanned PDFs require OCR |
| No text fragments found | Page content is an image, not text | Use an OCR tool to convert image pages to text first |
| Regex returns no matches | Pattern does not account for whitespace inserted by PDF text layout | Normalize whitespace or use a looser pattern |
TextState.Font is null | Font resource is missing from the PDF | Handle null checks when inspecting font properties |
คำถามที่พบบ่อย
ฉันสามารถสกัดข้อความจากพื้นที่เฉพาะของหน้าได้หรือไม่?
ใช่. ตั้งค่า TextFragmentAbsorber.TextSearchOptions.Rectangle เพื่อจำกัดการค้นหาให้เฉพาะพื้นที่หนึ่งของหน้า.
การสกัดข้อความรักษาลำดับการอ่านหรือไม่?
ไลบรารีส่งคืนข้อความตามลำดับของ content-stream. สำหรับการจัดวางหลายคอลัมน์, คุณอาจต้องจัดเรียงส่วนย่อยตามตำแหน่ง.
ฉันสามารถสกัดข้อความจากทุกหน้าได้พร้อมกันหรือไม่?
ใช่. เรียก doc.Pages.Accept(absorber) เพื่อค้นหาทุกหน้าในเอกสาร.
สรุปการอ้างอิง API
| Class / Method | Description |
|---|---|
TextAbsorber | ดึงข้อความทั้งหมดเป็นสตริงเดียว |
TextFragmentAbsorber | ดึงส่วนข้อความที่มีโครงสร้างพร้อมข้อมูลตำแหน่งและแบบอักษร |
TextFragment | รันข้อความที่มีตำแหน่ง, สถานะข้อความ, และส่วนย่อย |
TextFragment.Text | สตริงข้อความที่ดึงออกมา |
TextFragment.Position | พิกัดบนหน้า |
TextFragment.TextState | ข้อมูลแบบอักษร, ขนาด, และสี |
TextFragment.Segments | รันย่อยภายในส่วนข้อความ |
TextParagraph | ตัวสร้างสำหรับบล็อกข้อความหลายบรรทัด |
TextState | ชื่อแบบอักษร, ขนาด, สี, และคุณสมบัติสไตล์ |
FontRepository | การค้นหาและโหลดแบบอักษรแบบสถิต |
FontRepository.FindFont | ค้นหาแบบอักษรตามชื่อ |