1 คะแนน โดย GN⁺ 2024-07-03 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • diff-pdf เป็นเครื่องมือสำหรับเปรียบเทียบไฟล์ PDF สองไฟล์แบบมองเห็นได้ โดยเมื่อรันตามค่าเริ่มต้น หากไม่มีความแตกต่างจะคืน exit code 0 และหากมีความแตกต่างจะคืน 1
  • เมื่อใช้ตัวเลือก --output-diff จะสามารถสร้าง PDF ที่ไฮไลต์ความแตกต่างแบบมองเห็นได้
  • ตัวเลือก --view จะเปิด หน้าจอเปรียบเทียบแบบ GUI อย่างง่าย เพื่อดูหน้าและซูมได้ และสามารถใช้ลูกศร Ctrl/Cmd เพื่อเลื่อนตำแหน่งสัมพัทธ์ของสองหน้าได้
  • มีแพ็กเกจที่คอมไพล์ไว้ล่วงหน้าหรือช่องทางติดตั้งผ่าน package manager สำหรับ Windows, macOS, Fedora, CentOS 8 และ openSUSE
  • รีโพซิทอรีนี้ให้ใช้งานแบบ as-is และไม่ได้อยู่ระหว่างการพัฒนาอย่างแข็งขัน จึงคาดหวังการรองรับคำขอฟีเจอร์หรือการแก้ไขได้ยาก โดยรับการปรับปรุงในรูปแบบ pull request

diff-pdf ทำอะไร

  • diff-pdf รับไฟล์ PDF สองไฟล์เป็นอาร์กิวเมนต์แล้วเปรียบเทียบแบบมองเห็นได้
  • เอาต์พุตตามค่าเริ่มต้นมีเพียง exit code
    • หากไม่มีความแตกต่างจะเป็น 0
    • หาก PDF สองไฟล์แตกต่างกันจะเป็น 1
  • หากต้องการสร้าง PDF ที่ไฮไลต์ความแตกต่าง ให้ใช้ตัวเลือก --output-diff
$ diff-pdf --output-diff=diff.pdf a.pdf b.pdf

โหมดเปรียบเทียบแบบ GUI

  • เมื่อใช้ตัวเลือก --view จะสามารถเปรียบเทียบไฟล์สองไฟล์ใน GUI อย่างง่ายได้
$ diff-pdf --view a.pdf b.pdf
  • ในหน้าต่าง GUI สามารถดูหน้า PDF และซูมดูรายละเอียดได้
  • ใช้ลูกศร Ctrl หรือบน macOS ใช้ลูกศร Cmd เพื่อเลื่อนตำแหน่งสัมพัทธ์ของสองหน้าได้
    • มีประโยชน์ในการตรวจสอบความแตกต่างที่เกิดจากตำแหน่งเปลี่ยนไปเท่านั้น
  • ใช้ Ctrl+<, Ctrl+> เพื่อดูเอกสารฝั่งซ้ายและฝั่งขวาตามลำดับได้
    • บน macOS ใช้ Cmd+<, Cmd+>
  • ใช้ Ctrl+D เพื่อกลับไปยังมุมมอง diff ได้
  • ดูรายการตัวเลือกทั้งหมดได้จาก $ diff-pdf --help

การติดตั้งไบนารี

  • เวอร์ชันที่คอมไพล์ไว้ล่วงหน้าสำหรับ Windows มีให้ในรูปแบบ ZIP archive ของ latest release
    • สามารถรันได้จากทุกตำแหน่งที่แตกไฟล์ไว้
  • หากใช้ Chocolatey บน Windows ให้ติดตั้งด้วยคำสั่งต่อไปนี้
$ choco install diff-pdf
  • หากใช้ Homebrew บน macOS ให้ติดตั้งด้วยคำสั่งต่อไปนี้
$ brew install diff-pdf
  • หากใช้ MacPorts บน macOS ให้ติดตั้งด้วยคำสั่งต่อไปนี้
$ port install diff-pdf
  • บน Fedora และ CentOS 8 ให้ติดตั้งด้วยคำสั่งต่อไปนี้
