Слідуючи крокам @ 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 script:
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