Следуя указаниям @ n0nuf, я написал пакетный скрипт, чтобы проверить все PDF-файлы в определенной папке с помощью pdfinfo и протолкнуть его через cpdf, если он был сломан, в попытке их исправить:
@ECHO OFF FOR %%f in (*.PDF) DO ( echo %%f pdfinfo "%%f" 2>&1 | findstr /I "error" >nul 2>&1 if not errorlevel 1 ( echo "bad -> try to fix" @cpdf -i %%f -o %%f_.pdf 2>NUL mv %%f .\\bak\\%%f ) else ( REM echo good ) ) @ECHO ON
Или так же, как скрипт bash:
for file in $(find . -iname "*.pdf") do echo "$file" pdfinfo "$file" 2>&1 | grep -i 'error' &> /dev/null if [ $? == 0 ]; then echo "broken -> try to fix" cpdf -i "$file" -o "$file"_.pdf fi done
Сломанные PDF-файлы будут перемещены в подпапку \ bak, а воссозданные PDF-файлы получат суффикс _.pdf (который не идеален, но достаточно хорош для меня). ПРИМЕЧАНИЕ. Повторно созданный PDF-файл содержит меньше ошибок и должен просматриваться с помощью обычного средства просмотра PDF-файлов. Но это не значит, что вы получите весь свой контент обратно. Невосстанавливаемый контент приводит к пустым страницам.
Я также попробовал то же самое с JHOVE (инструмент для идентификации, проверки и определения формата файла с открытым исходным кодом), как предложено здесь @kraftydevil: Проверьте, не повреждены ли PDF-файлы с помощью командной строки в Linux, и теперь можно подтвердить, что это тоже правильный подход. (Сначала у меня был меньший успех. Но потом я заметил, что неправильно обработал вывод JHOVE.)
Чтобы протестировать оба подхода, я удалил и изменил случайные части из PDF с помощью текстового редактора (удалял потоки, поэтому страницы не отображались в моей программе просмотра PDF, изменял теги PDF и сдвигал некоторые биты). Результат: и pdfinfo, и JHOVE способны правильно определять поврежденные файлы (в некоторых случаях JHOVE был еще более чувствительным).
А вот эквивалентный скрипт для JHOVE:
@ECHO OFF FOR %%f in (*.PDF) DO ( echo %%f "C:\Program Files (x86)\JHOVE\jhove.bat" -m pdf-hul %%f | findstr /C:"Well-Formed and valid" >nul 2>&1 if not errorlevel 1 ( echo good ) else ( echo "bad -> try to fix" @cpdf -i %%f -o %%f_.pdf 2>NUL REM mv %%f .\\bak\\%%f ) ) @ECHO ON