Auf den Spuren von @ n0nuf habe ich ein Batch-Skript geschrieben, um alle PDFs in einem bestimmten Ordner mit pdfinfo zu überprüfen und es durch cpdf zu verschieben, wenn es beschädigt ist, um sie zu beheben:
@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 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 für mich gut genug). HINWEIS: Eine neu erstellte PDF-Datei enthält weniger Fehler und sollte mit einem normalen PDF-Viewer angezeigt werden können. Dies bedeutet jedoch nicht, dass Sie alle Ihre Inhalte zurückerhalten. Nicht wiederherstellbarer Inhalt führt zu leeren Seiten.
Ich habe dasselbe auch mit JHOVE (Open Source-Format zur Identifizierung, Validierung und Charakterisierung von Dateiformaten) versucht, wie von @kraftydevil hier vorgeschlagen: Überprüfen Sie, ob PDF-Dateien mithilfe der Befehlszeile unter Linux beschädigt sind, und können Sie jetzt bestätigen, dass dies auch ein gültiger Ansatz ist. (Zuerst hatte ich weniger Erfolg. Aber dann bemerkte ich, dass ich die Ausgabe von JHOVE nicht richtig gehandhabt hatte.)
Um beide Ansätze zu testen, habe ich zufällige Teile aus einem PDF mit einem Texteditor gelöscht und geändert (Streams wurden entfernt, sodass Seiten in meinem PDF-Viewer nicht gerendert werden konnten, PDF-Tags geändert und einige Bits verschoben). Das Ergebnis ist: Sowohl pdfinfo als auch JHOVE können beschädigte Dateien korrekt erkennen (JHOVE war in einigen Fällen sogar noch 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