Vérifiez si les fichiers PDF sont corrompus à l'aide de la ligne de commande sous Linux


16

J'ai de nombreux fichiers PDF sur un dossier.

Est-il possible de vérifier si un ou plusieurs fichiers sont corrompus (zéro page, ou téléchargements inachevés) en utilisant la ligne de commande, sans avoir besoin de les ouvrir un par un?

Réponses:


20

Peut-être que courir pdfinfo(ici sur Fedora dans le poppler-utilspaquet) donne un indice?

La plupart des informations sur un fichier PDF se trouvent dans le dictionnaire à la fin, donc s'il le trouve, cela devrait être OK. Je ferais quelque chose comme:

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

6
Je suggère de remplacer pdfinfo par pdftotext. De cette façon, tout le texte de chaque page sera vérifié. Et le caractère> gt devrait être &> pour que tous les messages d'erreur n'apparaissent pas.
schoetbi

Tous mes PDF sont signalés comme cassés. Des centaines de gigaoctets d'entre eux. Y compris ceux que je viens de créer. Que ce soit en utilisant pdfinfoou pdftotext...
PatrickT

13

C'est mon script

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

Pour clarifier: ce script renomme les fichiers pdf qui sont diagnostiqués comme «cassés» en ajoutant .broken à l'extension .pdf.
PatrickT

5

Mon outil de choix pour vérifier les PDF est qpdf. qpdfa un --checkargument qui fait bien de trouver des problèmes dans les PDF.

Vérifiez un seul PDF avec qpdf:

qpdf --check test_file.pdf

Vérifiez tous les PDF dans un répertoire avec qpdf:

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

Explication de la commande:

  • find ./directory_to_scan/ -type f -iname '*.pdf' Trouver tous les fichiers avec l'extension '.pdf'

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; Exécutez qpdfpour chaque fichier trouvé et dirigez toutes les sorties vers /dev/null. Imprime également le nom de fichier suivi de ': OK' si le statut de retour qpdfest 0 (c.-à-d. Pas d'erreur)

  • -o -exec echo "{}": FAILED \; \) Ceci est exécuté si des erreurs sont trouvées: Imprimer le nom du fichier suivi de ": FAILED"


Où trouver qpdf:

qpdfa des binaires Linux et Windows disponibles sur: https://github.com/qpdf/qpdf/releases . Vous pouvez également utiliser le gestionnaire de paquets de votre choix pour l'obtenir. Par exemple sur Ubuntu, vous pouvez installer qpdf en utilisant apt avec la commande:

apt install qpdf

Cependant, qpdf --checkne détecte pas les métadonnées multipliées définies, qui sont incorrectes car elles sont gérées différemment par différents outils. J'ai signalé un bug . D'autres outils tels que pdfinfoet pdftkne le font pas non plus, mais ils ne prétendent pas vérifier la structure PDF.
vinc17


2

Toutes les méthodes utilisant pdfinfoou pdftotextn'ayant pas fonctionné pour moi. En fait, ils ne cessaient de me donner de faux positifs et créaient parfois des fichiers dont je n'avais pas besoin.

Ce qui a fonctionné était JHOVE .

Installation:

Installez le pot à partir du lien ci-dessus et mettez à jour votre variable d'environnement PATH avec cette commande:

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

Actualisez chaque terminal avec source ~/.bash_profileet vous êtes prêt à commencer à l'utiliser à l'échelle du système.

Utilisation de base:

jhove -m pdf-hul someFile.pdf

Vous obtiendrez beaucoup d'informations sur le pdf - plus que la plupart des gens n'en ont probablement besoin.

Bash One-Liner:
revient simplement validou invalid:

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

Notez que cela a été exécuté sur Mac OS X, mais je suppose que cela fonctionne de la même manière avec n'importe quel environnement Bash basé sur Unix.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.