PDF à comparer sur la ligne de commande Linux

Je cherche un outil de ligne de commande Linux pour comparer deux fichiers PDF et enregistrer les différences dans un fichier PDF. L’outil devrait créer des fichiers pdf en mode différé. Les fichiers PDF sont des plans de construction, de sorte que pure text-compare ne fonctionne pas.

Quelque chose comme:

 file1.pdf file2.pdf -o diff-out.pdf 

La plupart des outils que j’ai trouvés convertissent les PDF en images et les comparent, mais uniquement avec une interface graphique.

Toute autre solution est également la bienvenue.

    J’ai écrit mon propre script qui fait quelque chose de similaire à ce que vous demandez. Le script utilise 4 outils pour atteindre son objective:

    1. La commande de compare d’ImageMagick
    2. l’utilitaire pdftk (si vous avez des PDF multipages)
    3. Ghostscript (facultatif)
    4. md5sum (optionnel)

    Il devrait être assez facile de le porter dans un fichier de commandes .bat pour DOS / Windows.

    Mais tout d’abord, veuillez noter que cela ne fonctionne bien que pour les fichiers PDF qui ont la même taille de page / support. La comparaison est effectuée pixel par pixel entre les deux fichiers PDF d’entrée. Le fichier résultant est une image montrant le “diff” comme ceci:

    • Chaque pixel qui rest inchangé devient blanc.
    • Chaque pixel modifié est peint en rouge.

    Cette image diff est enregistrée en tant que nouveau fichier PDF pour le rendre plus accessible sur différentes plates-formes de système d’exploitation.

    Je l’utilise par exemple pour découvrir les différences d’affichage de page minimales lorsque la substitution de police dans le traitement PDF entre en jeu.

    Il se peut qu’il n’y ait pas de différence visible entre vos fichiers PDF, bien qu’ils soient différents en termes de hachage MD5 et / ou de taille de fichier. Dans ce cas, la page PDF de sortie “diff” deviendrait tout blanc. Vous pouvez découvrir automatiquement cette condition, il vous suffit donc d’étudier visuellement les fichiers PDF non blancs en les supprimant automatiquement.

    Voici les blocs de construction:

    pdftk

    Utilisez cet utilitaire de ligne de commande pour fractionner des fichiers PDF de plusieurs pages en plusieurs fichiers PDF de page unique:

     pdftk file_1.pdf burst output somewhere/file_1---page_%03d.pdf pdftk file_2.pdf burst output somewhere/file_2---page_%03d.pdf 

    Si vous comparez uniquement des PDF d’une page, ce bloc est facultatif. Puisque vous parlez de “plans de construction”, c’est probablement le cas.

    comparer

    Utilisez cet utilitaire de ligne de commande d’ImageMagick pour créer une page PDF “diff” pour chacune des pages:

     compare \ -verbose \ -debug coder \ -log "%u %m:%l %e" \ somewhere/file_1---page_001.pdf \ somewhere/file_2---page_001.pdf \ -compose src \ somewhereelse/file_1--file_2---diff_page_001.pdf 

    Ghostscript

    En raison de l’insertion automatique de métadonnées (telles que la date et l’heure actuelles), la sortie PDF ne fonctionne pas correctement pour les comparaisons de fichiers basées sur MD5hash.

    Si vous souhaitez découvrir automatiquement tous les cas où le PDF diff est constitué d’une page purement blanche, vous devez convertir la page PDF en un format bitmap sans bmp256 l’aide du bmp256 sortie bmp256 . Vous pouvez faire ça comme ça:

    Tout d’abord, découvrez le format de page de votre PDF. Encore une fois, ce petit identify utilitaire fait partie de toute installation d’ImageMagick:

      identify \ -format "%[fx:(w)]x%[fx:(h)]" \ somewhereelse/file_1--file_2---diff_page_001.pdf 

    Vous pouvez stocker cette valeur dans une variable d’environnement comme celle-ci:

      export my_size=$(identify \ -format "%[fx:(w)]x%[fx:(h)]" \ somewhereelse/file_1--file_2---diff_page_001.pdf) 

    Maintenant, Ghostscript entre en jeu, en utilisant une ligne de commande qui inclut la taille de page découverte ci-dessus telle qu’elle est stockée dans la variable:

      gs \ -o somewhereelse/file_1--file_2---diff_page_001.ppm \ -sDEVICE=ppmraw \ -r72 \ -g${my_size} \ somewhereelse/file_1--file_2---diff_page_001.pdf 

    Cela vous donne un PPM (Portable PixMap) avec une résolution de 72 dpi à partir de la page PDF d’origine. 72 dpi sont généralement assez bons pour ce que nous voulons … Ensuite, créez une page PPM purement blanche avec la même taille de page:

      gs \ -o somewhereelse/file_1--file_2---whitepage_001.ppm \ -sDEVICE=ppmraw \ -r72 \ -g${my_size} \ -c "showpage" 

    La partie -c "showpage" est une commande PostScript qui indique à Ghostscript d’émettre une page vide uniquement.

    Somme MD5

    Utilisez le hachage MD5 pour comparer automatiquement le PPM d’origine avec le PPM de la page blanche. Dans le cas où ils sont identiques, vous pouvez supposer que les PDF ne présentent aucune différence et renommer ou supprimer le diff-PDF:

      MD5_1=$(md5sum somewhereelse/file_1--file_2---diff_page_001.ppm | awk '{print $1}') MD5_2=$(md5sum somewhereelse/file_1--file_2---whitepage_001.ppm | awk '{print $1}') if [ "x${MD5_1}" == "x${MD5_2}" ]; then mv \ somewhereelse/file_1--file_2---diff_page_001.pdf \ somewhereelse/file_1--file_2---NODIFFERENCE_page_001.pdf # rename all-white PDF rm \ somewhereelse/file_1--file_2---*_page_001.ppm # delete both PPMs fi 

    Cela vous évite d’avoir à inspecter visuellement les “diff PDF” qui ne présentent aucune différence.

    Voici un hack pour le faire.

     pdftotext file1.pdf pdftotext file2.pdf diff file1.txt file2.txt 

    Fait en 2 lignes avec (le tout-puissant) imagemagick et pdftk:

     compare -verbose -debug coder $PDF_1 $PDF_2 -compose src $OUT_FILE.tmp pdftk $OUT_FILE.tmp background $PDF_1 output $OUT_FILE 

    Les options -verbose et -debug sont facultatives.

    • compare crée un PDF avec le diff sous forme de pixels rouges.
    • pdftk fusionne le diff-pdf avec l’arrière-plan PDF_1