1 điểm bởi GN⁺ 2024-07-03 | 1 bình luận | Chia sẻ qua WhatsApp
  • diff-pdf là công cụ so sánh trực quan hai tệp PDF; khi chạy mặc định, nếu không có khác biệt thì trả về mã thoát 0, nếu có khác biệt thì trả về 1
  • Dùng tùy chọn --output-diff để tạo PDF có phần khác biệt được làm nổi bật bằng trực quan
  • Tùy chọn --view mở màn hình so sánh GUI đơn giản, cho phép xem từng trang và phóng to; có thể dùng phím mũi tên Ctrl/Cmd để di chuyển vị trí tương đối của hai trang
  • Có sẵn gói dựng sẵn hoặc đường dẫn cài qua trình quản lý gói cho Windows, macOS, Fedora, CentOS 8 và openSUSE
  • Kho mã được cung cấp theo dạng as-is và không còn được phát triển tích cực, nên khó kỳ vọng hỗ trợ cho yêu cầu tính năng hay sửa lỗi; các cải tiến được nhận dưới dạng pull request

diff-pdf làm gì

  • diff-pdf nhận hai tệp PDF làm đối số và so sánh chúng bằng trực quan
  • Đầu ra mặc định chỉ là mã thoát
    • Nếu không có khác biệt thì 0
    • Nếu hai PDF khác nhau thì 1
  • Muốn tạo PDF có phần khác biệt được làm nổi bật thì dùng tùy chọn --output-diff
$ diff-pdf --output-diff=diff.pdf a.pdf b.pdf

Chế độ so sánh GUI

  • Dùng tùy chọn --view để so sánh hai tệp trong GUI đơn giản
$ diff-pdf --view a.pdf b.pdf
  • Trong cửa sổ GUI, có thể xem các trang PDF và phóng to chi tiết
  • Dùng phím mũi tên với Ctrl, hoặc trên macOS là Cmd, để di chuyển vị trí tương đối của hai trang
    • Hữu ích để kiểm tra những khác biệt chỉ do thay đổi vị trí
  • Có thể dùng Ctrl+<, Ctrl+> để lần lượt xem tài liệu bên trái và tài liệu bên phải
    • Trên macOS dùng Cmd+<, Cmd+>
  • Có thể dùng Ctrl+D để quay lại chế độ xem diff
  • Có thể xem danh sách đầy đủ các tùy chọn bằng $ diff-pdf --help

Cài đặt bản nhị phân

  • Bản dựng sẵn cho Windows được cung cấp dưới dạng kho lưu trữ ZIP tại latest release
    • Có thể chạy từ bất kỳ vị trí nào sau khi giải nén
  • Nếu dùng Chocolatey trên Windows thì cài bằng lệnh sau
$ choco install diff-pdf
  • Nếu dùng Homebrew trên macOS thì cài bằng lệnh sau
$ brew install diff-pdf
  • Nếu dùng MacPorts trên macOS thì cài bằng lệnh sau
$ port install diff-pdf
  • Trên Fedora và CentOS 8 thì cài bằng lệnh sau
$ sudo dnf install diff-pdf

Biên dịch từ mã nguồn

  • Hệ thống build dùng Automake, vì vậy cần Unix hoặc môi trường tương tự Unix như Cygwin/MSYS
  • Quy trình build thông thường như sau
$ ./bootstrap
$ ./configure
$ make
$ make install
  • ./bootstrap chỉ cần khi build từ mã nguồn lấy ra từ hệ thống quản lý phiên bản, tức là khi chưa có configureMakefile.in
  • Các thư viện cần thiết gồm
    • wxWidgets >= 3.0
    • Cairo >= 1.4
    • Poppler >= 0.10

Phụ thuộc theo nền tảng

  • Trên CentOS, cài bộ công cụ phát triển cùng các gói liên quan đến wxGTK và Poppler GLib
$ sudo yum groupinstall "Development Tools"
$ sudo yum install wxGTK wxGTK-devel poppler-glib poppler-glib-devel
  • Trên Ubuntu 24.04 / Debian 12 trở lên, dùng libwxgtk3.2-dev
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.2-dev
  • Trên Ubuntu / Debian cũ hơn, dùng libwxgtk3.0-gtk3-dev
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.0-gtk3-dev
  • Trên macOS, cài Xcode Command Line Tools rồi quản lý phụ thuộc bằng Homebrew hoặc MacPorts
$ xcode-select --install
$ brew install automake autoconf wxmac poppler cairo pkg-config
$ sudo port install automake autoconf wxWidgets-3.0 poppler cairo pkgconfig
  • Trên Windows, các thư viện mà Cairo và Poppler sử dụng không được cung cấp sẵn, nên cần thêm nhiều phụ thuộc hơn
    • Bao gồm fontconfig, freetype, glib, libpng, pixman, gettext, libiconv, libjpeg, zlib, v.v.

