Podążając śladami @ n0nuf, napisałem skrypt wsadowy, aby sprawdzić wszystkie pliki PDF w określonym folderze za pomocą pdfinfo i przepchnąć go przez cpdf, jeśli jest uszkodzony, próbując je naprawić:
@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
Lub to samo co skrypt 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
Zepsute pliki PDF zostaną przeniesione do podfolderu \ bak, a odtworzone pliki PDF otrzymają przyrostek _.pdf (co nie jest idealne, ale dla mnie wystarczające). UWAGA: Odtworzony plik PDF zawiera mniej błędów i powinien być widoczny w zwykłej przeglądarce plików PDF. Ale to nie znaczy, że odzyskujesz wszystkie treści. Nieodwracalna zawartość prowadzi do pustych stron.
Próbowałem również tego samego z JHOVE (narzędzie do identyfikacji, sprawdzania poprawności i charakteryzowania formatu plików Open Source), jak sugeruje @kraftydevil tutaj: Sprawdź, czy pliki PDF są uszkodzone za pomocą wiersza poleceń w systemie Linux i teraz mogę potwierdzić, że jest to również poprawne podejście. (Najpierw odniosłem mniejszy sukces. Ale potem zauważyłem, że nie obsłużyłem poprawnie wyjścia JHOVE.)
Aby przetestować oba podejścia, usunąłem i zmieniłem losowe części z pliku PDF za pomocą edytora tekstu (usunąłem strumienie, więc strony nie renderowały się w mojej przeglądarce PDF, zmieniły tagi PDF i przesunąłem niektóre bity). Rezultat jest następujący: Zarówno pdfinfo, jak i JHOVE są w stanie poprawnie wykryć uszkodzone pliki (w niektórych przypadkach JHOVE był jeszcze bardziej wrażliwy).
A oto skrypt równoważny dla 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