ตรวจสอบว่าไฟล์ PDF เสียหายโดยใช้บรรทัดคำสั่งบน Linux หรือไม่


16

ฉันมีไฟล์ PDF หลายไฟล์ในโฟลเดอร์เดียว

เป็นไปได้หรือไม่ที่จะตรวจสอบว่าไฟล์อย่างน้อยหนึ่งไฟล์เสียหาย (เป็นศูนย์หน้าหรือดาวน์โหลดไม่เสร็จ) โดยใช้บรรทัดคำสั่งโดยไม่จำเป็นต้องเปิดทีละไฟล์?

คำตอบ:


20

บางทีทำงานpdfinfo(ที่นี่ใน Fedora ในpoppler-utilsแพ็คเกจ) ให้เบาะแส

ข้อมูลส่วนใหญ่ของไฟล์ PDF อยู่ในพจนานุกรมเมื่อสิ้นสุดดังนั้นหากพบว่าควรเป็น OK ฉันจะทำสิ่งที่ชอบ:

for f in *.pdf; do
  if pdfinfo "$f" > /dev/null; then
    : Nothing
  else
    echo "$f" is broken
  fi
done

6
ฉันอยากจะแนะนำให้แทนที่ pdfinfo ด้วย pdftotext วิธีนี้ข้อความทั้งหมดในทุกหน้าจะถูกตรวจสอบ และอักขระ> gt ควรเป็น &> เพื่อไม่ให้ข้อความแสดงข้อผิดพลาดปรากฏขึ้น
schoetbi

PDF ทั้งหมดของฉันถูกตั้งค่าสถานะว่าเสีย หลายร้อยกิกะไบต์ รวมถึงสิ่งที่ฉันเพิ่งสร้าง ไม่ว่าจะใช้pdfinfoหรือpdftotext...
PatrickT

13

นี่คือสคริปต์ของฉัน

find . -iname '*.pdf' | while read -r f
  do
    if pdftotext "$f" &> /dev/null; then 
        echo "$f" was ok;   
    else
        mv "$f" "$f.broken";
        echo "$f" is broken;   
    fi; 
done

หากต้องการชี้แจง: สคริปต์นี้จะเปลี่ยนชื่อไฟล์ pdf ที่ได้รับการวินิจฉัยว่า 'เสีย' โดยการผนวก .broken เข้ากับส่วนขยาย. pdf
PatrickT

5

เครื่องมือของฉันของทางเลือกสำหรับการตรวจสอบไฟล์ PDF qpdfเป็น qpdfมี--checkอาร์กิวเมนต์ที่หาปัญหาใน PDF ได้ดี

ตรวจสอบ PDF เดียวกับqpdf:

qpdf --check test_file.pdf

ตรวจสอบ PDF ทั้งหมดในไดเรกทอรีด้วยqpdf:

find ./directory_to_scan/ -type f -iname '*.pdf' \( -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; -o -exec echo "{}": FAILED \; \)

คำอธิบายคำสั่ง:

  • find ./directory_to_scan/ -type f -iname '*.pdf' ค้นหาไฟล์ทั้งหมดที่มีนามสกุล '.pdf'

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; ดำเนินการสำหรับแต่ละไฟล์พบและท่อส่งออกทั้งหมดไปยังqpdf /dev/nullพิมพ์ชื่อไฟล์ตามด้วย ': OK' หากสถานะการส่งคืนqpdfเป็น 0 (เช่นไม่มีข้อผิดพลาด)

  • -o -exec echo "{}": FAILED \; \) สิ่งนี้จะถูกดำเนินการหากพบข้อผิดพลาด: พิมพ์ชื่อไฟล์ตามด้วย ": FAILED"


รับได้ที่ไหนqpdf:

qpdfมีทั้ง Linux และ Windows ไบนารีที่: https://github.com/qpdf/qpdf/releases คุณสามารถใช้ตัวจัดการแพ็คเกจที่คุณเลือกเพื่อรับมันได้ ตัวอย่างเช่นบน Ubuntu คุณสามารถติดตั้ง qpdf โดยใช้ apt ด้วยคำสั่ง:

apt install qpdf

อย่างไรก็ตามqpdf --checkไม่พบข้อมูลเมตาที่กำหนดแบบทวีคูณซึ่งไม่ถูกต้องเนื่องจากข้อมูลเหล่านั้นมีการจัดการที่แตกต่างกันโดยเครื่องมือต่าง ๆ ฉันรายงานข้อบกพร่องแล้ว เครื่องมืออื่น ๆ เช่นpdfinfoและpdftkไม่ทำอย่างใดอย่างหนึ่ง แต่ไม่อ้างสิทธิ์ในการตรวจสอบโครงสร้าง PDF
vinc17

4

ฉันได้รับคำตอบตัวเอง:

for x in *.pdf; do echo "$x"; pdfinfo "$x" | grep Pages; done

PDF ที่มีข้อผิดพลาดจะแสดงข้อผิดพลาด


4
มันเป็นความคิดที่ดี (และไม่จำเป็นจริงๆ) ในการทำซ้ำมากกว่าผลลัพธ์ของls: mywiki.wooledge.org/ParsingLs
slhck

2
@slhck: find (1)นี้ควรจะจัดการกับ :-)
Reinstate Monica - M. Schröder

2

วิธีการทั้งหมดที่ใช้pdfinfoหรือpdftotextไม่ได้ผลสำหรับฉัน ในความเป็นจริงพวกเขายังให้บวกเท็จและบางครั้งฉันสร้างไฟล์ที่ฉันไม่ต้องการ

สิ่งที่ได้ทำงานเป็นJHOVE

การติดตั้ง:

ติดตั้ง jar จากลิงก์ด้านบนและอัพเดตตัวแปรสภาวะแวดล้อม PATH ของคุณด้วยคำสั่งนี้:

echo "export PATH=\$PATH:/REPLACE_WITH/YOUR/PATH_TO/jhove/" >> ~/.bash_profile

รีเฟรชแต่ละเทอร์มินัลด้วย source ~/.bash_profileและคุณก็พร้อมที่จะเริ่มใช้งานทั้งระบบ

การใช้งานพื้นฐาน:

jhove -m pdf-hul someFile.pdf

คุณจะได้รับข้อมูลจำนวนมากเกี่ยวกับ pdf - มากกว่าคนส่วนใหญ่อาจต้องการ

Bash One-Liner:
เพียงแค่คืนvalidหรือinvalid:

if [[ $(jhove -m pdf-hul someFile.pdf | grep -a "Status:") == *"Well-Formed and valid"* ]]; then echo "valid"; else echo "invalid"; fi;

โปรดทราบว่านี่ทำงานบน Mac OS X แต่ฉันคิดว่ามันใช้งานได้เหมือนกันกับสภาพแวดล้อม Bash ที่ใช้ Unix

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.