Siguiendo los pasos de @ n0nuf, escribí un script por lotes para verificar todos los archivos PDF en una carpeta específica con pdfinfo y empujarlo a través de cpdf si se rompe como un intento de corregirlos:
@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
O lo mismo que el 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
Los PDF rotos se moverán a una subcarpeta \ bak y los PDF recreados obtienen el sufijo _.pdf (que no es perfecto, pero es lo suficientemente bueno para mí). NOTA: Un PDF recreado contiene errores menores y debería poder verse con un visor de PDF normal. Pero esto no significa que recuperes todo tu contenido. El contenido irrecuperable conduce a páginas vacías.
También probé lo mismo con JHOVE (herramienta de identificación, validación y caracterización de formatos de archivo de código abierto) como lo sugiere @kraftydevil aquí: compruebe si los archivos PDF están dañados usando la línea de comandos en Linux y ahora puede confirmar que este también es un enfoque válido. (Primero tuve menos éxito. Pero luego noté que no había manejado la salida de JHOVE correctamente).
Para probar ambos enfoques, eliminé y modifiqué partes aleatorias de un PDF con un editor de texto (eliminé las secuencias, por lo que las páginas no se pudieron procesar en mi visor de PDF, modifiqué las etiquetas PDF y cambié algunos bits). El resultado es: pdfinfo y JHOVE pueden detectar archivos dañados correctamente (JHOVE fue aún más sensible en algunos casos).
Y aquí está el script equivalente para 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