$ sudo dnf install diff-pdf
  • เวอร์ชันที่คอมไพล์ไว้ล่วงหน้าสำหรับ openSUSE ดาวน์โหลดได้จาก openSUSE build service

การบิลด์จากซอร์ส

  • ระบบบิลด์ใช้ Automake จึงต้องมีสภาพแวดล้อม Unix หรือคล้าย Unix เช่น Cygwin/MSYS
  • ขั้นตอนบิลด์ทั่วไปมีดังนี้
$ ./bootstrap
$ ./configure
$ make
$ make install
  • ./bootstrap จำเป็นเฉพาะเมื่อบิลด์ซอร์สที่ checkout มาจากระบบควบคุมเวอร์ชัน กล่าวคือเมื่อไม่มี configure และ Makefile.in
  • ไลบรารีที่ต้องใช้มีดังนี้
    • wxWidgets >= 3.0
    • Cairo >= 1.4
    • Poppler >= 0.10

Dependencies ตามแพลตฟอร์ม

  • บน CentOS ให้ติดตั้งเครื่องมือพัฒนาและแพ็กเกจที่เกี่ยวข้องกับ wxGTK, Poppler GLib
$ sudo yum groupinstall "Development Tools"
$ sudo yum install wxGTK wxGTK-devel poppler-glib poppler-glib-devel
  • บน Ubuntu 24.04 / Debian 12 ขึ้นไป ให้ใช้ libwxgtk3.2-dev
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.2-dev
  • บน Ubuntu / Debian รุ่นเก่า ให้ใช้ libwxgtk3.0-gtk3-dev
$ sudo apt-get install make automake g++
$ sudo apt-get install libpoppler-glib-dev poppler-utils libwxgtk3.0-gtk3-dev
  • บน macOS ให้ติดตั้ง Xcode Command Line Tools แล้วจัดการ dependencies ด้วย Homebrew หรือ MacPorts
$ xcode-select --install
$ brew install automake autoconf wxmac poppler cairo pkg-config
$ sudo port install automake autoconf wxWidgets-3.0 poppler cairo pkgconfig
  • บน Windows ต้องใช้ dependencies เพิ่มเติมมากกว่าเดิม เพราะไม่ได้มีไลบรารีที่ Cairo และ Poppler ใช้มาให้โดยค่าเริ่มต้น
    • รวมถึง fontconfig, freetype, glib, libpng, pixman, gettext, libiconv, libjpeg, zlib เป็นต้น

การบิลด์บน Windows ด้วย MSYS + MinGW

  • การบิลด์บน Windows ต้องใช้ สภาพแวดล้อม MSYS2 และการติดตั้ง MinGW ที่มี C++ compiler
  • ใน MSYS2 MinGW shell ให้ย้ายไปยังไดเรกทอรีซอร์สของ diff-pdf
  • ติดตั้งคอมโพเนนต์ MSYS เพิ่มเติม
$ pacman -Syu
$ pacman -S automake autoconf pkg-config make zip pactoys
$ pacboy -S gcc:p poppler:p wxWidgets:p
  • จากนั้นบิลด์ตามขั้นตอน Unix ได้เหมือนกัน
$ ./bootstrap  # จำเป็นเฉพาะเมื่อบิลด์จาก git repository
$ ./configure
$ make
  • หากต้องการสร้าง ZIP archive ที่รวม DLL ที่จำเป็น ให้รันคำสั่งต่อไปนี้
$ make windows-dist

สถานะการติดตั้งและการบำรุงรักษา

  • บน Unix ให้ติดตั้งด้วย make install ตามปกติ
  • บน Windows ไม่จำเป็นต้องติดตั้งแยก เพียงคัดลอกไฟล์ไปยังตำแหน่งที่ต้องการ
    • หากบิลด์ตามขั้นตอนข้างต้น ไฟล์ที่จำเป็นจะอยู่ใน ZIP archive ที่สร้างขึ้น
  • รีโพซิทอรีนี้ให้ใช้งานแบบ as-is และโค้ดไม่ได้อยู่ระหว่างการพัฒนาอย่างแข็งขัน
    • หากต้องการปรับปรุง แนะนำให้แก้ไขเองแล้วส่ง pull request
    • คาดหวังการสนับสนุน เช่น การทำตามคำขอฟีเจอร์หรือการแก้ไข ได้ยาก

