- diff-pdf é uma ferramenta para comparar visualmente dois arquivos PDF; na execução padrão, retorna código de saída 0 se não houver diferenças e 1 se houver
- Com a opção
--output-diff, é possível gerar um PDF com as diferenças destacadas visualmente
- A opção
--view abre uma tela simples de comparação em GUI para verificar páginas e ampliar detalhes; com Ctrl/Cmd + setas, é possível mover a posição relativa das duas páginas
- Há pacotes pré-compilados ou caminhos de instalação via gerenciadores de pacotes para Windows, macOS, Fedora, CentOS 8 e openSUSE
- O repositório é fornecido as-is e não está em desenvolvimento ativo, então é difícil esperar suporte para solicitações de recursos ou correções; melhorias são aceitas na forma de pull requests
O que o diff-pdf faz
- diff-pdf recebe dois arquivos PDF como argumentos e os compara visualmente
- A saída padrão é apenas o código de saída
0 se não houver diferenças
1 se os dois PDFs forem diferentes
- Para criar um PDF com as diferenças destacadas, use a opção
--output-diff
$ diff-pdf --output-diff=diff.pdf a.pdf b.pdf
Modo de comparação em GUI
- Com a opção
--view, é possível comparar os dois arquivos em uma GUI simples
$ diff-pdf --view a.pdf b.pdf
- Na janela da GUI, é possível visualizar as páginas do PDF e ampliar os detalhes
- Com as setas Ctrl, ou setas Cmd no macOS, é possível mover a posição relativa das duas páginas
- Útil para verificar diferenças causadas apenas por mudança de posição
- Com
Ctrl+< e Ctrl+>, é possível ver o documento da esquerda e o da direita, respectivamente
- No macOS, use
Cmd+< e Cmd+>
- Com
Ctrl+D, é possível voltar à visualização de diff
- A lista completa de opções pode ser consultada em
$ diff-pdf --help
Instalação de binários
- A versão pré-compilada para Windows é fornecida como um arquivo ZIP em latest release
- Pode ser executada de qualquer local após descompactar
- No Windows, se você usa Chocolatey, instale com o seguinte comando
$ choco install diff-pdf
- No macOS, se você usa Homebrew, instale com o seguinte comando
$ brew install diff-pdf
- No macOS, se você usa MacPorts, instale com o seguinte comando
$ port install diff-pdf
- No Fedora e no CentOS 8, instale com o seguinte comando
$ sudo dnf install diff-pdf
Build a partir do código-fonte
- O sistema de build usa Automake, portanto é necessário um ambiente Unix ou semelhante a Unix, como Cygwin/MSYS
- O procedimento geral de build é o seguinte
$ ./bootstrap
$ ./configure
$ make
$ make install
./bootstrap só é necessário ao fazer build de fontes obtidos por checkout do sistema de controle de versão, ou seja, quando configure e Makefile.in não existem
- As bibliotecas necessárias são as seguintes
wxWidgets >= 3.0
Cairo >= 1.4
Poppler >= 0.10
Dependências por plataforma
- No CentOS, instale as ferramentas de desenvolvimento e os pacotes relacionados a wxGTK e Poppler GLib
$ sudo yum groupinstall "Development Tools"
$ sudo yum install wxGTK wxGTK-devel poppler-glib poppler-glib-devel
- No Ubuntu 24.04 / Debian 12 ou superior, use
libwxgtk3.2-dev
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.2-dev
- Em versões anteriores do Ubuntu / Debian, use
libwxgtk3.0-gtk3-dev
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.0-gtk3-dev
- No macOS, instale o Xcode Command Line Tools e depois gerencie as dependências com 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
- No Windows, como as bibliotecas usadas por Cairo e Poppler não vêm incluídas por padrão, são necessárias mais dependências
- Incluem fontconfig, freetype, glib, libpng, pixman, gettext, libiconv, libjpeg, zlib etc.
Build no Windows com MSYS + MinGW
- O build para Windows requer o ambiente MSYS2 e uma instalação do MinGW com compilador C++
- No shell MSYS2 MinGW, vá para o diretório do código-fonte do diff-pdf
- Instale componentes adicionais do MSYS
$ pacman -Syu
$ pacman -S automake autoconf pkg-config make zip pactoys
$ pacboy -S gcc:p poppler:p wxWidgets:p
- Depois disso, faça o build da mesma forma que no procedimento de build Unix
$ ./bootstrap # necessário apenas ao fazer build a partir do repositório git
$ ./configure
$ make
- Para criar um arquivo ZIP incluindo as DLLs necessárias, execute o seguinte comando
$ make windows-dist
Instalação e status de manutenção
- No Unix, instale com o
make install usual
- No Windows, não é necessária instalação separada; basta copiar os arquivos para o local desejado
- Se você fez o build pelo procedimento acima, os arquivos necessários estarão no arquivo ZIP gerado
- O repositório é fornecido as-is e o código não está em desenvolvimento ativo
- Para melhorias, recomenda-se fazer as alterações diretamente e enviar um pull request
- É difícil esperar suporte como implementação de solicitações de recursos ou correções
1 comentários
Comentários no Hacker News
Pedi ao Claude 3.5 Sonnet para criar um protótipo web rápido usando PDF.js para renderizar PDFs em canvas e mostrar diferenças visuais página a página
Os prompts foram dois: aceitar dois PDFs via arrastar e soltar, mostrar as páginas lado a lado e, se houvesse diferenças, destacá-las em uma terceira imagem; e depois reescrever sem usar React de jeito nenhum
Resultado: https://tools.simonwillison.net/compare-pdfs
Na prática funciona bem. Captura de tela: https://gist.github.com/simonw/9d7cbe02d448812f48070e7de13a5...
Não consegui encontrar nenhuma diferença real e talvez eu esteja alucinando
Em um emprego anterior, eu precisava validar a saída de um sistema de publicação de produção instável, então testei dezenas de ferramentas de comparação de PDF disponíveis na época. A melhor delas foi o Delta Walker; era um software proprietário, comercial e exclusivo para Mac, mas tinha preço razoável, era preciso e lidava bem com PDFs longos com muitos gráficos
Também avaliei esta ferramenta diff-pdf e ela deixava a desejar em alguns aspectos, mas faz tanto tempo que não lembro os detalhes. A maioria das ferramentas deixava passar alterações ou gerava falsos positivos, e esta era open source e fácil de automatizar por script, então foi ainda mais uma pena
Relacionado a isso, pode ser útil para alguém. É possível fazer comparação visual de PDFs com ImageMagick
magick compare -density "$DENSITY" -background white "$1[0]" "$2[0]" "$TMP"Aqui, density é 100,
$1e$2são os nomes dos arquivos a comparar, e$TMPé o arquivo de saída. Para dar suporte a várias páginas é preciso trabalho adicional, então uso este script: https://gist.github.com/mbafford/7e6f3bef20fc220f68e467589bb...Esse script também mostra a diferença diretamente no terminal com
imgcat. Além disso, dá para obter a diferença de hash perceptual no ImageMagick com algo comoconvert -metric phash "$1" null: "$2" -compose Difference -layers composite -format '%[fx:mean]\n' info:Aproveitando o fato de que o git permite configurar uma ferramenta de diff personalizada, coloquei
[diff "pdf"] command = ~/bin/git-diff-pdfno.gitconfige configurei*.pdf binary diff=pdfno.gitattributes. O~/bin/git-diff-pdfexecuta tanto o diff da saída depdftotext -layoutdo poppler quanto opdf-compare-phashPara usar esse diff personalizado no
git show, é preciso adicionar um argumento como emgit show --ext-diff, mas nogit diffele é usado automaticamenteTenho usado isso em um pipeline de CI para manter um app de geração de PDF essencial para o negócio na área médica. É um app que começou por volta de 2010, e o helper de RSpec em uso está aqui: https://gist.github.com/thbar/d1ce2afef68bf6089aeae8d9ddc05d...
O código tem PDFs de referência armazenados no git, e a suíte de testes os gera novamente para verificar se nada mudou
Isso ajuda muito a auditar alterações visuais ou upgrades de bibliotecas de PDF
Isso me lembrou uma ferramenta que Bob Nystrom criou para se ajudar enquanto trabalhava na versão física do livro Crafting Interpreters: https://journal.stuffwithstuff.com/2020/04/05/crafting-craft...
Vale a pena ler o texto inteiro, mas, se quiser ver só a parte relevante, procure por “I wrote a Dart script that would take a PDF of the book”
Na Micro:bit Educational Foundation (microbit.org), temos usado esta ferramenta para preencher lacunas das ferramentas de design de hardware, verificando diferenças visuais em esquemáticos e arquivos Gerber durante o processo iterativo de projeto de PCBs
É um uso um pouco incomum, mas, se você quer ter certeza de que o layout do circuito de rádio não mudou nada ao fazer pequenas alterações em outras partes da placa, um diff visual é exatamente o que serve
No próximo projeto, porém, quero tentar uma abordagem mais integrada às ferramentas de EDA. Gostaria de saber se alguém já seguiu um caminho parecido
Também dá para fazer com o Beyond Compare. Não é gratuito, mas também não é muito caro: https://www.scootersoftware.com/
Gosto mais desta ferramenta: https://www.qtrac.eu/diffpdf.html
Em vez de sobrepor as diferenças, ela faz uma comparação lado a lado na GUI
--viewé possível comparar visualmente dois arquivos em uma GUI simples$ diff-pdf --view a.pdf b.pdfUma janela é aberta e você pode ver as páginas de cada arquivo e ampliar os detalhes. Também dá para mover a posição relativa das duas páginas com Ctrl+setas, ou Cmd+setas no macOS, o que é útil para encontrar diferenças que são apenas deslocamentos de posição
No Fedora, dá para instalar pelo pacote
diffpdf. Ele não é mais mantido, mas funciona muito bem e oferece GUI com visualização lado a lado, drag and drop, modo texto e modo visualNa equipe, usamos essa ferramenta regularmente para comparar PDFs de serviços de terceiros que podem ter mudado depois de alterações no nosso código
Curiosamente, o GitHub classifica este projeto como 46% shell por causa do
wxwin.m4, que é bem grande