แตกต่างจากไฟล์ PDF สองไฟล์หรือไม่


39

ฉันกำลังมองหาโปรแกรมที่ดีที่จะแสดงความแตกต่างระหว่างไฟล์ pdf ที่คล้ายกันสองไฟล์ โดยเฉพาะอย่างยิ่งฉันกำลังมองหาบางอย่างที่ไม่เพียง แต่ทำงานในเวอร์ชัน ASCII (ด้วย "pdftotext") ของไฟล์ นี่คือสิ่งที่pdfdiff.pyทำ


มันต้องเป็นโอเพนซอร์สและฟรีหรือเปล่า?
Rinzwind

@ รินซ์วิน: แน่นอนว่าน่าจะดีกว่า
krumpelstiltskin

inetsoftware.de/other-products/pdf-content-comparer/ … 2.2 ที่นี่ระบุว่ามันสามารถใช้ภายใต้ Linux (runPDFC.sh) แต่ไฟล์ไม่ได้อยู่ในไฟล์เก็บถาวร (เฉพาะแบ็ต ... ) แต่เป็นจาวาดังนั้น อาจจะเปลี่ยนชื่อใหม่ (?)
Rinzwind

@ รินซ์วิน: ฉันไม่รู้เกี่ยวกับจาวาเพียงพอที่จะเข้าใจว่าทำไมมันถึงไม่ทำงาน ฉันทำ: java -cp -jar PDFC.jar แต่รับ java.lang.NoClassDefFoundError :(
krumpelstiltskin

@ Rinzwind: ฉันวิ่งบน windows; โปรแกรมน่ากลัว มันสร้าง png ที่อ่านไม่ออก
krumpelstiltskin

คำตอบ:


28

คุณสามารถใช้DiffPDFสำหรับสิ่งนี้ จากคำอธิบาย:

DiffPDF ใช้เพื่อเปรียบเทียบไฟล์ PDF สองไฟล์ โดยค่าเริ่มต้นการเปรียบเทียบเป็นข้อความในแต่ละหน้าคู่ แต่การเปรียบเทียบลักษณะที่ปรากฏของหน้าได้รับการสนับสนุน (ตัวอย่างเช่นหากมีการเปลี่ยนแปลงไดอะแกรมหรือย่อหน้าที่จัดรูปแบบใหม่) นอกจากนี้ยังเป็นไปได้ที่จะ c> ompare หน้าเฉพาะหรือช่วงหน้า ตัวอย่างเช่นหากมีไฟล์ PDF สองเวอร์ชันหนึ่งอันที่มีหน้า 1-12 และอีกอันที่มีหน้า 1-13 เนื่องจากมีการเพิ่มหน้าพิเศษเป็นหน้า 4 พวกเขาสามารถเปรียบเทียบได้โดยการระบุช่วงหน้าสองหน้า 1 -12 สำหรับอันแรกและ 1-3, 5-13 สำหรับวินาที สิ่งนี้จะทำให้ DiffPDF เปรียบเทียบหน้าเว็บในคู่ (1, 1), (2, 2), (3, 3), (4, 5), (5, 6) และอื่น ๆ เพื่อ (12, 13)


2
นี่คือสิ่งที่ดีที่สุดที่ฉันเคยเห็น ปัญหาเดียวที่ฉันเห็นคือมันเปรียบเทียบหน้า PDF สำหรับหน้า ดังนั้นหากคุณเพิ่มย่อหน้าในการพูดหน้า 1 การเริ่มต้นและสิ้นสุดของทุกหน้าหลังจากนั้นไม่ตรงกัน :(
krumpelstiltskin

3
ฉันคิดว่าลิงก์ไม่ถูกต้องอีกต่อไป เวอร์ชันใหม่ 3 * ดูเหมือนว่าจะมีให้สำหรับ Windows เท่านั้น แม้ว่าเวอร์ชั่นเก่ายังคงสามารถติดตั้งผ่านsudo apt-get install diffpdf* ได้
peq

22

ฉันเพิ่งค้นพบแฮ็คเพื่อให้ DiffPDF (โปรแกรมที่แนะนำโดย @qbi) สามารถใช้งานได้มากกว่าการเปลี่ยนแปลงเล็กน้อย สิ่งที่ฉันทำคือเชื่อมไฟล์ PDF ทุกหน้าให้เป็นม้วนกระดาษยาวโดยใช้pdfjamแล้วเปรียบเทียบแผ่นม้วน มันทำงานได้แม้ในขณะที่ลบหรือแทรกส่วนใหญ่!

นี่คือสคริปต์ทุบตีที่ทำงาน:

#!/bin/bash
#
# Compare two PDF files.
# Dependencies:
#  - pdfinfo (xpdf)
#  - pdfjam  (texlive-extra-utils)
#  - diffpdf
#

MAX_HEIGHT=15840  #The maximum height of a page (in points), limited by pdfjam.

TMPFILE1=$(mktemp /tmp/XXXXXX.pdf)
TMPFILE2=$(mktemp /tmp/XXXXXX.pdf)

usage="usage: scrolldiff -h FILE1.pdf FILE2.pdf
  -h print this message

v0.0"

while getopts "h" OPTIONS ; do
    case ${OPTIONS} in
        h|-help) echo "${usage}"; exit;;
    esac
done
shift $(($OPTIND - 1))

if [ -z "$1" ] || [ -z "$2" ] || [ ! -f "$1" ] || [ ! -f "$2" ]
then
  echo "ERROR: input files do not exist."
  echo
  echo "$usage"
  exit
fi

    #Get the number of pages:
pages1=$( pdfinfo "$1" | grep 'Pages' - | awk '{print $2}' )
pages2=$( pdfinfo "$2" | grep 'Pages' - | awk '{print $2}' )
numpages=$pages2
if [[ $pages1 > $pages2 ]]
then
  numpages=$pages1
fi

     #Get the paper size:
width1=$( pdfinfo "$1" | grep 'Page size' | awk '{print $3}' )
height1=$( pdfinfo "$1" | grep 'Page size' | awk '{print $5}' )
width2=$( pdfinfo "$2" | grep 'Page size' | awk '{print $3}' )
height2=$( pdfinfo "$2" | grep 'Page size' | awk '{print $5}' )

if [ $(bc <<< "$width1 < $width2") -eq 1 ]
then
  width1=$width2
fi
if [ $(bc <<< "$height1 < $height2") -eq 1 ]
then
  height1=$height2
fi

height=$( echo "scale=2; $height1 * $numpages" | bc )
if [ $(bc <<< "$MAX_HEIGHT < $height") -eq 1 ]
then
  height=$MAX_HEIGHT
fi
papersize="${width1}pt,${height}pt"



    #Make the scrolls:
pdfj="pdfjam --nup 1x$numpages --papersize {${papersize}} --outfile"
$pdfj "$TMPFILE1" "$1"
$pdfj "$TMPFILE2" "$2"

diffpdf "$TMPFILE1" "$TMPFILE2"

rm -f $TMPFILE1 $TMPFILE2

2
ฉันสร้างสคริปท์ของคุณให้เหมาะกับช่องว่างและเพิ่ม tempfiles ที่ไม่เหมือนใคร ฉันหวังว่าคุณจะไม่รังเกียจ
Glutanimate

2
แก้ไขข้อผิดพลาดเล็ก ๆ ที่สคริปต์จะสร้างไฟล์ข้อความเปล่าในไดเรกทอรีทำงาน (จำไว้ว่าให้ใช้เครื่องหมายวงเล็บคู่เสมอถ้ามีคำสั่งที่ใช้ ">" และตัวถูกดำเนินการที่เกี่ยวข้อง)
Glutanimate

2
หนึ่งคำพูดสุดท้าย: สคริปต์นี้จะทำงานได้ดีสำหรับเอกสารขนาด DIN A4 เท่านั้น คุณจะต้องปรับค่า PAGEHEIGHT เพื่อให้สามารถใช้งานกับเอกสารขนาดเล็กได้ ฉันแน่ใจว่ามีวิธีการทำสิ่งนี้โดยอัตโนมัติ แต่ไม่รู้วิธีการชำระเงิน
Glutanimate

2
ขอขอบคุณที่ทำการปรับปรุง @Glutanimate ฉันได้เพิ่มการสนับสนุนสำหรับการเปรียบเทียบไฟล์ PDF ที่มีขนาดตามอำเภอใจและขนาดต่างกัน (ตราบเท่าที่หน้าในแต่ละไฟล์ PDF มีขนาดเท่ากันนั่นก็คือ)
krumpelstiltskin

บันทึกไว้ในส่วนสำคัญเพื่อความสะดวกgist.github.com/timabell/9616807b2fe3fa60f234
Tim Abell

8

แม้ว่าวิธีนี้จะไม่สามารถแก้ปัญหาได้โดยตรง แต่นี่เป็นวิธีที่ดีในการทำทั้งหมดจาก commandline โดยมีการขึ้นต่อกันเล็กน้อย:

diff <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)

