Улучшение извлечения текста из многоколоночных PDF

Многоколоночные макеты часто требуют дополнительной обработки для улучшения порядка чтения и качества извлечения.

Извлечение текста после уменьшения размера шрифта

Эта методика обновляет размеры шрифтов фрагментов текста, сохраняет скорректированный документ в память, а затем извлекает текст из преобразованного результата.

  1. Откройте исходный PDF в экземпляре Document.
  2. Создайте TextFragmentAbsorber и посетите все страницы документа, чтобы собрать объекты TextFragment.
  3. Переберите фрагменты и уменьшите размер шрифта каждого с заданным коэффициентом, чтобы нормализовать плотный многоколоночный макет перед извлечением.
  4. Сохраните скорректированный Document в поток байтов в памяти.
  5. Откройте второй Document из этого буфера памяти.
  6. Создайте 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 в режиме чистого форматирования и настройте коэффициент масштабирования для макетов с большим количеством столбцов.

  1. Откройте исходный PDF в экземпляре Document.
  2. Создайте TextAbsorber для извлечения текста из всего документа.
  3. Создайте TextExtractionOptions в режиме чистого форматирования, чтобы использовалось извлечение с учётом макета.
  4. Установите коэффициент масштабирования и примените параметры извлечения к абсорберу перед обходом страниц.
  5. Обойдите все страницы документа и запишите извлечённый текст в выходной файл.
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());
    }
}