Проверяйте, повреждены ли файлы PDF, используя командную строку в Linux.

Вопрос или проблема

У меня есть много PDF-файлов в одной папке.

Можно ли проверить, повреждены ли один или несколько файлов (ноль страниц или незавершенные загрузки) с помощью командной строки, не открывая их по одному?

Вы можете попробовать сделать это с помощью pdfinfo (здесь на Fedora в пакете poppler-utils). pdfinfo получает информацию о PDF-файле из его словаря, так что, если он находит его, файл должен быть в порядке.

for f in *.pdf; do
    if ! pdfinfo "$f" &> /dev/null; then
        echo "$f" is broken
    fi
done

Мой инструмент для проверки PDF-файлов – это qpdf. qpdf имеет аргумент --check, который хорошо находит проблемы в PDF-файлах.

Проверить один PDF с помощью qpdf:

qpdf --check test_file.pdf

Проверить все PDF в каталоге с помощью qpdf:

find ./directory_to_scan/ -type f -iname '*.pdf' \( -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; -o -exec echo "{}": FAILED \; \)

Объяснение команды:

  • find ./directory_to_scan/ -type f -iname '*.pdf'
    Найти все файлы с расширением ‘.pdf’

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \;
    Выполнить qpdf для каждого найденного файла и направить весь вывод в /dev/null. Также напечатать имя файла, за которым следует ‘: OK’, если код возврата qpdf равен 0 (т.е. ошибок нет)

  • -o -exec echo "{}": FAILED \; \) Это выполняется, если ошибки найдены: напечатать имя файла, за которым следует “: FAILED”


Где взять qpdf:

qpdf имеет бинарные версии для Linux и Windows, доступные по адресу: https://github.com/qpdf/qpdf/releases. Вы также можете использовать предпочтительный менеджер пакетов, чтобы получить его. Например, на Ubuntu можно установить qpdf с помощью apt командой:

apt install qpdf
find . -iname '*.pdf' | while read -r f
  do
    if pdftotext "$f" - &> /dev/null; then 
        echo "$f" was ok;   
    else
        mv "$f" "$f.broken";
        echo "$f" is broken;   
    fi; 
done

Все методы, использующие pdfinfo или pdftotext, не сработали для меня. На самом деле они продолжали давать ложные срабатывания и иногда создавали файлы, которые мне не нужны.

Что сработало, так это JHOVE.

Установка:

Установите jar с указанной выше ссылки и обновите переменную окружения PATH с помощью этой команды:

echo "export PATH=\$PATH:/REPLACE_WITH/YOUR/PATH_TO/jhove/" >> ~/.bash_profile

Обновите каждый терминал с помощью
source ~/.bash_profile и вы готовы использовать его по всей системе.

Основное использование:

jhove -m pdf-hul someFile.pdf

Вы получите много информации о PDF – больше, чем, вероятно, нужно большинству людей.

Базовая команда Bash:
Просто возвращает valid или invalid:

if [[ $(jhove -m pdf-hul someFile.pdf | grep -a "Status:") == *"Well-Formed and valid"* ]]; then echo "valid"; else echo "invalid"; fi;

Обратите внимание, что это было выполнено на Mac OS X, но я предполагаю, что это работает одинаково в любой среде Bash на базе Unix.

Я нашел себе ответ:

for x in *.pdf; do echo "$x"; pdfinfo "$x" | grep Pages; done

PDF-файлы с ошибками покажут ошибки.

Существует несколько способов сделать это. Это зависит от того, что именно вы хотите проверить.

Разные команды ведут себя по-разному, и некоторые выходят со статусом 0 – даже если были некоторые ошибки.

Также это зависит от того, считаете ли вы предостережение (возможно, тоже со статусом выхода 0) показателем поврежденного файла. И, наконец, даже если есть некоторые ошибки/предостережения, это зависит от того, о чем именно идет речь (возможно, поврежденное вложенное изображение не является большой проблемой для вас, и вы считаете такой PDF-файл действительным). Есть много решений, которые нужно принять, и попытка использования различных инструментов может быть полезной.

У меня есть база данных из 5031 PDF-файлов, и я протестировал их с помощью следующих команд:

  1. pdfinfo file.pdf (~3 мин)
  2. pdftotext -layout file.pdf - (~29 мин)
  3. qpdf --check file.pdf (~222 мин)

на наличие любого вывода в stderr и сохранил этот вывод в таблице: https://docs.google.com/spreadsheets/d/1UA9HOKW9rYnUOQ5JAnFUwZ7N6YftSotzhe46zBgiEJY/edit?usp=sharing