https://linux.die.net/man/1/pdftotext

มันใช้งานได้ดีจริง ๆ สำหรับการเปรียบเทียบ PDF พื้นฐาน หากคุณมี pdftotext รุ่นใหม่กว่าคุณสามารถลอง-bboxแทน-layoutได้

เท่าที่โปรแกรมที่แตกต่างไปฉันชอบใช้การกระจายดังนั้นคำสั่งจะเปลี่ยนไปเล็กน้อย:

diffuse <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)

http://diffuse.sourceforge.net/

หวังว่าจะช่วย


3

หากคุณมีไฟล์ขนาดใหญ่ 2-3 ไฟล์ (หรือ epub หรือรูปแบบอื่น ๆ อ่านด้านล่าง) เพื่อเปรียบเทียบจากนั้นคุณสามารถรวมพลังของ:

  1. ความสามารถ (เพื่อแปลงแหล่งที่มาของคุณเป็นข้อความ)

  2. meld (เพื่อค้นหาความแตกต่างระหว่างไฟล์ข้อความ)

  3. ขนาน (เพื่อใช้แกนประมวลผลระบบทั้งหมดของคุณเพื่อเร่งความเร็ว)

สคริปต์ด้านล่างยอมรับว่าเป็นอินพุตของรูปแบบไฟล์ใด ๆ ต่อไปนี้: MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF และ LRS

