Seguindo os passos de @n0nuf, escrevi um script em lote para verificar todos os PDFs em uma pasta específica com o pdfinfo e enviar por cpdf se estiver 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 menos erros e deve ser visualizável 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 arquivos de código aberto) como sugerido por @kraftydevil aqui: Verifique se os arquivos PDF estão corrompidos usando a linha de comando no Linux e agora podemos confirmar que esta também é uma abordagem válida.
(Primeiro eu tive menos sucesso. Mas então percebi que não havia manipulado a saída do JHOVE corretamente.)
Para testar as duas abordagens, excluí e alterei as partes aleatórias de um PDF com um editor de texto (removi fluxos, assim as páginas não foram renderizadas em meu visualizador de PDF, alterei as marcações de PDF e alterei alguns bits). O resultado é: Tanto o pdfinfo quanto o JHOVE conseguem identificar corretamente os arquivos danificados (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