Вопрос или проблема
У меня есть много 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-файлов, и я протестировал их с помощью следующих команд:
pdfinfo file.pdf
(~3 мин)pdftotext -layout file.pdf -
(~29 мин)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 файлов зависит от уровня необходимой глубины анализа и специфики потенциальных проблем. Независимо от выбранного инструмента, решение должно быть направлено на идентификацию проблемы без необходимости открытия каждого файла вручную, что облегчает обработку больших объемов данных.