我正在寻找一个好的程序来向我展示两个相似的 pdf 文件之间的差异。特别是,我正在寻找一个不仅仅在文件的 ascii 版本上运行 diff(使用“pdftotext”)。这就是pdfdiff.py做。
答案1
您可以使用差异PDF为此。从描述来看:
DiffPDF 用于比较两个 PDF 文件。默认情况下,比较的是每对页面上的文本,但也支持比较页面的外观(例如,如果更改了图表或重新格式化了段落)。也可以比较特定的页面或页面范围。例如,如果 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
我刚刚想出了一个办法,让 DiffPDF(@qbi 建议的程序)不仅能用于小改动。我的做法是将所有页面 pdf 连接成一个长滚动条,使用pdfjam然后比较卷轴。即使移除或插入大段内容,它也能正常工作!
下面是完成这个工作的 bash 脚本:
#!/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
答案3
尽管这不能直接解决问题,但这里有一个通过命令行用很少的依赖项完成所有操作的好方法:
diff <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)
https://linux.die.net/man/1/pdftotext
它对于基本的 pdf 比较非常有用。如果您有较新版本的 pdftotext,您可以尝试使用-bbox
它-layout
。
就差异化程序而言,我喜欢使用 diff,因此命令会略有变化:
diffuse <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)
http://diffuse.sourceforge.net/
希望有所帮助。
答案4
我们一直在研究一种工具并希望参与其中。
如果你愿意尝试在线工具,我们在Draftable.com它能实现您想要的功能 - 比较两个 PDF/Word 文件并显示删除和添加的内容。
目前,我们的桌面版本仅适用于 Windows;但是,我们也有一个几年前发布的 API,对于有大量数据或有安全顾虑的人来说,它运行良好。
我准备了一张图片(链接如下),这样你就可以看到输出结果,而不需要访问网站。非常感谢您的反馈!