Извлечение текста по областям с помощью Java

Извлечение текста из прямоугольной области страницы

Используйте TextSearchOptions с Rectangle, чтобы ограничить извлечение определённой областью на странице.

  1. Откройте исходный PDF в экземпляре Document.
  2. Создайте TextAbsorber для сбора текста из выбранной области страницы.
  3. Создайте TextSearchOptions для нужной области Rectangle и вызовите setLimitToPageBounds(true), чтобы ограничить извлечение видимой областью страницы.
  4. Примените настроенные параметры поиска к поглотителю и обработайте нужную страницу Page.
  5. Запишите извлечённый буфер текста в выходной файл.
public static void extractTextFromRegion(Path inputFile, Path outputFile, int pageNumber, Rectangle rectangle)
        throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        TextAbsorber absorber = new TextAbsorber();
        TextSearchOptions options = new TextSearchOptions(rectangle);
        options.setLimitToPageBounds(true);
        absorber.setTextSearchOptions(options);
        document.getPages().get_Item(pageNumber).accept(absorber);
        Files.writeString(outputFile, absorber.getText());
    }
}

Извлечение абзацев с геометрической информацией

Используйте ParagraphAbsorber для проверки прямоугольников секций и многоугольников абзацев вместе с извлечённым текстом.

  1. Откройте исходный PDF в экземпляре Document.
  2. Создайте ParagraphAbsorber и обработайте нужную страницу Page для получения информации о её разметке.
  3. Прочитайте первый результат разметки страницы и пройдитесь по его секциям и абзацам.
  4. Соберите прямоугольники секций, многоугольники абзацев и текст абзацев, восстановленный из строк с объектами TextFragment.
  5. Создайте отчет вывода с геометрией и деталями извлечённого текста.
  6. Запишите извлечённые детали в выходной файл.
public static void extractParagraphsWithGeometry(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        ParagraphAbsorber absorber = new ParagraphAbsorber();
        absorber.visit(document.getPages().get_Item(1));

        PageMarkup pageMarkup = absorber.getPageMarkups().get(0);
        StringBuilder text = new StringBuilder();
        int sectionIndex = 1;
        for (MarkupSection section : pageMarkup.getSections()) {
            text.append("Section ").append(sectionIndex)
                    .append(": rectangle = ").append(section.getRectangle()).append("\n");
            int paragraphIndex = 1;
            for (MarkupParagraph paragraph : section.getParagraphs()) {
                text.append("  Paragraph ").append(paragraphIndex)
                        .append(": polygon = ").append(Arrays.toString(paragraph.getPoints())).append("\n");
                StringBuilder paragraphText = new StringBuilder();
                for (List<TextFragment> line : paragraph.getLines()) {
                    for (TextFragment fragment : line) {
                        paragraphText.append(fragment.getText());
                    }
                    paragraphText.append("\r\n");
                }
                text.append("    Text: ").append(paragraphText).append("\n\n");
                paragraphIndex++;
            }
            sectionIndex++;
        }

        Files.writeString(outputFile, text.toString());
    }
}