Базовое извлечение текста с использованием Java
Базовое извлечение текста — отправная точка для чтения содержимого PDF в Java. Aspose.PDF предоставляет два распространённых подхода:
- Используйте
TextAbsorber, когда вам нужен результат в виде обычного текста из документа или страницы. - Используйте
ParagraphAbsorber, когда вам нужно сохранить группировку страниц, разделов, абзацев, строк и фрагментов.
Страницы PDF не хранят текст так, как документы текстовых процессоров, поэтому порядок извлечения зависит от потока содержимого страницы и её макета. Для извлечения текста из определённых областей, анализа геометрии, обработки многоколоночных макетов, аннотаций, выделенного текста или обнаружения надстрочного и подстрочного текста используйте соответствующие статьи об извлечении в этом разделе.
Извлечение текста со всех страниц
Используйте TextAbsorber, чтобы собрать единый поток текста из всего документа и записать его в файл. Это самый простой вариант, когда вам нужен только читаемый текстовый контент и не нужны границы абзацев или координаты.
- Откройте исходный PDF в экземпляре Document.
- Создайте TextAbsorber для накопления текста по всему документу.
- Вызовите
document.getPages().accept(textAbsorber), чтобы обработать каждую страницу Page поглотителем. - Запишите извлеченный буфер текста в выходной файл.
public static void extractTextFromAllPages(Path inputFile, Path outputFile) throws Exception {
try (Document document = new Document(inputFile.toString())) {
TextAbsorber textAbsorber = new TextAbsorber();
document.getPages().accept(textAbsorber);
Files.writeString(outputFile, textAbsorber.getText());
}
}
Извлечение текста с конкретной страницы
Примените поглотитель только к нужной странице. Страницы в коллекции страниц Document нумеруются с 1, поэтому get_Item(1) читает первую страницу.
- Откройте исходный PDF в экземпляре Document.
- Создайте TextAbsorber для извлечения текста с одной страницы.
- Вызовите
accept(textAbsorber)для страницы Страница, выбранной по номеру. - Запишите извлеченный буфер текста в выходной файл.
public static void extractTextFromPage(Path inputFile, Path outputFile, int pageNumber) throws Exception {
try (Document document = new Document(inputFile.toString())) {
TextAbsorber textAbsorber = new TextAbsorber();
document.getPages().get_Item(pageNumber).accept(textAbsorber);
Files.writeString(outputFile, textAbsorber.getText());
}
}
Извлечение текста по структуре абзацев
Используйте ParagraphAbsorber, когда вам нужна структурная группировка вместо одного простого текстового потока. Он возвращает разметку страниц с разделами, абзацами, строками и объектами TextFragment, что полезно, когда вывод должен сохранять логические блоки текста.
- Откройте исходный PDF в экземпляре Document.
- Создайте ParagraphAbsorber и просмотрите весь документ, чтобы построить результаты разметки страниц.
- Переберите разметки страниц, разделы, абзацы, строки и объекты TextFragment, предоставляемые поглотителем.
- Создайте выходной текст с явным нумерованием страниц, разделов и абзацев, чтобы сохранялась структурная группировка.
- Запишите извлечённый текст абзаца в выходной файл.
public static void extractParagraphsFromPdf(Path inputFile, Path outputFile) throws Exception {
try (Document document = new Document(inputFile.toString())) {
ParagraphAbsorber absorber = new ParagraphAbsorber();
absorber.visit(document);
StringBuilder text = new StringBuilder();
for (PageMarkup pageMarkup : absorber.getPageMarkups()) {
int sectionIndex = 1;
for (MarkupSection section : pageMarkup.getSections()) {
int paragraphIndex = 1;
for (MarkupParagraph paragraph : section.getParagraphs()) {
StringBuilder paragraphText = new StringBuilder();
for (List<TextFragment> line : paragraph.getLines()) {
for (TextFragment fragment : line) {
paragraphText.append(fragment.getText());
}
paragraphText.append("\r\n");
}
text.append("Page ").append(pageMarkup.getNumber())
.append(", Section ").append(sectionIndex)
.append(", Paragraph ").append(paragraphIndex)
.append(":\n");
text.append(paragraphText).append("\n");
paragraphIndex++;
}
sectionIndex++;
}
}
Files.writeString(outputFile, text.toString());
}
}