Diff của hai tập tin pdf?


39

Tôi đang tìm một chương trình tốt để cho tôi thấy sự khác biệt giữa hai tệp pdf tương tự. Cụ thể, tôi đang tìm kiếm thứ gì đó không chạy diff trên phiên bản ascii (với "pdftotext") của các tệp. Đây là những gì pdfdiff.py làm.


Nó có phải là nguồn mở và miễn phí không?
Rinzwind

@Rinzwind: Điều đó sẽ tốt hơn, tất nhiên.
krumpelstiltskin

inetsoftware.de/other-products/pdf-content-comparer/ Khăn 2.2 ở đây nói rằng nó có thể được sử dụng trong Linux (runPDFC.sh) nhưng tệp không nằm trong kho lưu trữ (chỉ là một con dơi ...) nhưng nó là java có thể đổi tên nó (?)
Rinzwind

@Rinzwind: tôi không biết đủ về java để tìm hiểu tại sao nó không chạy. tôi làm: java -cp. -jar PDFC.jar nhưng nhận java.lang.NoClassDefFoundError :(
krumpelstiltskin

@Rinzwind: tôi đã chạy cái này trên windows; chương trình rất tệ nó tạo ra png không thể đọc được
krumpelstiltskin

Câu trả lời:


28

Bạn có thể sử dụng DiffPDF cho việc này. Từ mô tả:

DiffPDF được sử dụng để so sánh hai tệp PDF. Theo mặc định, so sánh là văn bản trên mỗi cặp trang, nhưng so sánh sự xuất hiện của các trang cũng được hỗ trợ (ví dụ: nếu một sơ đồ được thay đổi hoặc một đoạn được định dạng lại). Cũng có thể c> bao gồm các trang hoặc phạm vi trang cụ thể. Ví dụ: nếu có hai phiên bản của tệp PDF, một phiên bản có trang 1-12 và phiên bản khác có trang 1-13 do có thêm một trang được thêm vào như trang 4, chúng có thể được so sánh bằng cách chỉ định hai phạm vi trang, 1 -12 cho lần đầu tiên và 1-3, 5-13 cho lần thứ hai. Điều này sẽ làm cho DiffPDF so sánh các trang trong các cặp (1, 1), (2, 2), (3, 3), (4, 5), (5, 6), v.v., (12, 13).


2
Đây là thứ tốt nhất tôi từng thấy. Vấn đề duy nhất tôi thấy là nó so sánh từng trang pdfs. Vì vậy, nếu bạn thêm một đoạn trên trang 1, thì việc xin và kết thúc của mỗi trang sau đó không khớp. :(
krumpelstiltskin

3
Tôi nghĩ rằng các liên kết là không còn chính xác. Phiên bản mới 3. * dường như chỉ có sẵn cho windows. Phiên bản cũ 2. * vẫn có thể được cài đặt qua sudo apt-get install diffpdf.
peq

22

Tôi chỉ cần tìm ra một hack để làm cho DiffPDF (chương trình được đề xuất bởi @qbi) có thể sử dụng được nhiều hơn những thay đổi nhỏ. Những gì tôi làm là ghép tất cả các trang pdf thành một cuộn dài bằng pdfjam và sau đó so sánh các cuộn. Nó hoạt động ngay cả khi các phần lớn được gỡ bỏ hoặc chèn!

Đây là một kịch bản bash thực hiện công việc:

#!/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
Tôi đã tạo tập lệnh của bạn tương thích khoảng trắng và thêm tempfiles duy nhất. Tôi hy vọng bạn không phiền.
Glutimate

2
Cũng sửa một lỗi nhỏ trong đó tập lệnh sẽ tạo một tệp văn bản trống trong thư mục làm việc. (hãy nhớ luôn luôn sử dụng dấu ngoặc kép với các câu lệnh if sử dụng ">" và các toán hạng liên quan.)
Glutimate

2
Một lưu ý cuối cùng: Kịch bản này sẽ chỉ hoạt động tốt đối với các tài liệu có kích thước DIN A4. Bạn sẽ phải điều chỉnh giá trị PAGEHEIGHT để làm cho nó hoạt động với các tài liệu nhỏ hơn. Tôi chắc chắn có một cách để tự động hóa việc này nhưng không biết làm thế nào atm.
Glutimate

2
Cảm ơn bạn đã thực hiện những cải tiến @Glutanimate. Tôi đã thêm hỗ trợ để so sánh các pdf có kích thước tùy ý và khác nhau (miễn là các trang trong mỗi pdf có kích thước đồng nhất, nghĩa là).
krumpelstiltskin

được lưu vào một ý chính để thuận tiện gist.github.com/timabell/9616807b2fe3fa60f234
Tim Abell

8

Mặc dù điều này không giải quyết vấn đề trực tiếp, đây là một cách hay để làm tất cả từ dòng lệnh với một vài phụ thuộc:

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

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

Nó hoạt động thực sự tốt cho các so sánh pdf cơ bản. Nếu bạn có phiên bản mới hơn của pdftotext, bạn có thể thử -bboxthay thế -layout.

Theo như các chương trình khác nhau, tôi thích sử dụng khuếch tán, vì vậy lệnh thay đổi rất nhẹ:

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

http://diffuse.sourceforge.net/

Mong rằng sẽ giúp.


3

Nếu bạn có 2-3 tệp pdf lớn (hoặc epub hoặc các định dạng khác, hãy đọc bên dưới) để so sánh, thì có thể kết hợp sức mạnh của:

  1. tầm cỡ (để chuyển đổi nguồn của bạn thành văn bản)

  2. meld (để tìm kiếm trực quan sự khác biệt giữa các tệp văn bản)

  3. song song (để sử dụng tất cả các lõi hệ thống của bạn để tăng tốc)

Tập lệnh bên dưới chấp nhận làm đầu vào bất kỳ định dạng tệp nào sau đây: MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF và LRS.

Nếu không được cài đặt, sau đó cài đặt meld, caliber và song song:

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

Để có thể thực thi mã từ bất kỳ đâu trong máy tính của bạn, hãy lưu mã sau vào một tệp có tên "diffepub" (không có phần mở rộng) trong thư mục "/ 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

Đảm bảo chủ sở hữu là người dùng của bạn và nó có quyền thực thi:

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

Để kiểm tra nó, chỉ cần gõ:

diffepub FILE1 FILE2

Tôi kiểm tra nó để so sánh 2 phiên bản pdf +1600 trang và nó hoạt động hoàn hảo. Vì cỡ nòng được viết bằng python cho tính di động, nên mất 10 phút để chuyển đổi cả hai tệp thành văn bản. Chậm, nhưng đáng tin cậy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.