Mengikuti jejak @ n0nuf, saya menulis skrip batch untuk memeriksa semua PDF dalam folder tertentu dengan pdfinfo dan mendorongnya melalui cpdf jika rusak sebagai upaya untuk memperbaikinya:
@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
Atau sama dengan skrip 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
PDF yang rusak akan dipindahkan ke subfolder \ bak dan PDF yang dibuat ulang mendapatkan akhiran _.pdf (yang tidak sempurna, tetapi cukup baik untuk saya). CATATAN: PDF yang dibuat ulang mengandung kesalahan yang lebih sedikit dan harus dapat dilihat dengan penampil PDF biasa. Tapi ini tidak berarti Anda mendapatkan semua konten Anda kembali. Konten yang tidak dapat dikembalikan mengarah ke halaman kosong.
Saya juga mencoba hal yang sama dengan JHOVE (Identifikasi format file sumber terbuka, alat validasi & karakterisasi) seperti yang disarankan oleh @kraftydevil di sini: Periksa apakah file PDF rusak menggunakan baris perintah di Linux dan sekarang dapat mengkonfirmasi ini juga merupakan pendekatan yang valid. (Pertama saya kurang sukses. Tapi kemudian saya perhatikan saya tidak menangani hasil JHOVE dengan benar.)
Untuk menguji kedua pendekatan saya menghapus dan mengubah bagian acak dari PDF dengan editor teks (aliran dihapus, sehingga halaman gagal membuat di penampil PDF saya, mengubah Tag PDF, dan menggeser beberapa bit). Hasilnya adalah: Baik pdfinfo dan JHOVE dapat menemukan file yang rusak dengan benar (JHOVE bahkan lebih sensitif dalam beberapa kasus).
Dan di sini adalah skrip yang setara untuk 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