Valider / vérifier l'intégrité des fichiers PDF


11

Existe-t-il un outil que je peux exécuter sur les archives PDF (tous les répertoires) et enfin il répertorie / identifie les PDF corrompus / invalides?

J'ai des centaines de fichiers PDF (liés à la documentation, etc.) sur mon ordinateur (machine Windows), et très souvent je reçois / dois envoyer des dizaines de PDF par e-mail. C'est maintenant une routine normale que le PDF que je reçois ou envoie est corrompu. Cela crée parfois de graves problèmes lorsque le fichier source (par exemple, le fichier Word ou le fichier Tex est manquant / n'est pas disponible instantanément).

La vérification de ces milliers de PDF n'est pas possible en temps fini, j'ai donc cherché un outil que je peux exécuter une fois et il scanne tous les PDF (dans les répertoires et sous-répertoires), et enfin j'obtiens une liste de ces fichiers que je devrais re -créer. Jusqu'à présent, il semble qu'il n'y ait pas un tel outil.


2
Si vous êtes sous Linux, essayez pdfinfo. Jetez un œil à: superuser.com/questions/580887/…
marcwho


Réponses:


6

Il est assez facile de vérifier si un fichier PDF est valide, en utilisant PDFtk. Une interface graphique gratuite pour PDFtk est disponible auprès de PDF Labs . Lorsque vous exécutez cet outil, vous pouvez charger autant de fichiers PDF que vous le souhaitez, à partir de plusieurs répertoires (en utilisant le bouton Ajouter des fichiers), puis il commencera à accéder aux pages de ces fichiers PDF, très rapidement.

Si un fichier parmi les PDF sélectionnés n'est pas un PDF valide, cet utilitaire affichera un message sur l'erreur et le supprimera automatiquement de la fenêtre de sélection.

Par conséquent, vous pouvez économiser de nombreuses heures en utilisant cette procédure avec PDFtk. De plus, si vous disposez d'un processeur multicœur, vous pouvez exécuter plusieurs instances de cet utilitaire et ajouter des centaines de PDF dans chaque instance.

J'utilise ce logiciel depuis 1 an et c'est l'outil PDF le plus pratique que j'aie jamais utilisé.


2
Alternativement, en utilisant l'outil (pdfinfo.exe) disponible à partir du lien mentionné par marcwho, vous pouvez cddans FolderContainingPDFset exécuter la commande suivante dans le shell Windows, et il marquera le fichier PDF non valide dans un fichier journal: 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

J'ai utilisé "pdfinfo.exe" du package xpdfbin-win et cpdf.exe pour vérifier la corruption des fichiers PDF, mais je ne voulais pas impliquer un binaire s'il n'était pas nécessaire.

J'ai lu que les nouveaux formats PDF ont un catalogue de données xml lisible à la fin, j'ai donc ouvert le PDF avec les fenêtres normales NOTEPAD.exe et j'ai fait défiler les données illisibles jusqu'à la fin et j'ai vu plusieurs clés lisibles. Je n'avais besoin que d'une clé, mais j'ai choisi d'utiliser à la fois CreationDate et ModDate.

Le script Powershell (PS) suivant vérifiera TOUS les fichiers PDF dans le répertoire actuel et affichera l'état de chacun dans un fichier texte (! RESULTS.log). Il a fallu environ 2 minutes pour exécuter cela contre 35 000 fichiers PDF. J'ai essayé d'ajouter des commentaires pour ceux qui sont nouveaux sur PS. J'espère que cela fait gagner du temps à quelqu'un. Il y a probablement une meilleure façon de le faire, mais cela fonctionne parfaitement pour mes besoins et gère les erreurs en silence. Vous devrez peut-être définir les éléments suivants au début: $ ErrorActionPreference = "SilentlyContinue" si vous voyez des erreurs à l'écran.

Copiez ce qui suit dans un fichier texte et nommez-le de manière appropriée (ex: CheckPDF.ps1) ou ouvrez PS et accédez au répertoire contenant les fichiers PDF pour le vérifier et le coller dans la console.

#
# 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

En suivant les traces de @ n0nuf, j'ai écrit un script batch pour vérifier tous les PDF dans un dossier spécifique avec pdfinfo et le pousser à travers cpdf s'il est cassé pour tenter de les réparer:

@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

Ou le même que le script bash:

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

Les PDF cassés seront déplacés vers un sous-dossier \ bak et les PDF recréés obtiendront le suffixe _.pdf (ce qui n'est pas parfait, mais assez bon pour moi). REMARQUE: un PDF recréé contient moins d'erreurs et doit être visible avec une visionneuse PDF standard. Mais cela ne signifie pas que vous récupérez tout votre contenu. Le contenu non récupérable conduit à des pages vides.

J'ai également essayé la même chose avec JHOVE (outil d'identification, de validation et de caractérisation de format de fichier open source) comme suggéré par @kraftydevil ici: Vérifiez si les fichiers PDF sont corrompus en utilisant la ligne de commande sous Linux et pouvez maintenant confirmer que c'est également une approche valide. (D'abord, j'ai eu moins de succès. Mais ensuite j'ai remarqué que je n'avais pas géré correctement la sortie de JHOVE.)

Pour tester les deux approches, j'ai supprimé et modifié des parties aléatoires d'un PDF avec un éditeur de texte (les flux ont été supprimés, les pages n'ont donc pas pu être affichées dans ma visionneuse PDF, les balises PDF modifiées et certains bits décalés). Le résultat est: pdfinfo et JHOVE sont capables de repérer correctement les fichiers endommagés (JHOVE était encore plus sensible dans certains cas).

Et voici le script équivalent pour 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


Merci @Scott. La boucle FOR Windows batch est beaucoup plus économisée, je suppose. J'ai donné l'implémentation du script bash à titre d'exemple.
wp78de

Pour semble être la voie à suivre pour Linux aussi: stackoverflow.com/a/9612232/8291949
wp78de
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.