Nach den Fußstapfen von @n0nuf habe ich ein Batch-Skript geschrieben, um alle PDFs in einem bestimmten Ordner mit pdfinfo zu überprüfen und durch cpdf zu pushen, falls sie fehlerhaft sind, um sie zu reparieren:
@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
Oder das gleiche wie das Bash-Skript:
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
Defekte PDFs werden in einen Unterordner \ bak verschoben und die neu erstellten PDFs erhalten das Suffix _.pdf (was nicht perfekt ist, aber gut genug für mich). HINWEIS: Eine neu erstellte PDF-Datei enthält weniger Fehler und sollte mit einem normalen PDF-Viewer angezeigt werden. Dies bedeutet jedoch nicht, dass Sie Ihren gesamten Inhalt zurückerhalten. Nicht wiederherstellbarer Inhalt führt zu leeren Seiten.
Ich habe es auch mit JHOVE (Open Source-Dateiformatidentifikation, -validierung und -charakterisierungstool) versucht, wie von @kraftydevil hier vorgeschlagen: Prüfen Sie, ob PDF-Dateien mithilfe der Befehlszeile unter Linux beschädigt sind, und bestätigen Sie, dass dies ebenfalls ein gültiger Ansatz ist. (Zuerst hatte ich weniger Erfolg. Dann bemerkte ich jedoch, dass ich die Ausgabe von JHOVE nicht korrekt verarbeitet hatte.)
Um beide Ansätze zu testen, habe ich zufällige Teile aus einem PDF-Dokument mit einem Texteditor gelöscht und geändert (Streams wurden entfernt, so dass Seiten in meinem PDF-Viewer nicht gerendert wurden, PDF-Tags geändert wurden und einige Bits verschoben wurden). Das Ergebnis ist: Sowohl pdfinfo als auch JHOVE können beschädigte Dateien richtig erkennen (JHOVE war in manchen Fällen sogar empfindlicher).
Und hier ist das entsprechende Skript für 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