Überprüfen Sie mithilfe der Befehlszeile unter Linux, ob PDF-Dateien beschädigt sind

16

Ich habe viele PDF-Dateien in einem Ordner.

Ist es möglich, über die Befehlszeile zu überprüfen, ob eine oder mehrere Dateien beschädigt sind (keine Seiten oder unvollendete Downloads), ohne sie einzeln öffnen zu müssen?

Kokizzu
quelle

Antworten:

20

Vielleicht gibt das Ausführen pdfinfo(hier auf Fedora im poppler-utilsPaket) einen Hinweis?

Die meisten Informationen zu einer PDF-Datei befinden sich am Ende im Wörterbuch. Wenn es also gefunden wird, sollte es in Ordnung sein. Ich würde etwas machen wie:

for f in *.pdf; do
  if pdfinfo "$f" > /dev/null; then
    : Nothing
  else
    echo "$f" is broken
  fi
done
vonbrand
quelle
6
Ich würde vorschlagen, pdfinfo durch pdftotext zu ersetzen. Auf diese Weise wird der gesamte Text auf jeder Seite überprüft. Und das Zeichen> gt sollte &> sein, damit nicht alle Fehlermeldungen angezeigt werden.
schoetbi
Alle meine PDFs werden als fehlerhaft markiert. Hunderte von Gigabyte. Einschließlich derer, die ich gerade erstellt habe. Ob mit pdfinfooder pdftotext...
PatrickT
13

Das ist mein Drehbuch

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
quelle
Zur Verdeutlichung: Dieses Skript benennt die PDF-Dateien, die durch Anhängen der Erweiterung .broken an die Erweiterung .pdf als "defekt" diagnostiziert wurden, um.
PatrickT
5

Mein bevorzugtes Werkzeug zum Überprüfen von PDFs ist qpdf. qpdfhat ein --checkArgument, das sich gut dazu eignet, Probleme in PDFs zu finden.

Überprüfen Sie ein einzelnes PDF mit qpdf:

qpdf --check test_file.pdf

Überprüfen Sie alle PDFs in einem Verzeichnis mit qpdf:

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

Befehlserklärung:

  • find ./directory_to_scan/ -type f -iname '*.pdf' Finde alle Dateien mit der Endung '.pdf'

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; Führen Sie qpdffür jede gefundene Datei die entsprechende Anweisung aus und leiten Sie alle Ausgaben an /dev/null. Gib auch den Dateinamen gefolgt von ': OK' aus, wenn der Rückgabestatus qpdf0 ist (dh keine Fehler)

  • -o -exec echo "{}": FAILED \; \) Dies wird ausgeführt, wenn Fehler gefunden werden: Drucke Dateiname gefolgt von ": FAILED"


Wo zu bekommen qpdf:

qpdfDie Linux- und Windows-Binärdateien sind verfügbar unter: https://github.com/qpdf/qpdf/releases . Sie können auch den Paketmanager Ihrer Wahl verwenden, um es zu erhalten. Unter Ubuntu können Sie zum Beispiel qpdf mit dem Befehl apt installieren:

apt install qpdf
muhen
quelle
Es werden qpdf --checkjedoch keine mehrfach definierten Metadaten erkannt, die nicht korrekt sind, da sie von verschiedenen Tools unterschiedlich gehandhabt werden. Ich habe einen Fehler gemeldet . Andere Tools wie pdfinfound pdftktun dies auch nicht, sie erheben jedoch keinen Anspruch darauf, die PDF-Struktur zu überprüfen.
Vinc17
4

Ich habe mir eine antwort geholt:

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

Bei fehlerhaften PDFs werden Fehler angezeigt.

Kokizzu
quelle
4
Es ist eine schlechte Idee (und nie wirklich gebraucht) zu iterieren über die Ausgabe von ls: mywiki.wooledge.org/ParsingLs
slhck
2
@slhck: Dies sollte mit behandelt werden find (1). :-)
Wiedereinsetzung von Monica - M. Schröder
2

Alle Methoden mit pdfinfooder pdftotexthaben bei mir nicht funktioniert. Tatsächlich gaben sie mir immer wieder Fehlalarme und erstellten manchmal Dateien, die ich nicht brauchte.

Was funktionierte, war JHOVE .

Installation:

Installieren Sie die JAR-Datei über den obigen Link und aktualisieren Sie Ihre PATH-Umgebungsvariable mit dem folgenden Befehl:

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

Aktualisieren Sie jedes Terminal mit source ~/.bash_profileund Sie können es systemweit verwenden.

Grundsätzliche Verwendung:

jhove -m pdf-hul someFile.pdf

Sie werden eine Menge Informationen über das PDF erhalten - mehr als die meisten Leute wahrscheinlich brauchen.

Bash One-Liner:
Einfach zurücksenden validoder invalid:

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

Beachten Sie, dass dies unter Mac OS X ausgeführt wurde, aber ich gehe davon aus, dass es in jeder Unix-basierten Bash-Umgebung gleich funktioniert.

Kraftydevil
quelle