Biên dịch trên Windows bằng MSYS + MinGW

  • Việc build trên Windows cần môi trường MSYS2 và bản cài MinGW có trình biên dịch C++
  • Trong shell MinGW của MSYS2, chuyển vào thư mục mã nguồn diff-pdf
  • Cài thêm các thành phần MSYS
$ pacman -Syu
$ pacman -S automake autoconf pkg-config make zip pactoys
$ pacboy -S gcc:p poppler:p wxWidgets:p
  • Sau đó build giống quy trình trên Unix
$ ./bootstrap  # chỉ cần khi build từ kho git
$ ./configure
$ make
  • Để tạo kho lưu trữ ZIP kèm các DLL cần thiết, chạy lệnh sau
$ make windows-dist

Cài đặt và tình trạng bảo trì

  • Trên Unix, cài bằng make install như thông thường
  • Trên Windows, không cần cài đặt riêng; chỉ cần chép tệp đến vị trí mong muốn
    • Nếu build theo quy trình ở trên thì các tệp cần thiết nằm trong kho ZIP được tạo ra
  • Kho mã được cung cấp theo dạng as-is và mã nguồn không còn được phát triển tích cực
    • Nếu muốn cải tiến thì nên tự chỉnh sửa và gửi pull request
    • Khó có thể kỳ vọng hỗ trợ như hiện thực yêu cầu tính năng hay sửa lỗi