หากไม่ได้ติดตั้งให้ติดตั้ง meld calibre และ parallel:

#install packages
sudo apt-get -y install meld calibre parallel

เพื่อให้สามารถเรียกใช้รหัสจากที่ใดก็ได้ในคอมพิวเตอร์ของคุณให้บันทึกรหัสต่อไปนี้ในไฟล์ชื่อ "diffepub" (โดยไม่มีส่วนขยาย) ในไดเรกทอรี "/ usr / local / bin"

usage="
*** usage:

diffepub - compare text in two files. Valid format for input files are:
MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF and LRS.

diffepub -h | FILE1 FILE2

-h print this message

Example:
diffepub my_file1.pdf my_file2.pdf
diffepub my_file1.epub my_file2.epub

v0.2 (added parallel and 3 files processing)
"

#parse command line options
while getopts "h" OPTIONS ; do
  case ${OPTIONS} in
    h|-help) echo "${usage}"; exit;;
  esac
done
shift $(($OPTIND - 1))

#check if first 2 command line arguments are files
if [ -z "$1" ] || [ -z "$2" ] || [ ! -f "$1" ] || [ ! -f "$2" ]
then
  echo "ERROR: input files do not exist."
  echo
  echo "$usage"
  exit
fi



#create temporary files (first & last 10 characters of
# input files w/o extension)
file1=`basename "$1" | sed -r -e '
s/\..*$//                     #strip file extension
s/(^.{1,10}).*(.{10})/\1__\2/ #take first-last 10 chars
s/$/_XXX.txt/                 #add tmp file extension
'`
TMPFILE1=$(mktemp --tmpdir "$file1")

file2=`basename "$2" | sed -r -e '
s/\..*$//                     #strip file extension
s/(^.{1,10}).*(.{10})/\1__\2/ #take first-last 10 chars
s/$/_XXX.txt/                 #add tmp file extension
'`
TMPFILE2=$(mktemp --tmpdir "$file2")

if [ "$#" -gt 2 ] 
then
  file3=`basename "$3" | sed -r -e '
  s/\..*$//                     #strip file extension
  s/(^.{1,10}).*(.{10})/\1__\2/ #take first-last 10 chars
  s/$/_XXX.txt/                 #add tmp file extension
  '`
  TMPFILE3=$(mktemp --tmpdir "$file3")
fi

#convert to txt and compare using meld
doit(){ #to solve __space__ between filenames and parallel
  ebook-convert $1
}
export -f doit
if [ "$#" -gt 2 ] 
then
  (parallel doit ::: "$1 $TMPFILE1" \
                     "$2 $TMPFILE2" \
                     "$3 $TMPFILE3" ) &&
  (meld "$TMPFILE1" "$TMPFILE2" "$TMPFILE3")
else
  (parallel doit ::: "$1 $TMPFILE1" \
                     "$2 $TMPFILE2" ) &&
  (meld "$TMPFILE1" "$TMPFILE2")
fi

ตรวจสอบให้แน่ใจว่าเจ้าของเป็นผู้ใช้ของคุณและมีสิทธิ์ดำเนินการ:

sudo chown $USER:$USER /usr/local/bin/diffepub
sudo chmod 700 /usr/local/bin/diffepub

หากต้องการทดสอบเพียงพิมพ์:

diffepub FILE1 FILE2

ฉันทดสอบเพื่อเปรียบเทียบการแก้ไข 2 ครั้งใน 1,600 หน้า pdf และทำงานได้อย่างสมบูรณ์แบบ เนื่องจากความสามารถเขียนโดยใช้ python สำหรับการพกพาใช้เวลา 10 นาทีในการแปลงไฟล์ทั้งสองเป็นข้อความ ช้า แต่เชื่อถือได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.