Seguendo le orme di @n0nuf, ho scritto uno script batch per controllare tutti i PDF in una cartella specifica con pdfinfo e inviarlo tramite cpdf se rotto nel tentativo di risolverli:
@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 stesso dello 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
I PDF rotti verranno spostati in una sottocartella \ bak e i PDF ricreati ottengono il suffisso _.pdf (che non è perfetto, ma abbastanza buono per me). NOTA: un PDF ricreato contiene errori minori e dovrebbe essere visualizzabile con un normale visualizzatore di PDF. Ma questo non significa che avrai di nuovo tutti i tuoi contenuti. Il contenuto irrecuperabile porta a pagine vuote.
Ho anche provato lo stesso con JHOVE (strumento di identificazione, validazione e caratterizzazione del formato di file open source) come suggerito da @kraftydevil qui: controlla se i file PDF sono danneggiati usando la riga di comando su Linux e ora posso confermare che anche questo è un approccio valido. (Prima ho avuto un successo minore. Ma poi ho notato che non avevo gestito correttamente l'output di JHOVE.)
Per testare entrambi gli approcci ho eliminato e modificato parti casuali da un PDF con un editor di testo (i flussi rimossi, quindi le pagine non sono state visualizzate nel mio visualizzatore PDF, i tag PDF modificati e alcuni bit spostati). Il risultato è: sia pdfinfo che JHOVE sono in grado di individuare correttamente i file danneggiati (in alcuni casi JHOVE era ancora più sensibile).
Ed ecco lo script equivalente per 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