Я отфильтровал строки по наличию вывода в stderr от любой команды для файла. Каждая ячейка содержит полный вывод stderr – дважды нажмите на нее, чтобы увидеть содержимое.

pdfimages -list file.pdf – выдает точно такие же ошибки, как pdftottext

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

for file in *
do 
    if stderr=$((\
        pdfinfo $file && \
        pdftotext -layout $file - && \
        qpdf --check $file) 2>&1 >/dev/null) && test -z "$stderr"
    then
        echo 'file is ok'
    else
        echo 'file is NOT OK'
    fi
done

Этот скрипт проверяет как статус выхода команд проверки, так и ЛЮБОЙ непустой вывод в stderr.

Он не выводит стандартный вывод из команд проверки.

В дополнение к упомянутым выше инструментам, библиотека/инструмент pdfcpu также имеет функцию проверки PDF:

pdfcpu validate whatever.pdf

Обратите внимание, что на момент написания (август 2020 года) pdfcpu все еще находится на стадии разработки (Alpha).

По состоянию на 2025 год также существует Arlington PDF Model Checker, который проверяет PDF на соответствие Arlington PDF Model. Arlington Model — это машинно-читаемое представление всех типов объектов, определенных ISO 32000-2:2020 (PDF 2.0) и всеми более ранними версиями PDF. Java-инсталляторы можно скачать из раздела релизов VeraPDF.

После установки запустите программное обеспечение следующим образом:

arlington-pdf-model-checker whatever.pdf > whatever.xml

По умолчанию проверщик Arlington PDF Model пытается автоматически установить версию PDF и проверить файл соответственно. Используйте опцию -f (алиас: --flavour), чтобы указать конкретную версию. Например, следующая команда приведет к проверке в соответствии с PDF 1.4:

arlington-pdf-model-checker -f arlington1.4 whatever.pdf > whatever.xml

Заметьте, что модель Arlington определяет “грамматику” объектов/словарей PDF, и в результате Проверщик Arlington PDF Model способен обнаруживать даже малейшие отклонения от спецификации. Однако это не охватывает все аспекты проверки PDF, смотрите раздел “Ограничения” в README The Arlington PDF Model.

Простыми словами, pdf — это особенно структурированная форма PostScript. qpdf вероятно, является хорошим инструментом для проверки структуры файла, но PostScript — это язык программирования. Проверка синтаксиса части PostScript — хорошая идея, но этого недостаточно. Во время выполнения обрабатываются многие управляющие структуры, вызываются функции и не всегда переданные значения являются действительными. Только во время выполнения вы увидите, все ли работает хорошо и является ли результат нужным. Кроме того, не все шрифты всегда включены в файл pdf. Отсутствие шрифтов, которые недоступны во время выполнения, может вызвать множество проблем. Утилита pdffonts может помочь вам проанализировать такие проблемы, которые могут возникнуть здесь.

.

Ответ или решение

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

Использование pdfinfo из набора poppler-utils

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

for file in *.pdf; do
    if ! pdfinfo "$file" &> /dev/null; then
        echo "$file" is broken
    fi
done

Применение qpdf для более детальной проверки

Утилита qpdf, обладая специальным параметром --check, предоставляет более углубленную проверку структуры PDF файлов. Ее можно установить через пакетный менеджер, например, на Ubuntu:

apt install qpdf

Команда для проверки всех PDF файлов в директории может быть следующей:

find ./directory_to_scan/ -type f -iname '*.pdf' \( -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; -o -exec echo "{}": FAILED \; \)

Использование JHOVE для всестороннего анализа

JHOVE является мощным инструментом для анализа PDF файлов, предоставляя детализированную информацию о структуре и состоянии файлов. После установки, JHOVE может быть использован для проверки таким образом:

jhove -m pdf-hul someFile.pdf

Альтернативные методы

Другие инструменты, такие как pdftotext и pdfcpu, могут также использоваться для проверки целостности PDF. Каждое из этих решений имеет свои сильные стороны, и выбор наиболее подходящего зависит от конкретных требований и условий применения.

Например, использование pdfcpu заключается в команде для валидации:

pdfcpu validate whatever.pdf

Проверка PDF файлов может быть сложной задачей, учитывая потенциальные сложности, связанные с отсутствующими шрифтами или некорректными структурами данных, поскольку PDF файлы представляют собой формализованную структуру PostScript.

Заключение

Выбор метода проверки PDF файлов зависит от уровня необходимой глубины анализа и специфики потенциальных проблем. Независимо от выбранного инструмента, решение должно быть направлено на идентификацию проблемы без необходимости открытия каждого файла вручную, что облегчает обработку больших объемов данных.

Оцените материал
Добавить комментарий

Капча загружается...