Инструмент PDF в текст или библиотека Java?

Мне нужно преобразовать PDF в обычный текст (это «протокол голосования» от нашего окружного регистратора). Файлы большие (около 2000 страниц) и в основном содержат таблицы. Как только я переведу его в текст, я воспользуюсь написанной мной программой, чтобы проанализировать его и поместить данные в базу данных. Я пробовал использовать функцию «Сохранить как текст» в Adobe Reader, но она не так точна, как хотелось бы, особенно при разделении данных таблицы в CSV. Итак, какие-нибудь рекомендации по инструментам или библиотекам Java, которые помогут?

Ответов (7)

Я всегда находил инструменты xpdf очень полезными.

Мы успешно используем преобразование PDF в текст для преобразования бизнес-документов PDF для использования в EDI. Опция сохранения макета хорошо работает, чтобы держать вещи в удобном месте для анализа в программе.

Учитывая заголовок вопроса: Apache Tika очень хорошо сработал для меня, чтобы извлечь простой текст из PDF. Однако я не использовал его для получения текста из таблиц.

Для PDF на самом деле используется PDFBox . Но помимо PDF, он делает то же самое для других форматов, таких как Microsoft Word (doc и docx), Excel и PowerPoint, OpenOffice.org/LibreOffice ODT, HTML, XML и многих других . Его AutoDetectParser упрощает получение текста из любого ввода.

А если нужно обработать получившийся текст (например, передать его Mahout для классификации), можно использовать ParsingReader, чтобы получить результат в Reader, пока фоновый процесс извлекает его. Наконец, при извлечении контента он также заполняет найденные метаданные:

public Reader getPlainTextReader(final InputStream is) {
    try {
        Detector detector = new DefaultDetector();
        Parser parser = new AutoDetectParser(detector);
        ParseContext context = new ParseContext();
        context.set(Parser.class, parser);
        Metadata metadata = new Metadata();

        Reader reader = new ParsingReader(parser, is, metadata, context);

        for (String name : metadata.names()) {
            for (String value : metadata.getValues(name)) {
                logger.debug("Document {}: {}", name, value);
            }
        }

        return reader;

    } catch (IOException e) {
        ...
    }
}

Два варианта:

  1. iText - кажется, класс PdfTextExtractor может делать то, что вы хотите.

  2. Apache PDFBox утверждает, что «извлечение PDF в текст» является его главной особенностью. Специально для этого ( исходного кода )есть инструмент командной строки ExtractText , основанный на его классе PDFTextStripper . И еще есть руководство по извлечению текста из PDFBox!

Используйте текстовый (строчный) принтер для печати в файл.

Я использую iText и очень доволен им. Я использовал xmlpdf раньше, и, на мой взгляд, iText намного превосходит его.

Трудно сказать, не зная макета страниц в вашем PDF-документе.

Я бы посоветовал загрузить и попробовать как iText, так и PDBox. Вы найдете примеры извлечения текста для обоих на их веб-сайтах - у вас должен быть экстрактор, работающий менее 30 минут, если вы разбираетесь в Java.

Начните с PDFBox, поскольку его возможности извлечения текста лучше, чем у iText.

Кто-то еще упомянул xpdf, и это может быть полезно для вас. Это библиотека C с некоторыми инструментами командной строки, построенными вокруг нее. Он имеет ряд средств извлечения текста, и вы можете достаточно легко отформатировать вывод. Опять же, это действительно зависит от макета вашей страницы.

PDFTextStream - это наша библиотека Java + .NET для извлечения содержимого из документов PDF; вы могли бы дать ему шанс. Кроме того, он предоставляет некоторые элементарные утилиты для извлечения данных из таблиц , которые дополняют возможности PDFTextStream по обнаружению таблиц. Это ни в коем случае не общее решение (хотя мы тоже работаем над одним из них!), Но если табличные данные четко определены (например, строки и столбцы, ограниченные линиями и т. Д.), Вы можете найти то, что сейчас есть правильное решение.