ตามรอยเท้าของ @ n0nuf ฉันได้เขียนสคริปต์แบทช์เพื่อตรวจสอบไฟล์ PDF ทั้งหมดในโฟลเดอร์ที่ระบุด้วย pdfinfo และกดมันผ่าน cpdf หากไม่สามารถแก้ไขได้:
@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
หรือเหมือนกับสคริปต์ทุบตี:
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 ที่ใช้งานไม่ได้จะถูกย้ายไปยังโฟลเดอร์ย่อย \ bak และไฟล์ PDF ที่สร้างใหม่จะได้รับส่วนต่อท้าย _.pdf (ซึ่งไม่สมบูรณ์แบบ แต่ดีพอสำหรับฉัน) หมายเหตุ: PDF ที่สร้างขึ้นใหม่มีข้อผิดพลาดน้อยลงและควรดูได้ด้วยโปรแกรมดู PDF ทั่วไป แต่นี่ไม่ได้หมายความว่าคุณจะได้รับเนื้อหาทั้งหมดคืน เนื้อหาที่ไม่สามารถกู้คืนได้นำไปสู่หน้าว่าง
ฉันยังลองใช้ JHOVE เหมือนกัน (การระบุรูปแบบไฟล์โอเพนซอร์สเครื่องมือตรวจสอบและระบุลักษณะ) ตามที่แนะนำโดย @kraftydevil ที่นี่: ตรวจสอบว่าไฟล์ PDF เสียหายโดยใช้บรรทัดคำสั่งบน Linuxและตอนนี้สามารถยืนยันได้ว่านี่เป็นแนวทางที่ถูกต้อง (ตอนแรกฉันประสบความสำเร็จน้อยลง แต่จากนั้นฉันสังเกตเห็นว่าฉันไม่ได้จัดการ JHOVE ของผลลัพธ์ได้อย่างถูกต้อง)
ในการทดสอบทั้งสองวิธีฉันได้ลบและเปลี่ยนส่วนแบบสุ่มจาก PDF ด้วยโปรแกรมแก้ไขข้อความ (สตรีมที่ถูกลบออกดังนั้นหน้าเว็บจึงไม่สามารถแสดงผลในโปรแกรมดู PDF ของฉันแก้ไขแท็ก PDF และเลื่อนบิตบางส่วน) ผลลัพธ์คือ: ทั้งpdfinfo และ JHOVE สามารถตรวจพบไฟล์ที่เสียหายได้อย่างถูกต้อง (JHOVE มีความไวมากขึ้นในบางกรณี)
และนี่คือสคริปต์ที่เทียบเท่าสำหรับ 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