Поиск и извлечение текста PDF в Java

Aspose.PDF for Java поддерживает извлечение необработанного текста и поиск на уровне фрагментов с координатами, стилями и сопоставлением по регулярным выражениям.

Извлечение текста со всех страниц с использованием TextAbsorber

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

  1. Откройте исходный документ PDF.
  2. Создайте TextExtractionOptions и TextSearchOptions с настройками области поиска.
  3. Запустите TextAbsorber на всех страницах и выведите извлечённый текст.
public static void textAbsorberSearch(Path inputFile) {
        try (Document document = new Document(inputFile.toString())) {
            TextExtractionOptions textExtractionOptions = new TextExtractionOptions(TextExtractionOptions.TextFormattingMode.Pure);
            TextSearchOptions textSearchOptions = new TextSearchOptions(new Rectangle(0, 0, 842, 250, true));
            TextAbsorber absorber = new TextAbsorber(textExtractionOptions, textSearchOptions);

            document.getPages().accept(absorber);
            System.out.println("Text fragments found: " + absorber.getText());
        }
    }

Извлечение текста с одной страницы с помощью TextAbsorber

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

  1. Откройте исходный документ PDF.
  2. Настройте извлечение текста и параметры поиска для целевой области.
  3. Запустите TextAbsorber на выбранной странице и выведите результат.
public static void textAbsorberSearchPage(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        TextExtractionOptions textExtractionOptions = new TextExtractionOptions(TextExtractionOptions.TextFormattingMode.Pure);
        TextSearchOptions textSearchOptions = new TextSearchOptions(new Rectangle(0, 0, 842, 250, true));
        TextAbsorber absorber = new TextAbsorber(textExtractionOptions, textSearchOptions);

        document.getPages().get_Item(2).accept(absorber);
        System.out.println("Text fragments found: " + absorber.getText());
    }
}

Проверка всех текстовых фрагментов в документе

Используйте этот пример, когда вам нужен текстовый контент вместе с метаданными шрифта, позиции и цвета.

  1. Откройте исходный документ PDF.
  2. Запустите TextFragmentAbsorber по всем страницам.
  3. Пройдите по фрагментам и выведите их метаданные.
public static void textFragmentAbsorberSearch(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        TextFragmentAbsorber absorber = new TextFragmentAbsorber();
        document.getPages().accept(absorber);

        for (TextFragment fragment : absorber.getTextFragments()) {
            System.out.println("Text: " + fragment.getText());
            System.out.println("Position: " + fragment.getPosition());
            System.out.println("XIndent: " + fragment.getPosition().getXIndent());
            System.out.println("YIndent: " + fragment.getPosition().getYIndent());
            System.out.println("Font - Name: " + fragment.getTextState().getFont().getFontName());
            System.out.println("Font - IsAccessible: " + fragment.getTextState().getFont().isAccessible());
            System.out.println("Font - IsEmbedded: " + fragment.getTextState().getFont().isEmbedded());
            System.out.println("Font - IsSubset: " + fragment.getTextState().getFont().isSubset());
            System.out.println("Font Size: " + fragment.getTextState().getFontSize());
            System.out.println("Foreground Color: " + fragment.getTextState().getForegroundColor());
        }
    }
}

Поиск одной фразы на определённой странице

Используйте этот пример, когда целевое слово должно быть найдено только на выбранной странице.

  1. Откройте исходный документ PDF.
  2. Создайте TextFragmentAbsorber с целевой фразой.
  3. Посетите выбранную страницу и выведите позиции совпадающих фрагментов.
public static void textFragmentAbsorberSearchPage(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        TextFragmentAbsorber absorber = new TextFragmentAbsorber("whale");
        document.getPages().get_Item(2).accept(absorber);

        for (TextFragment fragment : absorber.getTextFragments()) {
            System.out.println("Text: " + fragment.getText());
            System.out.println("Position: " + fragment.getPosition());
        }
    }
}

Продолжение последовательного поиска по страницам

Используйте этот пример, когда хотите переиспользовать один поглотитель при переходе от поиска на одной странице к следующей.

  1. Откройте исходный PDF‑документ и создайте повторно используемый абсорбер.
  2. Выполните поиск на первой странице и проверьте результаты.
  3. Продолжите поиск на следующих страницах и просмотрите обновлённые совпадения.
public static void textFragmentAbsorberSequentialSearch(Path inputFile) {
    Document document = new Document(inputFile.toString());
    TextFragmentAbsorber absorber = new TextFragmentAbsorber();
    absorber.setPhrase("whale");

    document.getPages().get_Item(1).accept(absorber);
    for (TextFragment fragment : absorber.getTextFragments()) {
        System.out.println("Text: " + fragment.getText());
        System.out.println("Page: " + fragment.getPage().getNumber());
        System.out.println("Position: " + fragment.getPosition());
    }

    System.out.println("--");

    document.getPages().get_Item(2).accept(absorber);
    absorber.visit(document);

    for (TextFragment fragment : absorber.getTextFragments()) {
        System.out.println("Text: " + fragment.getText());
        System.out.println("Page: " + fragment.getPage().getNumber());
        System.out.println("Position: " + fragment.getPosition());
    }
}

Поиск фразы внутри выбранного прямоугольника

Используйте этот пример, когда сопоставление фраз должно быть ограничено областью на одной странице.

  1. Откройте исходный документ PDF.
  2. Создайте TextFragmentAbsorber с целевой фразой и TextSearchOptions с прямоугольной областью поиска.
  3. Посетите страницу и выведите позиции совпавших фрагментов.
