- diff-pdf ist ein Tool zum visuellen Vergleichen zweier PDF-Dateien und gibt bei der Standardausführung den Exit-Code 0 zurück, wenn es keine Unterschiede gibt, und 1, wenn Unterschiede vorhanden sind
- Mit der Option
--output-diff lässt sich ein PDF mit visuell hervorgehobenen Unterschieden erzeugen
- Die Option
--view öffnet eine einfache GUI-Vergleichsansicht, in der sich Seiten prüfen und vergrößern lassen; mit den Pfeiltasten plus Ctrl/Cmd kann die relative Position der beiden Seiten verschoben werden
- Für Windows, macOS, Fedora, CentOS 8 und openSUSE sind vorgefertigte Pakete oder Installationswege über Paketmanager verfügbar
- Das Repository wird as-is bereitgestellt und nicht aktiv weiterentwickelt; daher ist bei Feature-Anfragen oder Fixes kaum Unterstützung zu erwarten, Verbesserungen werden in Form von Pull Requests angenommen
Was diff-pdf macht
- diff-pdf nimmt zwei PDF-Dateien als Argumente entgegen und vergleicht sie visuell
- Die Standardausgabe besteht nur aus dem Exit-Code
0, wenn es keine Unterschiede gibt
1, wenn sich die beiden PDFs unterscheiden
- Um ein PDF mit hervorgehobenen Unterschieden zu erzeugen, wird die Option
--output-diff verwendet
$ diff-pdf --output-diff=diff.pdf a.pdf b.pdf
GUI-Vergleichsmodus
- Mit der Option
--view lassen sich die beiden Dateien in einer einfachen GUI vergleichen
$ diff-pdf --view a.pdf b.pdf
- Im GUI-Fenster können PDF-Seiten betrachtet und Details vergrößert werden
- Mit Ctrl+Pfeiltasten, unter macOS mit Cmd+Pfeiltasten, kann die relative Position der beiden Seiten verschoben werden
- Das ist nützlich, um Unterschiede zu prüfen, die nur auf eine veränderte Position zurückgehen
- Mit
Ctrl+< und Ctrl+> lassen sich jeweils das linke und das rechte Dokument einzeln anzeigen
- Unter macOS werden
Cmd+< und Cmd+> verwendet
- Mit
Ctrl+D wird zur Diff-Ansicht zurückgekehrt
- Die vollständige Liste der Optionen ist über
$ diff-pdf --help verfügbar
Installation der Binärdateien
- Eine vorgefertigte Version für Windows wird als ZIP-Archiv im latest release bereitgestellt
- Sie kann von jedem Ort aus gestartet werden, an den sie entpackt wurde
- Unter Windows erfolgt die Installation mit Chocolatey per folgendem Befehl
$ choco install diff-pdf
- Unter macOS erfolgt die Installation mit Homebrew per folgendem Befehl
$ brew install diff-pdf
- Unter macOS erfolgt die Installation mit MacPorts per folgendem Befehl
$ port install diff-pdf
- Unter Fedora und CentOS 8 erfolgt die Installation mit folgendem Befehl
$ sudo dnf install diff-pdf
Build aus dem Quellcode
- Das Build-System verwendet Automake, daher ist Unix oder eine Unix-ähnliche Umgebung wie Cygwin/MSYS erforderlich
- Das übliche Build-Verfahren sieht wie folgt aus
$ ./bootstrap
$ ./configure
$ make
$ make install
./bootstrap ist nur nötig, wenn aus dem Quellcode gebaut wird, der aus einem Versionsverwaltungssystem ausgecheckt wurde, also wenn configure und Makefile.in nicht vorhanden sind
- Folgende Bibliotheken werden benötigt
wxWidgets >= 3.0
Cairo >= 1.4
Poppler >= 0.10
Plattformabhängige Abhängigkeiten
- Unter CentOS werden die Development Tools sowie Pakete für wxGTK und Poppler GLib installiert
$ sudo yum groupinstall "Development Tools"
$ sudo yum install wxGTK wxGTK-devel poppler-glib poppler-glib-devel
- Unter Ubuntu 24.04 / Debian 12 oder neuer wird
libwxgtk3.2-dev verwendet
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.2-dev
- Unter älteren Ubuntu-/Debian-Versionen wird
libwxgtk3.0-gtk3-dev verwendet
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.0-gtk3-dev
- Unter macOS werden zuerst die Xcode Command Line Tools installiert, danach werden die Abhängigkeiten über Homebrew oder MacPorts verwaltet
$ xcode-select --install
$ brew install automake autoconf wxmac poppler cairo pkg-config
$ sudo port install automake autoconf wxWidgets-3.0 poppler cairo pkgconfig
- Unter Windows werden mehr Abhängigkeiten benötigt, da Bibliotheken, die von Cairo und Poppler verwendet werden, nicht standardmäßig mitgeliefert werden
- Dazu gehören fontconfig, freetype, glib, libpng, pixman, gettext, libiconv, libjpeg, zlib und weitere
Build unter Windows mit MSYS + MinGW
- Für den Windows-Build werden eine MSYS2-Umgebung und eine MinGW-Installation mit C++-Compiler benötigt
- Im MSYS2-MinGW-Shell wird in das Quellverzeichnis von diff-pdf gewechselt
- Zusätzliche MSYS-Komponenten werden installiert
$ pacman -Syu
$ pacman -S automake autoconf pkg-config make zip pactoys
$ pacboy -S gcc:p poppler:p wxWidgets:p
- Anschließend wird wie beim Unix-Build gebaut
$ ./bootstrap # nur nötig beim Build aus dem git-Repository
$ ./configure
$ make
- Um ein ZIP-Archiv inklusive der benötigten DLLs zu erstellen, wird folgender Befehl ausgeführt
$ make windows-dist
Installation und Wartungsstatus
- Unter Unix erfolgt die Installation wie üblich mit
make install
- Unter Windows ist keine separate Installation erforderlich; die Dateien können einfach an den gewünschten Ort kopiert werden
- Wenn nach dem obigen Verfahren gebaut wurde, befinden sich die benötigten Dateien im erzeugten ZIP-Archiv
- Das Repository wird as-is bereitgestellt und der Code wird nicht aktiv weiterentwickelt
- Für Verbesserungen wird empfohlen, Änderungen selbst vorzunehmen und als Pull Request einzureichen
- Unterstützung bei der Umsetzung von Feature-Anfragen oder Fixes ist kaum zu erwarten
1 Kommentare
Hacker-News-Kommentare
Ich habe Claude 3.5 Sonnet dazu gebracht, mit PDF.js einen schnellen Web-Prototypen zu erstellen, der PDFs auf ein Canvas rendert und visuelle Unterschiede pro Seite anzeigt
Die Prompts waren: zwei PDFs per Drag-and-Drop annehmen, die Seiten nebeneinander anzeigen und Unterschiede in einem dritten Bild hervorheben; außerdem alles noch einmal so umschreiben, dass überhaupt kein React verwendet wird
Ergebnis: https://tools.simonwillison.net/compare-pdfs
Funktioniert tatsächlich ziemlich gut. Screenshot: https://gist.github.com/simonw/9d7cbe02d448812f48070e7de13a5...
Ich konnte keinen tatsächlichen Unterschied finden, vielleicht halluziniere ich auch nur
In einem früheren Job musste ich die Ausgaben eines instabilen Publishing-Systems für den Produktivbetrieb validieren und habe damals Dutzende der verfügbaren PDF-Vergleichstools getestet. Das beste davon war Delta Walker: proprietäre kommerzielle Mac-only-Software, aber preislich vernünftig, präzise und auch mit langen, grafiklastigen PDFs gut zurechtkommend
Dieses diff-pdf-Tool habe ich ebenfalls bewertet; in irgendeiner Hinsicht war es unzureichend, aber das ist zu lange her, als dass ich mich an Details erinnern könnte. Die meisten übersahen Änderungen oder erzeugten False Positives, und bei diesem Tool war es besonders schade, weil es Open Source und damit leicht skriptbar war
Vielleicht hilft das hier jemandem im Zusammenhang damit. Mit ImageMagick kann man PDFs visuell vergleichen
magick compare -density "$DENSITY" -background white "$1[0]" "$2[0]" "$TMP"Dabei ist density 100,
$1und$2sind die zu vergleichenden Dateinamen, und$TMPist die Ausgabedatei. Für mehrere Seiten ist zusätzliche Arbeit nötig, deshalb nutze ich dieses Skript: https://gist.github.com/mbafford/7e6f3bef20fc220f68e467589bb...Dieses Skript zeigt die Unterschiede mit
imgcatsogar direkt im Terminal an. Außerdem kann man mit etwas wieconvert -metric phash "$1" null: "$2" -compose Difference -layers composite -format '%[fx:mean]\n' info:auch perzeptuelle Hash-Differenzen aus ImageMagick bekommenIch habe mir zunutze gemacht, dass man in git ein benutzerdefiniertes Diff-Tool konfigurieren kann, und in
.gitconfig[diff "pdf"] command = ~/bin/git-diff-pdfeingetragen sowie in.gitattributes*.pdf binary diff=pdfgesetzt.~/bin/git-diff-pdfführt sowohl einen Diff derpdftotext -layout-Ausgabe von poppler als auchpdf-compare-phashausDamit
git showdieses benutzerdefinierte Diff verwendet, muss man ein Argument wiegit show --ext-diffhinzufügen, aber beigit diffwird es automatisch genutztIch nutze das seit Jahren in einer CI-Pipeline, um eine geschäftskritische PDF-Erzeugungs-App im medizinischen Bereich zu pflegen. Die App wurde ungefähr 2010 begonnen, und der verwendete RSpec-Helper ist hier: https://gist.github.com/thbar/d1ce2afef68bf6089aeae8d9ddc05d...
Im Repository liegen Referenz-PDFs, und die Testsuite erzeugt sie neu, um zu prüfen, dass sich nichts geändert hat
Sehr hilfreich, um visuelle Änderungen oder Upgrades der PDF-Bibliothek zu prüfen
Das erinnert mich an ein Tool, das Bob Nystrom gebaut hat, um sich selbst bei der Arbeit an der gedruckten Ausgabe von Crafting Interpreters zu helfen: https://journal.stuffwithstuff.com/2020/04/05/crafting-craft...
Der ganze Artikel ist lesenswert, aber wenn man nur die relevante Stelle sehen will, sollte man nach „I wrote a Dart script that would take a PDF of the book“ suchen
Bei der Micro:bit Educational Foundation (microbit.org) haben wir dieses Tool genutzt, um Lücken in Hardware-Designtools zu schließen, und verwenden es zur Prüfung visueller Unterschiede in Schaltplänen und Gerber-Dateien während der Iteration von PCB-Designs
Dass wir letztlich dazu gekommen sind, es so zu verwenden, ist zwar etwas ungewöhnlich, aber wenn man bei kleinen Änderungen an anderen Teilen der Platine sicher sein will, dass sich das Layout der Funksektion überhaupt nicht verändert hat, dann ist ein visueller Diff genau das Richtige
Für das nächste Projekt würde ich allerdings gern einen stärker in EDA-Tools integrierten Ansatz ausprobieren. Falls jemand einen ähnlichen Weg gegangen ist, würde ich das gern wissen
Mit Beyond Compare geht das ebenfalls. Es ist nicht kostenlos, aber auch nicht besonders teuer: https://www.scootersoftware.com/
Dieses Tool gefällt mir besser: https://www.qtrac.eu/diffpdf.html
Statt Unterschiede übereinanderzulegen, ermöglicht es im GUI einen Seiten-an-Seiten-Vergleich
--viewin einer einfachen GUI zwei Dateien visuell vergleichen$ diff-pdf --view a.pdf b.pdfEs öffnet sich ein Fenster, in dem man die Seiten jeder Datei sehen und Details vergrößern kann. Mit Strg+Pfeil bzw. unter macOS Cmd+Pfeil lässt sich auch die relative Position der beiden Seiten verschieben, was nützlich ist, um Unterschiede zu finden, die nur durch eine Positionsverschiebung entstehen
Unter Fedora lässt sie sich als Paket
diffpdfinstallieren. Sie wird zwar nicht mehr gepflegt, funktioniert aber sehr gut und unterstützt eine GUI mit Seiten-an-Seiten-Ansicht, Drag-and-drop sowie sowohl Text- als auch visuellen ModusIm Team verwenden wir dieses Tool regelmäßig, wenn wir PDFs von Drittanbieterdiensten vergleichen, die sich nach Änderungen an unserem Code verändert haben könnten
Interessanterweise stuft GitHub dieses Projekt wegen der recht großen
wxwin.m4als 46 % Shell ein