Улучшение извлечения текста из многоколоночных PDF
Contents
[
Hide
]
Многоколоночные макеты часто требуют дополнительной обработки для улучшения порядка чтения и качества извлечения.
Извлечение текста после уменьшения размера шрифта
Эта методика обновляет размеры шрифтов фрагментов текста, сохраняет скорректированный документ в память, а затем извлекает текст из преобразованного результата.
- Откройте исходный 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 в режиме чистого форматирования, чтобы использовалось извлечение с учётом макета.
- Установите коэффициент масштабирования и примените параметры извлечения к абсорберу перед обходом страниц.
- Обойдите все страницы документа и запишите извлечённый текст в выходной файл.
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());
}
}