두 개의 유사한 pdf 파일의 차이점을 보여줄 수있는 좋은 프로그램을 찾고 있습니다. 특히, 나는 파일의 ascii 버전 ( "pdftotext")에서 diff를 실행하지 않는 것을 찾고 있습니다. 이것이 pdfdiff.py의 기능 입니다.
두 개의 유사한 pdf 파일의 차이점을 보여줄 수있는 좋은 프로그램을 찾고 있습니다. 특히, 나는 파일의 ascii 버전 ( "pdftotext")에서 diff를 실행하지 않는 것을 찾고 있습니다. 이것이 pdfdiff.py의 기능 입니다.
답변:
이를 위해 DiffPDF 를 사용할 수 있습니다 . 설명에서 :
DiffPDF는 두 개의 PDF 파일을 비교하는 데 사용됩니다. 기본적으로 각 페이지 쌍의 텍스트를 비교하지만 페이지 모양을 비교하는 것도 지원됩니다 (예 : 다이어그램이 변경되거나 단락이 다시 포맷 된 경우). 특정 페이지 또는 페이지 범위를 생략 할 수도 있습니다. 예를 들어, 4 페이지로 추가 된 페이지가 추가되어 1 ~ 12 페이지의 페이지와 1 ~ 13 페이지의 2 가지 버전의 PDF 파일이있는 경우 두 페이지 범위를 지정하여 비교할 수 있습니다. 첫 번째는 -12, 두 번째는 1-3, 5-13입니다. 이렇게하면 DiffPDF가 (1, 1), (2, 2), (3, 3), (4, 5), (5, 6) 등의 페이지를 (12, 13)과 비교하게됩니다.
sudo apt-get install diffpdf
.
방금 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
이 방법으로 문제를 직접 해결할 수는 없지만 몇 가지 종속성이있는 명령 줄에서이 모든 것을 수행 할 수있는 좋은 방법이 있습니다.
diff <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)
https://linux.die.net/man/1/pdftotext
기본 pdf 비교에는 정말 효과적입니다. 최신 버전의 pdftotext를 사용하는 경우 -bbox
대신 시도해보십시오 -layout
.
diffing 프로그램이 진행되는 한 확산을 사용하는 것이 좋으므로 명령이 약간 변경됩니다.
diffuse <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)
http://diffuse.sourceforge.net/
희망이 도움이됩니다.
비교할 2-3 개의 거대한 pdf (또는 epub 또는 기타 형식, 아래를 읽으십시오) 파일이있는 경우 다음과 같은 기능을 결합 할 수 있습니다.
구경 (소스를 텍스트로 변환)
meld (텍스트 파일 간의 차이점을 시각적으로 검색)
병렬 (모든 시스템 코어를 사용하여 속도 향상)
아래 스크립트는 MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF 및 LRS 파일 형식 중 하나를 입력으로 허용합니다.
설치되지 않은 경우 meld, caliber 및 parallel을 설치하십시오.
#install packages
sudo apt-get -y install meld calibre parallel
컴퓨터의 어느 곳에서나 코드를 실행하려면 "/ usr / local / bin"디렉토리의 "diffepub"(확장자 없음) 파일에 다음 코드를 저장하십시오.
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
나는 +1600 페이지 pdf의 두 개정판을 비교하기 위해 테스트했으며 완벽하게 작동합니다. 구경은 이식성을 위해 파이썬을 사용하여 작성되었으므로 두 파일을 텍스트로 변환하는 데 10 분이 걸렸습니다. 느리지 만 신뢰할 수 있습니다.