1 pontos por GN⁺ 2024-07-03 | 1 comentários | Compartilhar no WhatsApp
  • 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

 
GN⁺ 2024-07-03
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...

    • Tenho curiosidade sobre como usar o Claude 3.5 de forma eficaz. Pedi acesso à API há alguns dias e, além de console.anthropic.com, gostaria de recomendações de ferramentas em que eu possa inserir uma chave de API e aproveitar bem o Claude localmente
    • Fico curioso sobre quanto trabalho adicional foi necessário para chegar até aí só com aquele prompt. É bem impressionante
    • É difícil contestar um comentário de 4 dias atrás, mas não sei quais são as diferenças entre os dois PDFs
      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

    • Parece que o Delta Walker agora também oferece suporte a Windows e Linux: https://www.deltawalker.com/download
    • “Draftable” era excelente
    • Se você exportar as páginas como imagens e comparar as diferenças de pixels, não daria para encontrar as diferenças no PDF com precisão?
  • 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, $1 e $2 sã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 como convert -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-pdf no .gitconfig e configurei *.pdf binary diff=pdf no .gitattributes. O ~/bin/git-diff-pdf executa tanto o diff da saída de pdftotext -layout do poppler quanto o pdf-compare-phash
    Para usar esse diff personalizado no git show, é preciso adicionar um argumento como em git show --ext-diff, mas no git diff ele é usado automaticamente

    • Integrar isso até os atributos do git é outro nível. Mesmo usando ImageMagick há 10–20 anos, ele ainda me surpreende pela força; é um software open source realmente inspirador
  • Tenho 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

    • Fico curioso se vocês usam um digest assinado dentro do PDF
    • Não daria para validar comparando apenas o código-fonte ou o hash do 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/

    • O Beyond Compare é uma daquelas ferramentas que valem o preço, que você paga do próprio bolso sem esperar o empregador comprar. O conjunto de recursos pelo preço vale ouro, é multiplataforma, e a licença é muito generosa. Não há nenhuma ferramenta livre e open source de comparação que chegue perto do BC
  • 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

    • Segundo a descrição no GitHub, usando o argumento --view é possível comparar visualmente dois arquivos em uma GUI simples
      $ diff-pdf --view a.pdf b.pdf
      Uma 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
    • Também existe uma versão open source/gratuita dele, que uso regularmente: https://www.qtrac.eu/diffpdf-foss.html
      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 visual
    • Uso o BeyondCompare 5 para esse fim
  • Na 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

    • Já vi algo parecido em projetos pessoais privados. A análise de proporção de linguagens do GitHub parece estar quebrada. Era um projeto Python, com apenas alguns notebooks Jupyter e muitos arquivos Python; em termos de linhas de código, 80% deveriam ser arquivos Python, mas ainda assim o GitHub via o projeto como 50% Jupyter