public static void textFragmentAbsorberSearchPhrase(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        TextFragmentAbsorber absorber = new TextFragmentAbsorber(
                "elephant", new TextSearchOptions(new Rectangle(0, 0, 842, 250, true)));

        document.getPages().get_Item(2).accept(absorber);

        for (TextFragment fragment : absorber.getTextFragments()) {
            System.out.println("Text: " + fragment.getText());
            System.out.println("Position: " + fragment.getPosition());
        }
    }
}

Поиск текста по регулярному выражению

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

  1. Откройте исходный документ PDF.
  2. Создайте TextFragmentAbsorber с поддержкой регулярных выражений.
  3. Посетите целевую страницу и выведите соответствующие фрагменты.
public static void textFragmentAbsorberSearchRegex(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        TextFragmentAbsorber absorber = new TextFragmentAbsorber(
                Pattern.compile("\\d+\\.\\d+"), new TextSearchOptions(true));

        document.getPages().get_Item(2).accept(absorber);

        for (TextFragment fragment : absorber.getTextFragments()) {
            System.out.println("Text: " + fragment.getText());
            System.out.println("Position: " + fragment.getPosition());
        }
    }
}

Поиск списка фраз по шаблонам регулярных выражений

Используйте этот пример, когда несколько целевых фраз следует найти за один проход.

  1. Откройте исходный документ PDF.
  2. Создайте массив шаблонов регулярных выражений и передайте его в TextFragmentAbsorber.
  3. Посетите документ и проверьте сгруппированные результаты поиска по регулярным выражениям.
public static void textFragmentAbsorberSearchListOfPhrases(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        Pattern[] patterns = new Pattern[] {
                Pattern.compile("whale"),
                Pattern.compile("elephant")
        };
        TextFragmentAbsorber absorber = new TextFragmentAbsorber(patterns, new TextSearchOptions(true));
        document.getPages().accept(absorber);

        for (TextFragmentCollection fragments : absorber.getRegexResults().values()) {
            for (TextFragment fragment : fragments) {
                System.out.println("Text: " + fragment.getText());
                System.out.println("Position: " + fragment.getPosition());
            }
        }
    }
}

Поиск текста и его преобразование в гиперссылки

Используйте этот пример, когда совпадающие слова должны быть выделены и преобразованы в кликабельные ссылки.

  1. Откройте исходный документ PDF.
  2. Ищите целевые слова с включённым поиском по регулярным выражениям.
  3. Обновите стиль текста, добавьте гиперссылки и сохраните изменённый PDF.
public static void textFragmentAbsorberSearchAndAddHyperlink(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        TextFragmentAbsorber absorber = new TextFragmentAbsorber("whale|elephant");
        absorber.setTextSearchOptions(new TextSearchOptions(true));
        absorber.visit(document.getPages().get_Item(1));

        for (TextFragment fragment : absorber.getTextFragments()) {
            fragment.getTextState().setForegroundColor(Color.getBlue());
            fragment.getTextState().setUnderline(true);
            fragment.setHyperlink(new WebHyperlink("https://en.wikipedia.org/wiki/" + fragment.getText()));
        }

        document.save(inputFile.toString().replace("in.pdf", "out.pdf"));
    }
}

Поиск текста по характеристикам стиля

Используйте этот пример, когда нужно проверять фрагменты на основе форматирования, например жирного или скрытого текста.

  1. Откройте исходный документ PDF.
  2. Запустите TextFragmentAbsorber на целевой странице.
  3. Проверьте стиль каждого фрагмента и выведите соответствующие записи.
public static void textFragmentAbsorberSearchStyledText(Path inputFile) {
    try (Document document = new Document(inputFile.toString())) {
        TextFragmentAbsorber absorber = new TextFragmentAbsorber();
        absorber.setTextSearchOptions(new TextSearchOptions(true));
        absorber.visit(document.getPages().get_Item(1));

        for (TextFragment fragment : absorber.getTextFragments()) {
            if (fragment.getTextState().getFontStyle() == FontStyles.Bold) {
                System.out.println("Bold: " + fragment.getText());
            }
            if (fragment.getTextState().isInvisible()) {
                System.out.println("Invisible: " + fragment.getText());
            }
        }
    }
}

Подсветка результатов поиска в отрисованных превью страниц

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

  1. Создайте PNG-устройство с требуемым разрешением.
  2. Выполните поиск на каждой странице с помощью TextFragmentAbsorber и отобразите страницу в поток изображения.
  3. Запишите изображения предварительного просмотра страниц и выведите координаты фрагментов для проверки.
public static void textFragmentAbsorberSearchAndHighlight(Path inputFile) throws Exception {
    int resolution = 150;
    PngDevice pngDevice = new PngDevice(new Resolution(resolution, resolution));

    try (Document document = new Document(inputFile.toString())) {
        TextFragmentAbsorber absorber = new TextFragmentAbsorber(Pattern.compile("[\\S]+"));
        absorber.setTextSearchOptions(new TextSearchOptions(true));

        for (int pageNumber = 1; pageNumber <= document.getPages().size(); pageNumber++) {
            Page page = document.getPages().get_Item(pageNumber);
            page.accept(absorber);

            try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) {
                pngDevice.process(page, stream);
                Path output = Path.of(inputFile.toString().replace("_in.pdf", page.getNumber() + "_out.png"));
                Files.write(output, stream.toByteArray());
            }

            for (TextFragment textFragment : absorber.getTextFragments()) {
                Rectangle pageRect = page.getPageRect(true);
                System.out.println("TextFragment = " + textFragment.getText()
                        + " Page URY = " + pageRect.getURY()
                        + " TextFragment URY = " + textFragment.getRectangle().getURY());
            }
        }
    }
}