1 bình luận

 
GN⁺ 2024-07-03
Ý kiến trên Hacker News
  • Tôi đã nhờ Claude 3.5 Sonnet dùng PDF.js để render PDF lên canvas và tạo một prototype web nhanh, hiển thị khác biệt trực quan theo từng trang
    Prompt gồm hai yêu cầu: nhận hai PDF bằng kéo-thả, hiển thị các trang cạnh nhau và nếu có khác biệt thì tô nổi bật bằng một ảnh thứ ba; sau đó viết lại để hoàn toàn không dùng React
    Kết quả: https://tools.simonwillison.net/compare-pdfs
    Thực tế chạy khá tốt. Ảnh chụp màn hình: https://gist.github.com/simonw/9d7cbe02d448812f48070e7de13a5...

    • Tôi tò mò cách dùng Claude 3.5 hiệu quả. Vài ngày trước tôi đã xin quyền truy cập API; ngoài console.anthropic.com ra, nếu có công cụ nào đáng dùng để nhập API key và tận dụng Claude tốt trên máy local thì mong được gợi ý
    • Tôi tò mò để làm được đến mức này chỉ với prompt đó thì phải làm thêm bao nhiêu việc. Khá ấn tượng
    • Khó bắt bẻ một bình luận đã 4 ngày tuổi, nhưng tôi không biết điểm khác nhau giữa hai PDF là gì
      Tôi không tìm thấy khác biệt thực tế nào, có khi là tôi đang bị ảo giác cũng nên
  • Ở công ty cũ, tôi phải kiểm chứng đầu ra của một hệ thống xuất bản production không ổn định, nên đã thử hàng chục công cụ so sánh PDF có sẵn lúc đó. Công cụ tốt nhất trong số đó là Delta Walker; dù là phần mềm thương mại độc quyền chỉ cho Mac, giá của nó hợp lý, chính xác và xử lý tốt cả các PDF dài nhiều đồ họa
    Tôi cũng đã đánh giá công cụ diff-pdf này và nó thiếu sót ở vài điểm, nhưng đã quá lâu nên không nhớ chi tiết. Phần lớn công cụ hoặc bỏ sót thay đổi hoặc báo dương tính giả, nên càng tiếc vì công cụ này là mã nguồn mở và dễ script hóa

    • Có vẻ Delta Walker giờ cũng hỗ trợ Windows và Linux: https://www.deltawalker.com/download
    • “Draftable” rất tuyệt
    • Nếu xuất các trang thành ảnh rồi so sánh khác biệt pixel thì chẳng phải có thể tìm chính xác khác biệt trong PDF sao?
  • Liên quan, có thể hữu ích với ai đó. Có thể so sánh PDF trực quan bằng ImageMagick
    magick compare -density "$DENSITY" -background white "$1[0]" "$2[0]" "$TMP"
    Ở đây density là 100, $1$2 là tên file cần so sánh, còn $TMP là file đầu ra. Muốn hỗ trợ nhiều trang thì cần làm thêm, nên tôi dùng script này: https://gist.github.com/mbafford/7e6f3bef20fc220f68e467589bb...
    Script này còn dùng imgcat để hiển thị khác biệt ngay trong terminal. Ngoài ra cũng có thể lấy khác biệt perceptual hash trong ImageMagick bằng cách như convert -metric phash "$1" null: "$2" -compose Difference -layers composite -format '%[fx:mean]\n' info:
    Tận dụng việc có thể cấu hình công cụ diff tùy chỉnh trong git, tôi thêm [diff "pdf"] command = ~/bin/git-diff-pdf vào .gitconfig, và đặt *.pdf binary diff=pdf trong .gitattributes. ~/bin/git-diff-pdf chạy đồng thời diff đầu ra pdftotext -layout của poppler và pdf-compare-phash
    Để dùng diff tùy chỉnh này trong git show thì cần thêm tham số như git show --ext-diff, còn với git diff thì nó được dùng tự động

    • Việc nối tới cả thuộc tính git là nâng lên một bậc. Dùng ImageMagick 10–20 năm rồi mà vẫn phải ngạc nhiên vì sức mạnh của nó; đúng là một phần mềm mã nguồn mở rất truyền cảm hứng
  • Tôi đã dùng công cụ này trong pipeline CI để duy trì một ứng dụng tạo PDF cốt lõi nghiệp vụ trong lĩnh vực y tế. Ứng dụng bắt đầu khoảng năm 2010, và RSpec helper đang dùng nằm ở đây: https://gist.github.com/thbar/d1ce2afef68bf6089aeae8d9ddc05d...
    Trong code có các PDF chuẩn được lưu trong git, và test suite tạo lại chúng để kiểm tra rằng không có gì thay đổi
    Nó rất hữu ích để audit các thay đổi trực quan hoặc việc nâng cấp thư viện PDF

    • Tôi tò mò liệu bạn có dùng digest đã ký bên trong PDF không
    • Chẳng lẽ không thể chỉ so sánh source hoặc hash của PDF để kiểm chứng sao?
  • Tôi nhớ đến công cụ Bob Nystrom tạo ra để tự hỗ trợ khi làm bản sách in thực tế của Crafting Interpreters: https://journal.stuffwithstuff.com/2020/04/05/crafting-craft...
    Toàn bài đáng đọc, nhưng nếu chỉ muốn xem phần liên quan thì hãy tìm cụm “I wrote a Dart script that would take a PDF of the book”

  • Tại Micro:bit Educational Foundation(microbit.org), chúng tôi đã dùng công cụ này để lấp khoảng trống trong công cụ thiết kế phần cứng, cụ thể là kiểm tra khác biệt trực quan giữa sơ đồ mạch và file Gerber trong quá trình lặp lại thiết kế PCB
    Cuối cùng cách dùng này hơi đặc thù, nhưng nếu bạn muốn chắc chắn rằng bố trí mạch vô tuyến hoàn toàn không thay đổi khi chỉnh sửa nhỏ ở phần khác của bo mạch, thì visual diff rất phù hợp
    Tuy vậy, trong dự án tiếp theo tôi muốn thử một cách tích hợp hơn với công cụ EDA. Nếu ai từng đi con đường tương tự thì tôi rất muốn biết

  • Cũng có thể làm bằng Beyond Compare. Không miễn phí, nhưng cũng không quá đắt: https://www.scootersoftware.com/

    • Beyond Compare là một trong những công cụ đáng đồng tiền, kiểu tự bỏ tiền mua chứ không chờ công ty mua cho. Tính năng so với giá tiền rất đáng giá, chạy đa nền tảng, và giấy phép cũng rất thoáng. Không có công cụ so sánh tự do nguồn mở nào sánh được với BC
  • Tôi thích công cụ này hơn: https://www.qtrac.eu/diffpdf.html
    Thay vì hiển thị các khác biệt chồng lên nhau, nó cho so sánh cạnh nhau trong GUI

    • Theo mô tả trên GitHub, nếu dùng tham số --view thì có thể so sánh trực quan hai tệp trong một GUI đơn giản
      $ diff-pdf --view a.pdf b.pdf
      Một cửa sổ sẽ mở ra, bạn có thể xem các trang của từng tệp và phóng to các chi tiết. Cũng có thể di chuyển vị trí tương đối của hai trang bằng Ctrl+phím mũi tên, trên MacOS là Cmd+phím mũi tên, nên rất hữu ích để tìm các khác biệt chỉ do dịch chuyển vị trí
    • Nó cũng có phiên bản nguồn mở/miễn phí, và tôi đang dùng thường xuyên: https://www.qtrac.eu/diffpdf-foss.html
      Trên Fedora có thể cài bằng gói diffpdf. Dù không còn được bảo trì nữa nhưng vẫn hoạt động rất tốt, hỗ trợ GUI xem cạnh nhau, kéo thả, cả chế độ văn bản lẫn chế độ trực quan
    • Tôi dùng BeyondCompare 5 cho mục đích này
  • Trong nhóm, chúng tôi thường xuyên dùng công cụ này khi so sánh PDF của dịch vụ bên thứ ba có thể đã thay đổi sau các thay đổi mã phía chúng tôi

  • Thú vị là GitHub đánh giá dự án này là 46% shell vì có tệp wxwin.m4 khá lớn

    • Tôi cũng từng thấy điều tương tự trong dự án riêng tư cá nhân. Có vẻ phân tích tỷ lệ ngôn ngữ của GitHub bị hỏng. Đó là dự án Python, chỉ có vài notebook Jupyter và rất nhiều tệp Python; xét theo số dòng mã thì có lẽ 80% là tệp Python, vậy mà GitHub lại xem dự án là 50% Jupyter