1 points par GN⁺ 2024-07-03 | 1 commentaires | Partager sur WhatsApp
  • diff-pdf est un outil qui compare visuellement deux fichiers PDF et, lors de l’exécution par défaut, renvoie le code de sortie 0 s’il n’y a pas de différence et 1 s’il y en a une
  • L’option --output-diff permet de générer un PDF dans lequel les différences sont mises en évidence visuellement
  • L’option --view ouvre une interface GUI de comparaison simple permettant d’examiner les pages et de zoomer ; avec Ctrl/Cmd + flèches, il est possible de déplacer la position relative des deux pages
  • Des paquets précompilés ou des méthodes d’installation via gestionnaire de paquets sont proposés pour Windows, macOS, Fedora, CentOS 8 et openSUSE
  • Le dépôt est fourni tel quel et n’est pas activement développé ; il est donc difficile d’espérer une prise en charge des demandes de fonctionnalités ou des corrections, et les améliorations sont acceptées sous forme de pull requests

Ce que fait diff-pdf

  • diff-pdf prend deux fichiers PDF en arguments et les compare visuellement
  • La sortie par défaut se limite au code de sortie
    • 0 s’il n’y a pas de différence
    • 1 si les deux PDF sont différents
  • Pour produire un PDF mettant en évidence les différences, utilisez l’option --output-diff
$ diff-pdf --output-diff=diff.pdf a.pdf b.pdf

Mode de comparaison GUI

  • L’option --view permet de comparer les deux fichiers dans une GUI simple
$ diff-pdf --view a.pdf b.pdf
  • Dans la fenêtre GUI, vous pouvez afficher les pages du PDF et zoomer sur les détails
  • Avec Ctrl + flèches, ou Cmd + flèches sur macOS, vous pouvez déplacer la position relative des deux pages
    • Utile pour repérer les différences dues uniquement au positionnement
  • Ctrl+< et Ctrl+> permettent d’afficher respectivement le document de gauche et celui de droite
    • Sur macOS, utilisez Cmd+< et Cmd+>
  • Ctrl+D permet de revenir à la vue diff
  • La liste complète des options est disponible avec $ diff-pdf --help

Installation des binaires

  • Une version précompilée pour Windows est fournie sous forme d’archive ZIP dans la latest release
    • Elle peut être exécutée depuis n’importe quel emplacement après décompression
  • Sous Windows, si vous utilisez Chocolatey, installez-le avec la commande suivante
$ choco install diff-pdf
  • Sur macOS, si vous utilisez Homebrew, installez-le avec la commande suivante
$ brew install diff-pdf
  • Sur macOS, si vous utilisez MacPorts, installez-le avec la commande suivante
$ port install diff-pdf
  • Sur Fedora et CentOS 8, installez-le avec la commande suivante
$ sudo dnf install diff-pdf

Compilation depuis les sources

  • Le système de build utilise Automake ; un environnement Unix ou de type Unix comme Cygwin/MSYS est donc nécessaire
  • La procédure de build classique est la suivante
$ ./bootstrap
$ ./configure
$ make
$ make install
  • ./bootstrap n’est nécessaire que pour compiler des sources récupérées depuis le système de gestion de versions, c’est-à-dire lorsque configure et Makefile.in sont absents
  • Les bibliothèques requises sont les suivantes
    • wxWidgets >= 3.0
    • Cairo >= 1.4
    • Poppler >= 0.10

Dépendances selon la plateforme

  • Sur CentOS, installez les outils de développement ainsi que les paquets liés à wxGTK et Poppler GLib
$ sudo yum groupinstall "Development Tools"
$ sudo yum install wxGTK wxGTK-devel poppler-glib poppler-glib-devel
  • Sur Ubuntu 24.04 / Debian 12 et versions ultérieures, utilisez libwxgtk3.2-dev
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.2-dev
  • Sur les anciennes versions d’Ubuntu / Debian, utilisez libwxgtk3.0-gtk3-dev
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.0-gtk3-dev
  • Sur macOS, installez d’abord les Xcode Command Line Tools, puis gérez les dépendances avec Homebrew ou MacPorts
$ xcode-select --install
$ brew install automake autoconf wxmac poppler cairo pkg-config
$ sudo port install automake autoconf wxWidgets-3.0 poppler cairo pkgconfig
  • Sous Windows, davantage de dépendances sont nécessaires, car les bibliothèques utilisées par Cairo et Poppler ne sont pas fournies par défaut
    • Cela inclut fontconfig, freetype, glib, libpng, pixman, gettext, libiconv, libjpeg, zlib, etc.

