1 Punkte von GN⁺ 2024-07-03 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2024-07-03
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 würde gern wissen, wie man Claude 3.5 effektiv nutzt. Ich habe vor ein paar Tagen API-Zugang beantragt und würde mich über Empfehlungen für Tools freuen, mit denen man Claude lokal mit einem API-Key gut nutzen kann, statt nur über console.anthropic.com
    • Mich würde interessieren, wie viel Nacharbeit nötig war, um allein mit diesen Prompts so weit zu kommen. Ziemlich beeindruckend
    • Schwer, sich über einen 4 Tage alten Kommentar zu beschweren, aber ich verstehe nicht, worin der Unterschied zwischen den beiden PDFs besteht
      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

    • Delta Walker unterstützt jetzt offenbar auch Windows und Linux: https://www.deltawalker.com/download
    • „Draftable“ war hervorragend
    • Sollte man Unterschiede in PDFs nicht zuverlässig finden können, indem man die Seiten als Bilder exportiert und dann Pixel-Differenzen vergleicht?
  • 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, $1 und $2 sind die zu vergleichenden Dateinamen, und $TMP ist 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 imgcat sogar direkt im Terminal an. Außerdem kann man mit etwas wie convert -metric phash "$1" null: "$2" -compose Difference -layers composite -format '%[fx:mean]\n' info: auch perzeptuelle Hash-Differenzen aus ImageMagick bekommen
    Ich habe mir zunutze gemacht, dass man in git ein benutzerdefiniertes Diff-Tool konfigurieren kann, und in .gitconfig [diff "pdf"] command = ~/bin/git-diff-pdf eingetragen sowie in .gitattributes *.pdf binary diff=pdf gesetzt. ~/bin/git-diff-pdf führt sowohl einen Diff der pdftotext -layout-Ausgabe von poppler als auch pdf-compare-phash aus
    Damit git show dieses benutzerdefinierte Diff verwendet, muss man ein Argument wie git show --ext-diff hinzufügen, aber bei git diff wird es automatisch genutzt

    • Das sogar noch mit git-Attributen zu verknüpfen, ist noch einmal eine Stufe besser. Wirklich inspirierende Open-Source-Software — selbst nach 10 bis 20 Jahren mit ImageMagick überrascht mich immer noch, wie leistungsfähig es ist
  • Ich 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

    • Ich frage mich, ob ihr signierte Digests in die PDFs schreibt
    • Reicht es nicht aus, zur Validierung einfach die Quelle oder die Hashes der PDFs zu vergleichen?
  • 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/

    • Beyond Compare ist eines dieser Tools, auf das man nicht warten muss, bis der Arbeitgeber es bezahlt, sondern für das man gern selbst Geld ausgibt, weil es sich lohnt. Der Funktionsumfang ist für den Preis herausragend, es ist plattformübergreifend und die Lizenz ist ebenfalls sehr großzügig. Ein freies Open-Source-Vergleichstool, das mit BC mithalten kann, gibt es nicht
  • 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

    • Laut GitHub-Beschreibung kann man mit dem Argument --view in einer einfachen GUI zwei Dateien visuell vergleichen
      $ diff-pdf --view a.pdf b.pdf
      Es ö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
    • Es gibt auch eine Open-Source-/kostenlose Version davon, die ich regelmäßig nutze: https://www.qtrac.eu/diffpdf-foss.html
      Unter Fedora lässt sie sich als Paket diffpdf installieren. 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 Modus
    • Ich nutze dafür Beyond Compare 5
  • Im 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.m4 als 46 % Shell ein

    • Ähnliches habe ich auch in privaten Projekten gesehen. Die Analyse der Sprachanteile auf GitHub scheint kaputt zu sein. Es ist ein Python-Projekt, es gibt nur ein paar Jupyter-Notebooks und sehr viele Python-Dateien, daher müssten nach Zeilenzahl wohl 80 % Python-Dateien sein, aber GitHub betrachtet das Projekt als 50 % Jupyter