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

11

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

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

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

Admiral
quelle
2
Wenn Sie unter Linux sind, versuchen Sie es mit pdfinfo. Schauen Sie sich auf: superuser.com/questions/580887/...
marcwho
1
Berücksichtigen Sie auch die JHOVE - JSTOR / Harvard-Objektvalidierungsumgebung .
Dan D.

Antworten:

6

Mit PDFtk können Sie ganz einfach überprüfen, ob eine PDF-Datei gültig ist. Eine kostenlose GUI für PDFtk ist bei PDF Labs erhältlich . Wenn Sie dieses Tool ausführen, können Sie beliebig viele PDF-Dateien aus mehreren Verzeichnissen laden (über die Schaltfläche Dateien hinzufügen). Anschließend wird sehr schnell auf die Seiten in diesen PDF-Dateien zugegriffen.

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

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

Ich benutze diese Software seit 1 Jahr und sie ist das praktischste PDF-Tool, das ich je verwendet habe.

Mubeen Shahid
quelle
2
Alternativ mit dem Werkzeug (pdfinfo.exe) , das von der Verbindung von marcwho erwähnt, können Sie cdin FolderContainingPDFsund folgenden Befehl in Windows - Shell ausgeführt werden , und es wird die ungültige PDF - Datei in einer Log - Datei markieren: 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
4

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

Ich habe gelesen, dass neuere PDF-Formate am Ende einen lesbaren XML-Datenkatalog haben. Deshalb habe ich die PDF-Datei mit dem regulären Windows NOTEPAD.exe geöffnet und bis zum Ende an den unlesbaren Daten vorbei gescrollt und mehrere lesbare Schlüssel gesehen. Ich brauchte nur einen Schlüssel, entschied mich jedoch für CreationDate und ModDate.

Das folgende Powershell (PS) -Skript ü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 für 35.000 PDF-Dateien auszuführen. Ich habe versucht, Kommentare für diejenigen hinzuzufügen, die neu bei PS sind. Hoffe das spart jemandem etwas Zeit. Es gibt wahrscheinlich einen besseren Weg, dies zu tun, aber dies funktioniert für meine Zwecke einwandfrei und behandelt Fehler stillschweigend. Möglicherweise müssen Sie am Anfang Folgendes definieren: $ ErrorActionPreference = "SilentlyContinue", wenn auf dem Bildschirm Fehler angezeigt werden.

Kopieren Sie Folgendes in eine Textdatei und benennen Sie es entsprechend (z. B. CheckPDF.ps1) oder öffnen Sie PS und navigieren Sie zu dem Verzeichnis mit den PDF-Dateien, um es 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"
n0nuf
quelle
3

Auf den Spuren von @ n0nuf habe ich ein Batch-Skript geschrieben, um alle PDFs in einem bestimmten Ordner mit pdfinfo zu überprüfen und es durch cpdf zu verschieben, wenn es beschädigt ist, um sie zu beheben:

@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 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 für mich gut genug). HINWEIS: Eine neu erstellte PDF-Datei enthält weniger Fehler und sollte mit einem normalen PDF-Viewer angezeigt werden können. Dies bedeutet jedoch nicht, dass Sie alle Ihre Inhalte zurückerhalten. Nicht wiederherstellbarer Inhalt führt zu leeren Seiten.

Ich habe dasselbe auch mit JHOVE (Open Source-Format zur Identifizierung, Validierung und Charakterisierung von Dateiformaten) versucht, wie von @kraftydevil hier vorgeschlagen: Überprüfen Sie, ob PDF-Dateien mithilfe der Befehlszeile unter Linux beschädigt sind, und können Sie jetzt bestätigen, dass dies auch ein gültiger Ansatz ist. (Zuerst hatte ich weniger Erfolg. Aber dann bemerkte ich, dass ich die Ausgabe von JHOVE nicht richtig gehandhabt hatte.)

Um beide Ansätze zu testen, habe ich zufällige Teile aus einem PDF mit einem Texteditor gelöscht und geändert (Streams wurden entfernt, sodass Seiten in meinem PDF-Viewer nicht gerendert werden konnten, PDF-Tags geändert und einige Bits verschoben). Das Ergebnis ist: Sowohl pdfinfo als auch JHOVE können beschädigte Dateien korrekt erkennen (JHOVE war in einigen Fällen sogar noch 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
wp78de
quelle
Vielen Dank, dass Sie @Scott. Die Windows-Batch-FOR-Schleife ist viel sicherer, denke ich. Ich habe die Implementierung des Bash-Skripts nur als Beispiel angegeben.
wp78de
Denn scheint auch für Linux der richtige
wp78de