Controlla se i file PDF sono danneggiati usando la riga di comando su Linux


16

Ho molti file PDF in una cartella.

È possibile verificare se uno o più file sono danneggiati (zero pagine o download incompiuti) utilizzando la riga di comando, senza la necessità di aprirli uno per uno?

Risposte:


20

Forse correre pdfinfo(qui su Fedora nel poppler-utilspacchetto) dà un indizio?

La maggior parte delle informazioni su un file PDF è nel dizionario alla fine, quindi se lo trova dovrebbe essere OK. Farei qualcosa del tipo:

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

6
Suggerirei di sostituire pdfinfo con pdftotext. In questo modo verrà controllato tutto il testo su ogni pagina. E il carattere> gt dovrebbe essere &> in modo che tutti i messaggi di errore non vengano visualizzati.
schoetbi,

Tutti i miei PDF sono contrassegnati come non funzionanti. Centinaia di gigabyte di essi. Compresi quelli che ho appena creato. Sia che si usi pdfinfoo pdftotext...
PatrickT

13

Questa è la mia sceneggiatura

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

Per chiarire: questo script rinomina i file pdf che vengono diagnosticati come "danneggiati" aggiungendo .broken all'estensione .pdf.
Patrick,

5

Il mio strumento preferito per controllare i PDF è qpdf. qpdfha un --checkargomento che fa bene a trovare problemi nei PDF.

Controlla un singolo PDF con qpdf:

qpdf --check test_file.pdf

Controlla tutti i PDF in una directory con qpdf:

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

Spiegazione del comando:

  • find ./directory_to_scan/ -type f -iname '*.pdf' Trova tutti i file con estensione ".pdf"

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; Eseguire qpdfper ogni file trovato e reindirizzare tutto l'output /dev/null. Stampa anche il nome file seguito da ': OK' se lo stato di ritorno qpdfè 0 (cioè nessun errore)

  • -o -exec echo "{}": FAILED \; \) Viene eseguito se vengono rilevati errori: Stampa il nome file seguito da ": FAILED"


Dove ottenere qpdf:

qpdfha binari sia Linux che Windows disponibili su: https://github.com/qpdf/qpdf/releases . Puoi anche usare il tuo gestore di pacchetti preferito per ottenerlo. Ad esempio su Ubuntu è possibile installare qpdf usando apt con il comando:

apt install qpdf

Tuttavia, qpdf --checknon rileva i metadati definiti in modo multiplo, che sono errati poiché vengono gestiti in modo diverso da strumenti diversi. Ho segnalato un bug . Altri strumenti come pdfinfoe pdftknon lo fanno neanche, ma non pretendono di controllare la struttura del PDF.
vinc17,


2

Tutti i metodi che usano pdfinfoo pdftotextnon hanno funzionato per me. In effetti continuavano a darmi falsi positivi e talvolta creavano file di cui non avevo bisogno.

Ciò che ha funzionato è stato JHOVE .

Installazione:

Installa il jar dal link sopra e aggiorna la tua variabile d'ambiente PATH con questo comando:

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

Aggiorna ogni terminale con source ~/.bash_profilee sei pronto per iniziare a usarlo a livello di sistema.

Uso di base:

jhove -m pdf-hul someFile.pdf

Riceverai molte informazioni sul pdf - più di quanto probabilmente la maggior parte delle persone abbia bisogno.

Bash One-Liner:
restituisce semplicemente valido invalid:

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

Si noti che questo è stato eseguito su Mac OS X ma suppongo che funzioni allo stesso modo con qualsiasi ambiente Bash basato su Unix.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.