En suivant les traces de @ n0nuf, j'ai écrit un script batch pour vérifier tous les PDF dans un dossier spécifique avec pdfinfo et le pousser à travers cpdf s'il est cassé pour tenter de les réparer:
@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
Ou le même que le script 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
Les PDF cassés seront déplacés vers un sous-dossier \ bak et les PDF recréés obtiendront le suffixe _.pdf (ce qui n'est pas parfait, mais assez bon pour moi). REMARQUE: un PDF recréé contient moins d'erreurs et doit être visible avec une visionneuse PDF standard. Mais cela ne signifie pas que vous récupérez tout votre contenu. Le contenu non récupérable conduit à des pages vides.
J'ai également essayé la même chose avec JHOVE (outil d'identification, de validation et de caractérisation de format de fichier open source) comme suggéré par @kraftydevil ici: Vérifiez si les fichiers PDF sont corrompus en utilisant la ligne de commande sous Linux et pouvez maintenant confirmer que c'est également une approche valide. (D'abord, j'ai eu moins de succès. Mais ensuite j'ai remarqué que je n'avais pas géré correctement la sortie de JHOVE.)
Pour tester les deux approches, j'ai supprimé et modifié des parties aléatoires d'un PDF avec un éditeur de texte (les flux ont été supprimés, les pages n'ont donc pas pu être affichées dans ma visionneuse PDF, les balises PDF modifiées et certains bits décalés). Le résultat est: pdfinfo et JHOVE sont capables de repérer correctement les fichiers endommagés (JHOVE était encore plus sensible dans certains cas).
Et voici le script équivalent pour 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