- 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ó configure và Makefile.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
Ý 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 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
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,
$1và$2là tên file cần so sánh, còn$TMPlà 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-pdfvào.gitconfig, và đặt*.pdf binary diff=pdftrong.gitattributes.~/bin/git-diff-pdfchạy đồng thời diff đầu rapdftotext -layoutcủa poppler vàpdf-compare-phashĐể dùng diff tùy chỉnh này trong
git showthì cần thêm tham số nhưgit show --ext-diff, còn vớigit diffthì nó được dùng tự độngTô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 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/
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
--viewthì có thể so sánh trực quan hai tệp trong một GUI đơn giản$ diff-pdf --view a.pdf b.pdfMộ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í
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 quanTrong 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.m4khá lớn