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.
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.
Câu trả lời:
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).
sudo apt-get install diffpdf
.
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
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ử -bbox
thay 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.
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:
tầm cỡ (để chuyển đổi nguồn của bạn thành văn bản)
meld (để tìm kiếm trực quan sự khác biệt giữa các tệp văn bản)
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.