1 ความคิดเห็น

 
GN⁺ 2024-07-03
ความเห็นจาก Hacker News
  • ให้ Claude 3.5 Sonnet ใช้ PDF.js เพื่อเรนเดอร์ PDF ลงบนแคนวาส และสร้างเว็บต้นแบบอย่างรวดเร็วที่แสดงความแตกต่างเชิงภาพของแต่ละหน้า
    พรอมป์ต์มีอยู่สองอัน: อันแรกให้รับ PDF สองไฟล์ด้วยการลากแล้ววาง แสดงหน้าแบบวางเคียงกัน และถ้ามีความต่างให้เน้นด้วยภาพที่สาม ส่วนอีกอันคือให้เขียนใหม่โดยไม่ใช้ React เลย
    ผลลัพธ์: https://tools.simonwillison.net/compare-pdfs
    ใช้งานได้ดีทีเดียว ภาพหน้าจอ: https://gist.github.com/simonw/9d7cbe02d448812f48070e7de13a5...

    • อยากรู้วิธีใช้ Claude 3.5 ให้มีประสิทธิภาพ เมื่อไม่กี่วันก่อนเพิ่งขอสิทธิ์เข้าถึง API ไป เลยอยากได้คำแนะนำเครื่องมือที่ใส่ API key แล้วใช้งาน Claude บนเครื่องตัวเองได้ดี นอกเหนือจาก console.anthropic.com
    • อยากรู้ว่ากว่าจะทำได้ถึงระดับนี้จากพรอมป์ต์แค่นั้น ต้องมีงานเพิ่มอีกมากแค่ไหน น่าประทับใจมาก
    • ถึงจะย้อนไปเถียงคอมเมนต์เมื่อ 4 วันก่อนคงยาก แต่ผมไม่รู้เลยว่าความต่างของ PDF สองไฟล์คืออะไร
      ผมหาความต่างจริง ๆ ไม่เจอ และบางทีอาจเป็นผมเองที่หลอนเห็นไปก็ได้
  • ที่ทำงานเก่าเคยต้องตรวจสอบผลลัพธ์จากระบบจัดพิมพ์สำหรับงาน production ที่ไม่เสถียร เลยทดสอบเครื่องมือเปรียบเทียบ PDF ที่หาใช้ได้ในตอนนั้นเป็นสิบ ๆ ตัว ตัวที่ดีที่สุดคือ Delta Walker ซึ่งเป็นซอฟต์แวร์เชิงพาณิชย์แบบ proprietary สำหรับ Mac เท่านั้นในเวลานั้น แต่ราคาสมเหตุสมผล แม่นยำ และจัดการ PDF ยาว ๆ ที่มีกราฟิกเยอะได้ดี
    เครื่องมือ diff-pdf นี้ก็เคยประเมินด้วย มันยังขาดในบางด้าน แต่เวลาผ่านมานานมากจนจำรายละเอียดไม่ได้ ส่วนใหญ่เครื่องมืออื่น ๆ มักพลาดการเปลี่ยนแปลงหรือแจ้งเตือนเกินจริง และเพราะตัวนี้เป็นโอเพนซอร์สจึงยิ่งน่าเสียดายที่เอามาทำสคริปต์ได้ง่าย

    • ดูเหมือนว่า Delta Walker ตอนนี้รองรับ Windows และ Linux ด้วย: https://www.deltawalker.com/download
    • “Draftable” ยอดเยี่ยมมาก
    • ถ้าส่งออกแต่ละหน้าเป็นภาพแล้วเปรียบเทียบ ความต่างระดับพิกเซล ก็ไม่น่าจะหาความต่างของ PDF ได้อย่างแม่นยำหรือ?
  • เผื่อจะเป็นประโยชน์กับใครบางคน ใน ImageMagick สามารถทำการเปรียบเทียบ PDF แบบเห็นภาพได้
    magick compare -density "$DENSITY" -background white "$1[0]" "$2[0]" "$TMP"
    โดย density คือ 100, $1 และ $2 คือชื่อไฟล์ที่จะเปรียบเทียบ และ $TMP คือไฟล์ผลลัพธ์ ถ้าจะรองรับหลายหน้าต้องทำเพิ่มอีกหน่อย เลยใช้สคริปต์นี้: https://gist.github.com/mbafford/7e6f3bef20fc220f68e467589bb...
    สคริปต์นี้ยังใช้ imgcat เพื่อแสดงความต่างในเทอร์มินัลได้ทันทีด้วย นอกจากนี้ยังสามารถใช้ ImageMagick เพื่อหาค่า ความต่างของ perceptual hash ได้ด้วยวิธีอย่าง convert -metric phash "$1" null: "$2" -compose Difference -layers composite -format '%[fx:mean]\n' info:
    โดยอาศัยความจริงที่ว่า git ตั้งค่าเครื่องมือ diff แบบกำหนดเองได้ จึงใส่ [diff "pdf"] command = ~/bin/git-diff-pdf ไว้ใน .gitconfig และตั้ง *.pdf binary diff=pdf ใน .gitattributes ~/bin/git-diff-pdf จะรันทั้ง diff ของผลลัพธ์ pdftotext -layout จาก poppler และ pdf-compare-phash ร่วมกัน
    หากต้องการใช้ custom diff นี้กับ git show ต้องเพิ่มอาร์กิวเมนต์อย่าง git show --ext-diff แต่ใน git diff จะถูกใช้โดยอัตโนมัติ

    • การเชื่อมไปถึง git attributes นี่เหนือไปอีกขั้นเลย ImageMagick เป็นซอฟต์แวร์โอเพนซอร์สที่สร้างแรงบันดาลใจมาก ใช้มาตั้ง 10–20 ปีก็ยังทึ่งในความทรงพลังของมันอยู่เสมอ
  • ใช้สิ่งนี้ใน CI pipeline มานานเพื่อดูแล แอปสร้าง PDF ที่เป็นหัวใจสำคัญทางธุรกิจในวงการการแพทย์ แอปนี้เริ่มมาตั้งแต่ราวปี 2010 และ RSpec helper ที่ใช้อยู่มีอยู่ที่นี่: https://gist.github.com/thbar/d1ce2afef68bf6089aeae8d9ddc05d...
    ในโค้ดจะมี PDF ต้นแบบที่เก็บไว้ใน git และ test suite จะสร้างมันขึ้นมาใหม่เพื่อตรวจสอบว่าไม่มีอะไรเปลี่ยนไป
    มันช่วยได้มากในการตรวจสอบการเปลี่ยนแปลงเชิงภาพหรือการอัปเกรดไลบรารี PDF

    • สงสัยว่าใน PDF ใช้ signed digest อยู่หรือเปล่า
    • ใช้วิธีเปรียบเทียบแค่ซอร์สหรือแฮชของ PDF เพื่อยืนยันไม่ได้หรือ?
  • ทำให้นึกถึงเครื่องมือที่ Bob Nystrom สร้างขึ้นเพื่อช่วยตัวเองตอนทำหนังสือ Crafting Interpreters ฉบับตีพิมพ์จริง: https://journal.stuffwithstuff.com/2020/04/05/crafting-craft...
    บทความทั้งหมดน่าอ่าน แต่ถ้าอยากดูเฉพาะส่วนที่เกี่ยวข้อง ให้ค้นหาคำว่า “I wrote a Dart script that would take a PDF of the book”

  • ที่ Micro:bit Educational Foundation (microbit.org) ใช้เครื่องมือนี้เพื่ออุดช่องว่างของเครื่องมือออกแบบฮาร์ดแวร์ และใช้ตรวจสอบ ความต่างเชิงภาพของ schematic และไฟล์ Gerber ในระหว่างการทำซ้ำของงานออกแบบ PCB
    สุดท้ายแล้วการใช้งานแบบนี้อาจดูเฉพาะทางอยู่บ้าง แต่ถ้าคุณอยากมั่นใจจริง ๆ ว่าการแก้ไขเล็กน้อยในส่วนอื่นของบอร์ดไม่ได้ทำให้เลย์เอาต์วงจรไร้สายเปลี่ยนไปเลย การทำ visual diff ก็ตอบโจทย์มาก
    อย่างไรก็ตาม ในโปรเจกต์ถัดไปอยากลองวิธีที่ผสานเข้ากับเครื่องมือ EDA มากกว่านี้ ถ้าใครเคยเดินเส้นทางคล้ายกันมาก่อนก็อยากรู้เหมือนกัน

  • ทำได้ด้วย Beyond Compare เช่นกัน ไม่ฟรีแต่ก็ไม่ได้แพงมาก: https://www.scootersoftware.com/

    • Beyond Compare เป็นหนึ่งในเครื่องมือที่คุ้มค่าพอจะยอมควักเงินซื้อเองได้โดยไม่ต้องรอให้นายจ้างจ่ายให้ ฟีเจอร์คุ้มราคาแบบทองคำ รองรับข้ามแพลตฟอร์ม และไลเซนส์ก็ยืดหยุ่นมาก ไม่มีเครื่องมือเปรียบเทียบแบบเสรี/โอเพนซอร์สตัวไหนที่เทียบชั้น BC ได้
  • ชอบเครื่องมือนี้มากกว่า: https://www.qtrac.eu/diffpdf.html
    มันให้ เปรียบเทียบแบบวางข้างกัน ใน GUI แทนการซ้อนทับความแตกต่างให้ดู

    • ตามคำอธิบายใน GitHub ถ้าใช้พารามิเตอร์ --view ก็สามารถเปรียบเทียบไฟล์สองไฟล์แบบเห็นภาพใน GUI อย่างง่ายได้
      $ diff-pdf --view a.pdf b.pdf
      หน้าต่างจะเปิดขึ้นและสามารถดูแต่ละหน้าของไฟล์ได้ พร้อมซูมดูรายละเอียดได้ นอกจากนี้ยังเลื่อนตำแหน่งสัมพัทธ์ของสองหน้าได้ด้วย Ctrl+ลูกศร หรือบน MacOS ใช้ Cmd+ลูกศร จึงมีประโยชน์ในการหาความต่างที่เกิดจากการเลื่อนตำแหน่งเพียงอย่างเดียว
    • มี เวอร์ชันโอเพนซอร์ส/ฟรี ของสิ่งนี้ด้วย และใช้งานอยู่เป็นประจำ: https://www.qtrac.eu/diffpdf-foss.html
      บน Fedora สามารถติดตั้งได้ด้วยแพ็กเกจ diffpdf ตอนนี้ไม่ได้รับการดูแลต่อแล้ว แต่ยังทำงานได้ดีมาก และรองรับทั้ง GUI แบบมองข้างกัน, drag and drop, โหมดข้อความ และโหมดภาพ
    • ใช้ BeyondCompare 5 สำหรับงานนี้
  • ในทีม เราใช้เครื่องมือนี้เป็นประจำเมื่อต้องเปรียบเทียบ PDF ของบริการภายนอก ที่อาจเปลี่ยนไปหลังจากมีการแก้โค้ดฝั่งเรา

  • ที่น่าสนใจคือ GitHub จัดโปรเจ็กต์นี้ว่าเป็น shell 46% เพราะ wxwin.m4 ที่ค่อนข้างใหญ่

    • เคยเห็นอะไรคล้ายกันในโปรเจ็กต์ส่วนตัวแบบ private เหมือนกัน ดูเหมือนว่าการวิเคราะห์สัดส่วนภาษาของ GitHub จะเพี้ยน ๆ โปรเจ็กต์นั้นเป็น Python และมี Jupyter notebook อยู่แค่ไม่กี่ไฟล์ ส่วนไฟล์ Python มีจำนวนมากมาก ถ้านับตามจำนวนบรรทัดโค้ดก็น่าจะเป็นไฟล์ Python ถึง 80% แต่ GitHub กลับมองว่าโปรเจ็กต์นั้นเป็น Jupyter 50%