Seguindo os passos do @ n0nuf, escrevi um script em lote para verificar todos os PDFs em uma pasta específica com pdfinfo e enviá-lo através do cpdf, se quebrado, como uma tentativa de corrigi-los:
@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 o mesmo que o 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
PDFs quebrados serão movidos para uma subpasta \ bak e os PDFs recriados receberão o sufixo _.pdf (que não é perfeito, mas é bom o suficiente para mim). NOTA: Um PDF recriado contém erros menores e deve ser visualizado com um visualizador de PDF comum. Mas isso não significa que você recupere todo o seu conteúdo. Conteúdo irrecuperável leva a páginas vazias.
Eu também tentei o mesmo com o JHOVE (ferramenta de identificação, validação e caracterização de formato de arquivo de código aberto), conforme sugerido por @kraftydevil aqui: Verifique se os arquivos PDF estão corrompidos usando a linha de comando no Linux e agora posso confirmar que essa também é uma abordagem válida. (Primeiro, tive menos sucesso. Mas depois notei que não havia manipulado a saída do JHOVE corretamente.)
Para testar as duas abordagens, apaguei e alterei partes aleatórias de um PDF com um editor de texto (fluxos removidos, para que as páginas não fossem renderizadas no visualizador de PDF, alterei as Tags PDF e alterei alguns bits). O resultado é: Tanto o pdfinfo quanto o JHOVE conseguem detectar arquivos danificados corretamente (o JHOVE foi ainda mais sensível em alguns casos).
E aqui está o 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