Базовое извлечение текста с использованием Java

Базовое извлечение текста — отправная точка для чтения содержимого PDF в Java. Aspose.PDF предоставляет два распространённых подхода:

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

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

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

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

  1. Откройте исходный PDF в экземпляре Document.
  2. Создайте TextAbsorber для накопления текста по всему документу.
  3. Вызовите document.getPages().accept(textAbsorber), чтобы обработать каждую страницу Page поглотителем.
  4. Запишите извлеченный буфер текста в выходной файл.
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) читает первую страницу.

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

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