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

Ich habe viele PDF-Dateien in einem Ordner.

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

 20
Author: slhck, 2013-04-10

8 answers

Sie können es mit pdfinfo versuchen (hier auf Fedora im Paket poppler-utils). pdfinfo ruft Informationen über die PDF-Datei aus seinem Wörterbuch ab, wenn Sie sie findet, sollte die Datei in Ordnung sein

for f in *.pdf; do
  if ! pdfinfo "$f" &> /dev/null; then
    echo "$f" is broken
  fi
done
 23
Author: vonbrand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-31 16:50:36
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
 14
Author: schoetbi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-31 20:40:22

Mein Werkzeug der Wahl zum Überprüfen von PDFs ist qpdf. qpdf hat ein --check Argument, das gut tut, um 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 \; \)

Befehl Erklärung:

  • find ./directory_to_scan/ -type f -iname '*.pdf' Finden Sie alle Dateien mit '.pdf ' Erweiterung

  • -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; Führen Sie qpdf für jede gefundene Datei aus und leiten Sie die gesamte Ausgabe an /dev/null weiter. Auch print filename folgte durch ': OK' if return status qpdf 0 (D. H. keine Fehler)

  • -o -exec echo "{}": FAILED \; \) Dieser wird ausgeführt, wenn Fehler gefunden werden: Drucken mit dem Namen, gefolgt von ": ist FEHLGESCHLAGEN",


Wo bekomme ich qpdf:

qpdf hat sowohl Linux-als auch Windows-Binärdateien verfügbar unter: https://github.com/qpdf/qpdf/releases. Sie können auch Ihren Paketmanager Ihrer Wahl verwenden, um ihn zu erhalten. Unter Ubuntu können Sie beispielsweise qpdf mit apt mit dem folgenden Befehl installieren:

apt install qpdf
 11
Author: moo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-02-03 00:04:08

Ich habe mir eine Antwort geholt:

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

PDFs mit Fehlern zeigen Fehler an.

 4
Author: Kokizzu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-04-10 14:07:41

Alle Methoden, die pdfinfo oder pdftotext verwenden, haben bei mir nicht funktioniert. Tatsächlich gaben sie mir immer wieder falsch positive Ergebnisse und erstellten manchmal Dateien, die ich nicht brauchte.

Was funktioniert hat, war JHOVE.

Installation:

Installieren Sie das JAR über den obigen Link und aktualisieren Sie Ihre PATH Umgebungsvariable mit diesem Befehl:

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

Aktualisieren Sie jedes Terminal mit source ~/.bash_profile und du bist gut, es systemweit zu benutzen.

Grundlegende Verwendung:

jhove -m pdf-hul someFile.pdf

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

Bash-Einzeiler:
Gibt einfach valid oder invalid zurück:

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 genauso funktioniert.

 2
Author: kraftydevil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-04-30 13:29:52

Es gibt verschiedene Möglichkeiten, dies zu tun. Es hängt davon ab, was genau Sie überprüfen möchten.

Verschiedene Befehle verhalten sich anders und einige beenden mit dem Status 0 - auch wenn es einige Fehler gab.

Es hängt auch davon ab, ob Sie eine Warnung (möglicherweise auch mit dem Exit-Status 0) als Hinweis auf eine beschädigte Datei behandeln. Und schließlich, selbst wenn es einige Fehler/Warnungen gibt, hängt es davon ab, worum es bei diesem Fehler/dieser Warnung tatsächlich geht (vielleicht ist ein beschädigtes eingebettetes Bild kein großes problem für Sie, und Sie betrachten eine solche PDF-Datei als gültig). Es gibt viele Dinge zu entscheiden, und das Ausprobieren verschiedener Tools kann von Vorteil sein.

Ich habe eine Datenbank mit 5031 PDF-Dateien und habe sie mit den folgenden Befehlen getestet:

  1. pdfinfo file.pdf (~3 min)
  2. pdftotext -layout file.pdf - (~29 min)
  3. qpdf --check file.pdf (~222 min)

Für das Vorhandensein jeglicher Art von Ausgabe in stderr und speichert diese Ausgabe in der Tabelle: https://docs.google.com/spreadsheets/d/1UA9HOKW9rYnUOQ5JAnFUwZ7N6YftSotzhe46zBgiEJY/edit?usp=sharing

Ich habe die Zeilen nach dem Vorhandensein einer Ausgabe in stderr aus einem BELIEBIGEN Befehl für eine Datei gefiltert. Jede Zelle enthält die vollständige stderr-Ausgabe - doppelklicken Sie darauf, um den Inhalt anzuzeigen.

pdfimages -list file.pdf - gibt genau die gleichen Fehler wie pdftottext

So können Sie die Dateien mit allen oder ausgewählten Testbefehlen auf folgende Weise testen:

for file in *
do 
    if stderr=$((\
        pdfinfo $file && \
        pdftotext -layout $file - && \
        qpdf --check $file) 2>&1 >/dev/null) && test -z "$stderr"
    then
        echo 'file is ok'
    else
        echo 'file is NOT OK'
    fi
done

Dieses Skript überprüft Testbefehle exit status und JEDE nicht leere Ausgabe an stderr.

Es druckt nicht die Standardausgabe der Testbefehle aus.

 1
Author: vstepaniuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-05-11 12:28:53

In einfachen Worten ist pdf eine besonders strukturierte Form von PostScript. qpdf ist wahrscheinlich ein gutes Werkzeug, um die Struktur der Datei zu testen, aber PostScript ist eine Programmiersprache. Das Überprüfen der Syntax des PostScript-Teils ist eine gute Idee, dies reicht jedoch nicht aus. Zur Laufzeit werden viele Steuerstrukturen übergeben, viele Funktionen aufgerufen und nicht alle übergebenen Werte sind immer gültig. Nur zur Laufzeit werden Sie sehen, ob das alles gut läuft und ob das Ergebnis ist, was Sie wollen. Außerdem sind nicht alle Schriftarten immer in einer PDF-Datei enthalten. Fehlende Schriftarten, die zur Laufzeit nicht verfügbar sind, können viele Probleme verursachen. Das Dienstprogramm pdffonts kann Ihnen helfen, solche Probleme zu analysieren, die hier auftreten können.

 1
Author: Claude Frantz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-05-11 13:56:45

Zusätzlich zu den oben genannten Tools verfügt die pdfcpu - Bibliothek/das Tool auch über PDF-Validierungsfunktionen:

pdfcpu validate whatever.pdf

Hinweis pdfcpu befindet sich zum Zeitpunkt des Schreibens (August 2020) noch in Alpha.

 1
Author: johan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-08-31 08:23:08