Поиск и извлечение текста PDF в Java
Aspose.PDF for Java поддерживает извлечение необработанного текста и поиск на уровне фрагментов с координатами, стилями и сопоставлением по регулярным выражениям.
Извлечение текста со всех страниц с использованием TextAbsorber
Используйте этот пример, когда вам нужен простой извлечённый текст из выбранного участка документа на всех страницах.
- Откройте исходный документ PDF.
- Создайте
TextExtractionOptionsиTextSearchOptionsс настройками области поиска. - Запустите
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
Используйте этот пример, когда извлечение обычного текста должно быть ограничено одной страницей.
- Откройте исходный документ PDF.
- Настройте извлечение текста и параметры поиска для целевой области.
- Запустите
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());
}
}
Проверка всех текстовых фрагментов в документе
Используйте этот пример, когда вам нужен текстовый контент вместе с метаданными шрифта, позиции и цвета.
- Откройте исходный документ PDF.
- Запустите
TextFragmentAbsorberпо всем страницам. - Пройдите по фрагментам и выведите их метаданные.
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());
}
}
}
Поиск одной фразы на определённой странице
Используйте этот пример, когда целевое слово должно быть найдено только на выбранной странице.
- Откройте исходный документ PDF.
- Создайте
TextFragmentAbsorberс целевой фразой. - Посетите выбранную страницу и выведите позиции совпадающих фрагментов.
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());
}
}
}
Продолжение последовательного поиска по страницам
Используйте этот пример, когда хотите переиспользовать один поглотитель при переходе от поиска на одной странице к следующей.
- Откройте исходный PDF‑документ и создайте повторно используемый абсорбер.
- Выполните поиск на первой странице и проверьте результаты.
- Продолжите поиск на следующих страницах и просмотрите обновлённые совпадения.
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());
}
}
Поиск фразы внутри выбранного прямоугольника
Используйте этот пример, когда сопоставление фраз должно быть ограничено областью на одной странице.
- Откройте исходный документ PDF.
- Создайте
TextFragmentAbsorberс целевой фразой иTextSearchOptionsс прямоугольной областью поиска. - Посетите страницу и выведите позиции совпавших фрагментов.
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());
}
}
}
Поиск текста по регулярному выражению
Используйте этот пример, когда совпадения должны находиться по шаблону регулярного выражения, а не по фиксированной фразе.
- Откройте исходный документ PDF.
- Создайте
TextFragmentAbsorberс поддержкой регулярных выражений. - Посетите целевую страницу и выведите соответствующие фрагменты.
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());
}
}
}
Поиск списка фраз по шаблонам регулярных выражений
Используйте этот пример, когда несколько целевых фраз следует найти за один проход.
- Откройте исходный документ PDF.
- Создайте массив шаблонов регулярных выражений и передайте его в
TextFragmentAbsorber. - Посетите документ и проверьте сгруппированные результаты поиска по регулярным выражениям.
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());
}
}
}
}
Поиск текста и его преобразование в гиперссылки
Используйте этот пример, когда совпадающие слова должны быть выделены и преобразованы в кликабельные ссылки.
- Откройте исходный документ PDF.
- Ищите целевые слова с включённым поиском по регулярным выражениям.
- Обновите стиль текста, добавьте гиперссылки и сохраните изменённый 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"));
}
}
Поиск текста по характеристикам стиля
Используйте этот пример, когда нужно проверять фрагменты на основе форматирования, например жирного или скрытого текста.
- Откройте исходный документ PDF.
- Запустите
TextFragmentAbsorberна целевой странице. - Проверьте стиль каждого фрагмента и выведите соответствующие записи.
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());
}
}
}
}
Подсветка результатов поиска в отрисованных превью страниц
Используйте этот пример, когда совпадения текста следует сопоставлять с визуализированными изображениями страниц для визуального осмотра.
- Создайте PNG-устройство с требуемым разрешением.
- Выполните поиск на каждой странице с помощью
TextFragmentAbsorberи отобразите страницу в поток изображения. - Запишите изображения предварительного просмотра страниц и выведите координаты фрагментов для проверки.
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());
}
}
}
}