Periksa apakah file PDF rusak menggunakan baris perintah di Linux

16

Saya memiliki banyak file PDF pada satu folder.

Apakah mungkin memeriksa apakah satu atau lebih file rusak (nol halaman, atau unduhan yang belum selesai) menggunakan baris perintah, tanpa perlu membukanya satu per satu?

Kokizzu
sumber

Jawaban:

20

Mungkin berjalan pdfinfo(di sini di Fedora dalam poppler-utilspaket) memberikan petunjuk?

Sebagian besar informasi pada file PDF ada di kamus pada akhirnya, jadi jika ditemukan itu harus OK. Saya akan melakukan sesuatu seperti:

for f in *.pdf; do
  if pdfinfo "$f" > /dev/null; then
    : Nothing
  else
    echo "$f" is broken
  fi
done
vonbrand
sumber
6
Saya akan menyarankan untuk mengganti pdfinfo dengan pdftotext. Dengan cara ini semua teks pada setiap halaman akan diperiksa. Dan karakter> gt harus &> sehingga semua pesan kesalahan tidak muncul.
schoetbi
Semua PDF saya ditandai sebagai rusak. Ratusan gigabytes. Termasuk yang baru saja saya buat. Baik menggunakan pdfinfoatau pdftotext...
PatrickT
13

Ini skrip saya

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
schoetbi
sumber
Untuk memperjelas: Skrip ini mengganti nama file pdf yang didiagnosis sebagai 'rusak' dengan menambahkan .broken ke ekstensi .pdf.
PatrickT
5

Alat pilihan saya untuk memeriksa PDF adalah qpdf. qpdfmemiliki --checkargumen yang berfungsi baik untuk menemukan masalah dalam PDF.

Periksa satu PDF dengan qpdf:

qpdf --check test_file.pdf

Periksa semua PDF dalam direktori dengan qpdf:

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

Penjelasan Perintah:

  • find ./directory_to_scan/ -type f -iname '*.pdf' Temukan semua file dengan ekstensi '.pdf'

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; Jalankan qpdfuntuk setiap file yang ditemukan dan pipa semua output /dev/null. Juga cetak nama file diikuti oleh ': OK' jika status pengembalian qpdfadalah 0 (yaitu tidak ada kesalahan)

  • -o -exec echo "{}": FAILED \; \) Ini dijalankan jika ditemukan kesalahan: Cetak nama file diikuti oleh ": GAGAL"


Di mana mendapatkan qpdf:

qpdfmemiliki binari Linux dan Windows yang tersedia di: https://github.com/qpdf/qpdf/releases . Anda juga bisa menggunakan manajer paket pilihan Anda untuk mendapatkannya. Sebagai contoh di Ubuntu Anda dapat menginstal qpdf menggunakan apt dengan perintah:

apt install qpdf
melenguh
sumber
Namun, qpdf --checktidak mendeteksi metadata yang didefinisikan multipel, yang tidak benar karena mereka ditangani secara berbeda oleh alat yang berbeda. Saya telah melaporkan bug . Alat lain seperti pdfinfodan pdftkjuga tidak, tetapi mereka tidak mengklaim untuk memeriksa struktur PDF.
vinc17
4

Saya sendiri mendapat jawaban:

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

PDF dengan kesalahan akan menunjukkan kesalahan.

Kokizzu
sumber
4
Ini adalah ide yang buruk (dan tidak pernah benar-benar diperlukan) untuk mengulangi output dari ls: mywiki.wooledge.org/ParsingLs
slhck
2
@ Slhck: Ini harus ditangani find (1). :-)
Reinstate Monica - M. Schröder
2

Semua metode menggunakan pdfinfoatau pdftotextbelum berfungsi untuk saya. Bahkan mereka terus memberi saya positif palsu dan terkadang membuat file yang tidak saya butuhkan.

Apa yang berhasil adalah JHOVE .

Instalasi:

Pasang tabung dari tautan di atas dan perbarui variabel lingkungan PATH Anda dengan perintah ini:

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

Refresh setiap terminal dengan source ~/.bash_profiledan Anda baik untuk mulai menggunakannya dengan sistem luas.

Penggunaan Dasar:

jhove -m pdf-hul someFile.pdf

Anda akan mendapatkan banyak info tentang pdf - lebih dari yang mungkin dibutuhkan kebanyakan orang.

Bash One-Liner:
Cukup mengembalikan validatau invalid:

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

Perhatikan bahwa ini dijalankan pada Mac OS X tapi saya menganggap itu berfungsi sama dengan lingkungan Bash berbasis Unix.

kraftydevil
sumber