تحسين استخراج النص من ملفات PDF متعددة الأعمدة
Contents
[
Hide
]
غالبًا ما تتطلب التخطيطات متعددة الأعمدة معالجة إضافية لتحسين ترتيب القراءة وجودة الاستخراج.
استخراج النص بعد تقليل حجم الخط
تقوم هذه التقنية بتحديث أحجام خطوط Font لـ TextFragment، تحفظ المستند المعدل في الذاكرة، ثم تستخرج النص من النتيجة المحوَّلة.
- افتح ملف PDF المصدر في Document مثال.
- أنشئ كائنًا من الفئة TextFragmentAbsorber وزر جميع صفحات المستند لجمع الكائنات TextFragment.
- مرّ على المقاطع وتقليل حجم الخط لكل منها بنسبة النسبة المطلوبة بحيث يمكن تطبيع تخطيط الأعمدة الكثيفة قبل الاستخراج.
- احفظ المعدل Document إلى تدفق بايتات في الذاكرة.
- أعد فتح ثانية Document من تلك الذاكرة المؤقتة.
- أنشئ كائنًا من الفئة TextAbsorber، زُر جميع صفحات المستند المحول، واكتب النص المستخرج إلى ملف الإخراج.
public static void extractTextReduceFont(Path inputFile, Path outputFile, double reduceRatio) throws Exception {
try (Document document = new Document(inputFile.toString())) {
TextFragmentAbsorber fragmentAbsorber = new TextFragmentAbsorber();
document.getPages().accept(fragmentAbsorber);
for (TextFragment fragment : fragmentAbsorber.getTextFragments()) {
fragment.getTextState().setFontSize((float) (fragment.getTextState().getFontSize() * reduceRatio));
}
ByteArrayOutputStream stream = new ByteArrayOutputStream();
document.save(stream);
try (Document document2 = new Document(new ByteArrayInputStream(stream.toByteArray()))) {
TextAbsorber textAbsorber = new TextAbsorber();
document2.getPages().accept(textAbsorber);
Files.writeString(outputFile, textAbsorber.getText());
}
}
}
استخراج النص مع عامل مقياس
استخدم TextExtractionOptions في وضع التنسيق النقي وضبط عامل المقياس لتصاميم ذات أعمدة كثيفة.
- افتح ملف PDF المصدر في Document مثال.
- أنشئ كائنًا من الفئة TextAbsorber للاستخراج الكامل للمستند.
- أنشئ كائنًا من الفئة TextExtractionOptions في وضع التنسيق النقي بحيث يتم استخدام سلوك الاستخراج الحساس للتنسيق.
- عيّن عامل المقياس وتطبيق خيارات الاستخراج على absorber قبل زيارة الصفحات.
- زُر جميع صفحات المستند واكتب النص المستخرج إلى ملف الإخراج.
public static void extractTextScaleFactor(Path inputFile, Path outputFile, double scaleFactor) throws Exception {
try (Document document = new Document(inputFile.toString())) {
TextAbsorber textAbsorber = new TextAbsorber();
TextExtractionOptions extractionOptions =
new TextExtractionOptions(TextExtractionOptions.TextFormattingMode.Pure);
extractionOptions.setScaleFactor(scaleFactor);
textAbsorber.setExtractionOptions(extractionOptions);
document.getPages().accept(textAbsorber);
Files.writeString(outputFile, textAbsorber.getText());
}
}