У меня есть много файлов PDF в одной папке.
Можно ли проверить, не поврежден ли один или несколько файлов (нулевые страницы или незавершенные загрузки) с помощью командной строки, не открывая их по одному?
Возможно, запуск pdfinfo
(здесь, в Fedora в poppler-utils
) дает подсказку?
Большая часть информации о файле PDF находится в конце словаря, поэтому, если он его найдет, все будет в порядке. Я бы сделал что-то вроде:
for f in *.pdf; do
if pdfinfo "$f" > /dev/null; then
: Nothing
else
echo "$f" is broken
fi
done
Это мой сценарий
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
Я получил ответ:
for x in *.pdf; do echo "$x"; pdfinfo "$x" | grep Pages; done
PDF с ошибками покажет ошибки.
Мой инструмент выбора для проверки PDF-файлов - qpdf
. qpdf
есть аргумент --check
, который хорошо подходит для поиска проблем в PDF-файлах.
qpdf
:qpdf --check test_file.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
Все методы, использующие 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 One-Liner:
Просто возвращает 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, но я предполагаю, что это работает так же, как и в любой среде на основе Unix.