Validierung / Überprüfung der Integrität von PDF-Dateien

20784
Admiral

Gibt es ein Werkzeug, das ich in den PDF-Archiven (allen Verzeichnissen) ausführen kann, und schließlich werden die beschädigten / ungültigen PDFs aufgelistet / identifiziert?

Ich habe Hunderte von PDF-Dateien (in Bezug auf Dokumentation usw.) auf meinem Computer (Windows-Computer), und sehr oft erhalte ich Dutzende von PDFs per E-Mail. Es ist jetzt eine normale Routine, dass die empfangene oder gesendete PDF-Datei beschädigt ist. Dies führt manchmal zu ernsthaften Problemen, wenn die Quelldatei (z. B. Word-Datei oder Tex-Datei fehlt / nicht sofort verfügbar ist).

Das Überprüfen dieser Tausenden von PDFs ist in endlicher Zeit nicht möglich, also habe ich nach einem Tool gesucht, das ich einmal ausführen kann, und es durchsucht alle PDFs (in Verzeichnissen und Unterverzeichnissen), und schließlich bekomme ich eine Liste dieser Dateien, die ich verwenden sollte -erstellen. Bis jetzt scheint es kein solches Werkzeug zu geben.

8
Wenn Sie mit Linux unterwegs sind, versuchen Sie es mit pdfinfo. Werfen Sie einen Blick auf: http://superuser.com/questions/580887/check-if-pdf-files-are-corrupted-using-command-line-on-linux marcwho vor 10 Jahren 2
Beachten Sie auch [JHOVE - JSTOR / Harvard Object Validation Environment] (http://jhove.sourceforge.net/). Dan D. vor 10 Jahren 1
Vielleicht auch lose im Zusammenhang: [Wie finde und entferne ich beschädigte Bilder aus dem Verzeichnis?] (Https://superuser.com/q/562886/150988) und [Automatisches Scannen von Grafikdateien auf Beschädigungen] (https: // superuser) .com / q / 276154/150988). Scott vor 7 Jahren 0

4 Antworten auf die Frage

5
Mubeen Shahid

Mit PDFtk kann man leicht überprüfen, ob eine PDF-Datei gültig ist. Eine kostenlose GUI für PDFtk ist in PDF Labs verfügbar . Wenn Sie dieses Tool ausführen, können Sie beliebig viele PDF-Dateien aus mehreren Verzeichnissen laden (mithilfe der Schaltfläche "Dateien hinzufügen"). Anschließend werden die Seiten in diesen PDF-Dateien sehr schnell aufgerufen.

Wenn eine Datei unter den ausgewählten PDFs keine gültige PDF-Datei ist, zeigt dieses Dienstprogramm eine Meldung zum Fehler an und entfernt diese automatisch aus dem Auswahlfenster.

Daher können Sie mit diesem Verfahren viele Stunden mit PDFtk sparen. Wenn Sie über eine Multicore-CPU verfügen, können Sie außerdem mehrere Instanzen dieses Dienstprogramms ausführen und Hunderte von PDFs in jede Instanz einfügen.

Ich verwende diese Software seit einem Jahr und ist das praktischste PDF-Tool, das ich je verwendet habe.

Alternativ können Sie das Tool (pdfinfo.exe) verwenden, das unter dem von marcwho genannten Link verfügbar ist. Sie können `cd` in` FolderContainingPDFs` `eingeben und den folgenden Befehl in der Windows-Shell ausführen. Die ungültige PDF-Datei wird in einer Protokolldatei markiert:` FORFILES / S / M * .pdf / C "cmd / c echo. & Echo @path @fname & D: \ XPDF_3.04 \ bin64 \ pdfinfo.exe @file" 1> text.txt 2> & 1 " Mubeen Shahid vor 10 Jahren 2
4
n0nuf

Ich habe "pdfinfo.exe" aus dem Paket xpdfbin-win und cpdf.exe verwendet, um PDF-Dateien auf Beschädigungen zu prüfen. Ich wollte jedoch keine Binärdatei verwenden, wenn dies nicht erforderlich war.

Ich habe gelesen, dass neuere PDF-Formate am Ende einen lesbaren XML-Datenkatalog haben, also öffnete ich die PDF-Datei mit regulären Windows-Dateien NOTEPAD.exe und rollte an den unlesbaren Daten vorbei bis zum Ende und sah mehrere lesbare Schlüssel. Ich brauchte nur einen Schlüssel, entschied mich aber für CreationDate und ModDate.

Das folgende Powershell-Skript (PS) überprüft ALLE PDF-Dateien im aktuellen Verzeichnis und gibt den Status der einzelnen Dateien in eine Textdatei (! RESULTS.log) aus. Es dauerte ungefähr 2 Minuten, um dies gegen 35.000 PDF-Dateien auszuführen. Ich habe versucht, Kommentare für diejenigen hinzuzufügen, die neu bei PS sind. Hoffe, das erspart jemandem etwas Zeit. Es gibt wahrscheinlich einen besseren Weg, um dies zu tun, aber dies funktioniert einwandfrei für meine Zwecke und behandelt Fehler fehlerlos. Möglicherweise müssen Sie am Anfang Folgendes definieren: $ ErrorActionPreference = "SilentlyContinue", wenn Fehler auf dem Bildschirm angezeigt werden.

Kopieren Sie Folgendes in eine Textdatei und benennen Sie sie entsprechend (Beispiel: CheckPDF.ps1), oder öffnen Sie PS und navigieren Sie zu dem Verzeichnis, in dem sich die PDF-Dateien befinden, um sie zu überprüfen und in die Konsole einzufügen.

# # PowerShell v4.0 # # Get all PDF files in current directory # $items = Get-ChildItem | Where-Object {$_.Extension -eq ".pdf"}  $logFile = "!RESULTS.log" $badCounter = 0 $goodCounter = 0 $msg = "`n`nProcessing " + $items.count + " files... " Write-Host -nonewline -foregroundcolor Yellow $msg foreach ($item in $items) { # # Suppress error messages # trap { Write-Output "Error trapped"; continue; }  # # Read raw PDF data # $pdfText = Get-Content $item -raw  # # Find string (near end of PDF file), if BAD file, ptr will be undefined or 0 # $ptr1 = $pdfText.IndexOf("CreationDate") $ptr2 = $pdfText.IndexOf("ModDate")  # # Grab raw dates from file - will ERR if ptr is 0 # try { $cDate = $pdfText.SubString($ptr1, 37); $mDate = $pdfText.SubString($ptr2, 31); }  # # Append filename and bad status to logfile and increment a counter # catch block is also where you would rename, move, or delete bad files. # catch { "*** $item is Broken ***" >> $logFile; $badCounter += 1; continue; }  # # Append filename and good status to logfile # Write-Output "$item - OK" -EA "Stop" >> $logFile  # # Increment a counter # $goodCounter += 1 } # # Calculate total # $totalCounter = $badCounter + $goodCounter  # # Append 3 blank lines to end of logfile # 1..3 | %{ Write-Output "" >> $logFile }  # # Append statistics to end of logfile # Write-Output "Total: $totalCounter / BAD: $badCounter / GOOD: $goodCounter" >> $logFile Write-Output "DONE!`n`n" 
3
wp78de

Nach den Fußstapfen von @n0nuf habe ich ein Batch-Skript geschrieben, um alle PDFs in einem bestimmten Ordner mit pdfinfo zu überprüfen und durch cpdf zu pushen, falls sie fehlerhaft sind, um sie zu reparieren:

@ECHO OFF FOR %%f in (*.PDF) DO ( echo %%f pdfinfo "%%f" 2>&1 | findstr /I "error" >nul 2>&1 if not errorlevel 1 ( echo "bad -> try to fix" @cpdf -i %%f -o %%f_.pdf 2>NUL mv %%f .\\bak\\%%f ) else ( REM echo good  ) ) @ECHO ON 

Oder das gleiche wie das Bash-Skript:

for file in $(find . -iname "*.pdf") do echo "$file" pdfinfo "$file" 2>&1 | grep -i 'error' &> /dev/null if [ $? == 0 ]; then echo "broken -> try to fix" cpdf -i "$file" -o "$file"_.pdf fi done 

Defekte PDFs werden in einen Unterordner \ bak verschoben und die neu erstellten PDFs erhalten das Suffix _.pdf (was nicht perfekt ist, aber gut genug für mich). HINWEIS: Eine neu erstellte PDF-Datei enthält weniger Fehler und sollte mit einem normalen PDF-Viewer angezeigt werden. Dies bedeutet jedoch nicht, dass Sie Ihren gesamten Inhalt zurückerhalten. Nicht wiederherstellbarer Inhalt führt zu leeren Seiten.

Ich habe es auch mit JHOVE (Open Source-Dateiformatidentifikation, -validierung und -charakterisierungstool) versucht, wie von @kraftydevil hier vorgeschlagen: Prüfen Sie, ob PDF-Dateien mithilfe der Befehlszeile unter Linux beschädigt sind, und bestätigen Sie, dass dies ebenfalls ein gültiger Ansatz ist. (Zuerst hatte ich weniger Erfolg. Dann bemerkte ich jedoch, dass ich die Ausgabe von JHOVE nicht korrekt verarbeitet hatte.)

Um beide Ansätze zu testen, habe ich zufällige Teile aus einem PDF-Dokument mit einem Texteditor gelöscht und geändert (Streams wurden entfernt, so dass Seiten in meinem PDF-Viewer nicht gerendert wurden, PDF-Tags geändert wurden und einige Bits verschoben wurden). Das Ergebnis ist: Sowohl pdfinfo als auch JHOVE können beschädigte Dateien richtig erkennen (JHOVE war in manchen Fällen sogar empfindlicher).

Und hier ist das entsprechende Skript für JHOVE:

@ECHO OFF FOR %%f in (*.PDF) DO ( echo %%f "C:\Program Files (x86)\JHOVE\jhove.bat" -m pdf-hul %%f | findstr /C:"Well-Formed and valid" >nul 2>&1 if not errorlevel 1 ( echo good ) else ( echo "bad -> try to fix" @cpdf -i %%f -o %%f_.pdf 2>NUL REM mv %%f .\\bak\\%%f ) ) @ECHO ON 
Zu Ihrer Information [Schleifen über die Ausgabe von find ist eine schlechte Praxis] (https://unix.stackexchange.com/q/321697/23408) Scott vor 7 Jahren 1
Vielen Dank @Scott. Die Windows-Batch-FOR-Schleife ist viel sicherer, denke ich. Ich habe die Bash-Skript-Implementierung nur als Beispiel gegeben. wp78de vor 7 Jahren 0
Denn auch für Linux scheint der Weg zu gehen: https://stackoverflow.com/a/9612232/8291949 wp78de vor 7 Jahren 0
0
Don Rota

Es besteht ein Unterschied zwischen dem Dateityp "ungültiges PDF" und einer beschädigten PDF-Datei. Ich habe gerade eine beschädigte PDF-Datei durch pdftk laufen lassen und sie hat sie nicht erkannt.

Bisher erkennt pdf2ps (ein Ghostscript-Tool) beschädigte Dateien am besten. Ich bin mir jedoch nicht sicher, ob auf Macs erstellte PDF-Dateien korrekt bewertet werden.

Bitte lesen Sie [Antwort] bevor Sie antworten. Sie beantworten die Frage nicht. user 99572 is fine vor 7 Jahren 0