Compiler sous Windows avec MSYS + MinGW

  • Pour compiler sous Windows, il faut un environnement MSYS2 et une installation MinGW avec un compilateur C++
  • Depuis le shell MSYS2 MinGW, placez-vous dans le répertoire source de diff-pdf
  • Installez les composants MSYS supplémentaires
$ pacman -Syu
$ pacman -S automake autoconf pkg-config make zip pactoys
$ pacboy -S gcc:p poppler:p wxWidgets:p
  • Ensuite, compilez de la même manière qu’avec la procédure Unix
$ ./bootstrap  # uniquement nécessaire lors d’un build depuis le dépôt git
$ ./configure
$ make
  • Pour créer une archive ZIP incluant les DLL nécessaires, exécutez la commande suivante
$ make windows-dist

Installation et état de la maintenance

  • Sous Unix, l’installation se fait avec le classique make install
  • Sous Windows, aucune installation distincte n’est nécessaire ; il suffit de copier les fichiers à l’emplacement souhaité
    • Si vous avez compilé en suivant la procédure ci-dessus, les fichiers nécessaires se trouvent dans l’archive ZIP générée
  • Le dépôt est fourni tel quel et le code n’est pas activement développé
    • Pour l’améliorer, il est recommandé d’apporter directement les modifications puis de soumettre une pull request
    • Il est difficile d’espérer un support pour l’implémentation de nouvelles fonctionnalités ou les corrections

