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

16

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

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

Kokizzu
источник

Ответы:

20

Возможно, запуск pdfinfo(здесь на Fedora в poppler-utilsпакете) дает подсказку?

Большая часть информации о файле PDF находится в конце словаря, поэтому, если он его найдет, все будет в порядке. Я бы сделал что-то вроде:

for f in *.pdf; do
  if pdfinfo "$f" > /dev/null; then
    : Nothing
  else
    echo "$f" is broken
  fi
done
vonbrand
источник
6
Я бы предложил заменить pdfinfo на pdftotext. Таким образом, весь текст на каждой странице будет проверен. И символ> gt должен быть &>, чтобы не отображались все сообщения об ошибках.
schoetbi
Все мои PDF-файлы помечены как сломанные. Сотни гигабайт из них. Включая те, которые я только что создал. Используете ли pdfinfoили pdftotext...
PatrickT
13

Это мой сценарий

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
schoetbi
источник
Для пояснения: этот сценарий переименовывает PDF-файлы, которые были диагностированы как «поврежденные», добавляя .broken к расширению .pdf.
PatrickT
5

Мой инструмент выбора для проверки 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
мычание
источник
Тем qpdf --checkне менее, не обнаруживает многократно определенные метаданные, которые являются неправильными, поскольку они обрабатываются по-разному различными инструментами. Я сообщил об ошибке . Другие инструменты, такие как pdfinfoи pdftkнет, но они не претендуют на проверку структуры PDF.
vinc17
4

Я получил ответ:

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

PDF с ошибками покажет ошибки.

Kokizzu
источник
4
Это плохая идея (и никогда не нужная) перебирать вывод ls: mywiki.wooledge.org/ParsingLs
slhck
2
@slhck: это должно быть обработано с find (1). :-)
Восстановить Монику - М. Шредер
2

Все методы используют 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.

kraftydevil
источник