1 commentaires

 
GN⁺ 2024-07-03
Avis Hacker News
  • J’ai demandé à Claude 3.5 Sonnet de créer un prototype web rapide utilisant PDF.js pour rendre des PDF dans un canvas et afficher les différences visuelles page par page.
    Les prompts étaient au nombre de deux : accepter deux PDF en glisser-déposer, afficher les pages côte à côte et mettre en évidence les différences dans une troisième image s’il y en a ; puis réécrire le tout sans utiliser React du tout.
    Résultat : https://tools.simonwillison.net/compare-pdfs
    En pratique, ça fonctionne plutôt bien. Capture d’écran : https://gist.github.com/simonw/9d7cbe02d448812f48070e7de13a5...

    • Je me demande comment utiliser Claude 3.5 efficacement. J’ai demandé l’accès à l’API il y a quelques jours ; à part console.anthropic.com, j’aimerais des recommandations d’outils permettant de bien exploiter Claude en local avec une clé API
    • Je me demande combien de travail supplémentaire il a fallu pour arriver à ça avec seulement ces prompts. C’est assez impressionnant
    • Difficile de contester un commentaire vieux de 4 jours, mais je ne vois pas quelle est la différence entre les deux PDF
      Je n’ai pas trouvé de vraie différence, et il est possible que ce soit moi qui hallucine
  • Dans un ancien poste, je devais valider la sortie d’un système de publication de production instable, et j’ai testé des dizaines d’outils de comparaison de PDF disponibles à l’époque. Le meilleur était Delta Walker : un logiciel propriétaire commercial uniquement sur Mac, mais à prix raisonnable, précis, et capable de bien gérer de longs PDF très graphiques.
    J’avais aussi évalué cet outil diff-pdf ; il était insuffisant sur certains points, mais c’était il y a trop longtemps pour que je me souvienne des détails. La plupart des outils rataient des changements ou produisaient des faux positifs, et le fait que celui-ci soit open source et donc facile à scripter rendait ça d’autant plus dommage

    • Delta Walker semble désormais prendre aussi en charge Windows et Linux : https://www.deltawalker.com/download
    • « Draftable » était excellent
    • Si l’on exporte les pages en images puis qu’on compare les différences de pixels, ne peut-on pas détecter précisément les différences entre PDF ?
  • Dans le même registre, cela peut être utile à quelqu’un : on peut comparer visuellement des PDF avec ImageMagick.
    magick compare -density "$DENSITY" -background white "$1[0]" "$2[0]" "$TMP"
    Ici, density vaut 100, $1 et $2 sont les noms des fichiers à comparer, et $TMP est le fichier de sortie. Il faut du travail supplémentaire pour gérer plusieurs pages, donc j’utilise ce script : https://gist.github.com/mbafford/7e6f3bef20fc220f68e467589bb...
    Ce script affiche aussi directement les différences dans le terminal avec imgcat. On peut également obtenir dans ImageMagick une différence de hachage perceptuel avec une commande du type convert -metric phash "$1" null: "$2" -compose Difference -layers composite -format '%[fx:mean]\n' info:.
    En tirant parti de la possibilité de configurer un outil de diff personnalisé dans git, j’ajoute [diff "pdf"] command = ~/bin/git-diff-pdf dans .gitconfig, et je configure *.pdf binary diff=pdf dans .gitattributes. ~/bin/git-diff-pdf exécute à la fois la différence de sortie pdftotext -layout de poppler et pdf-compare-phash.
    Pour utiliser ce diff personnalisé avec git show, il faut ajouter un argument comme git show --ext-diff, mais avec git diff il est utilisé automatiquement

    • Le fait d’avoir raccordé ça jusqu’aux attributs git, c’est le niveau au-dessus. Même après 10 à 20 ans d’utilisation d’ImageMagick, je reste surpris par sa puissance ; c’est un logiciel open source vraiment inspirant
  • Nous l’utilisons dans un pipeline CI pour maintenir une application de génération de PDF critique pour l’activité dans le domaine médical. L’application date d’environ 2010, et le helper RSpec utilisé est ici : https://gist.github.com/thbar/d1ce2afef68bf6089aeae8d9ddc05d...
    Le code contient un PDF de référence stocké dans git, et la suite de tests le régénère pour vérifier que rien n’a changé.
    C’est très utile pour auditer les changements visuels ou les mises à niveau de bibliothèques PDF

    • Je me demande si vous utilisez un digest signé à l’intérieur du PDF
    • Ne pourrait-on pas valider en comparant seulement la source du PDF ou son hash ?
  • Cela me rappelle l’outil que Bob Nystrom a créé pour l’aider lorsqu’il travaillait sur la version livre physique de Crafting Interpreters : https://journal.stuffwithstuff.com/2020/04/05/crafting-craft...
    L’article entier vaut la lecture, mais si vous ne voulez voir que la partie pertinente, cherchez « I wrote a Dart script that would take a PDF of the book »

  • À la Micro:bit Educational Foundation (microbit.org), nous utilisons cet outil pour combler les lacunes des outils de conception matérielle, afin de vérifier les différences visuelles entre les schémas et les fichiers Gerber au fil des itérations de conception de PCB.
    C’est certes un usage un peu particulier, mais si l’on veut être absolument sûr que l’implantation du circuit radio n’a pas changé du tout lorsqu’on apporte de petites modifications à d’autres parties de la carte, un diff visuel est exactement ce qu’il faut.
    Cela dit, pour le prochain projet, j’aimerais essayer une approche mieux intégrée aux outils EDA. Si quelqu’un a déjà suivi une voie similaire, cela m’intéresse

  • C’est aussi possible avec Beyond Compare. Ce n’est pas gratuit, mais ce n’est pas très cher non plus : https://www.scootersoftware.com/

    • Beyond Compare fait partie de ces outils qui valent leur prix et qu’on achète soi-même sans attendre que l’employeur le finance. Ses fonctionnalités sont en or au regard du prix, il est multiplateforme, et sa licence est très généreuse. Il n’existe pas d’outil de comparaison libre et open source qui rivalise avec BC
  • Je préfère cet outil : https://www.qtrac.eu/diffpdf.html
    Au lieu de superposer les différences, il propose une comparaison côte à côte dans une GUI

    • D’après la description GitHub, avec l’argument --view, on peut comparer visuellement deux fichiers dans une interface graphique simple
      $ diff-pdf --view a.pdf b.pdf
      Une fenêtre s’ouvre, permettant de voir les pages de chaque fichier et de zoomer sur les détails. Avec Ctrl+flèches, ou Cmd+flèches sous MacOS, on peut aussi déplacer la position relative des deux pages, ce qui est utile pour repérer les différences qui ne sont dues qu’à un déplacement
    • Il existe aussi une version open source/gratuite de celui-ci, que j’utilise régulièrement : https://www.qtrac.eu/diffpdf-foss.html
      Sous Fedora, on peut l’installer avec le paquet diffpdf. Il n’est plus maintenu, mais fonctionne très bien, et prend en charge une GUI en vue côte à côte, le glisser-déposer, ainsi que les modes texte et visuel
    • J’utilise BeyondCompare 5 pour cet usage
  • Dans notre équipe, nous utilisons régulièrement cet outil pour comparer des PDF de services tiers susceptibles d’avoir changé après des modifications de notre code

  • Fait intéressant, à cause du fichier wxwin.m4, assez volumineux, GitHub considère ce projet comme composé à 46 % de shell

    • J’ai vu quelque chose de similaire sur un projet personnel privé. L’analyse des proportions de langages de GitHub semble cassée. C’est un projet Python, avec seulement quelques notebooks Jupyter et beaucoup de fichiers Python ; en nombre de lignes de code, les fichiers Python représenteraient pourtant 80 %, mais GitHub voit le projet comme étant à 50 % du Jupyter