두 개의 PDF 파일의 차이점은 무엇입니까?


39

두 개의 유사한 pdf 파일의 차이점을 보여줄 수있는 좋은 프로그램을 찾고 있습니다. 특히, 나는 파일의 ascii 버전 ( "pdftotext")에서 diff를 실행하지 않는 것을 찾고 있습니다. 이것이 pdfdiff.py의 기능 입니다.


공개 소스 여야하고 무료 여야합니까?
Rinzwind

@Rinzwind : 물론 바람직하다.
krumpelstiltskin

여기에서 inetsoftware.de/other-products/pdf-content-comparer / ... 2.2는 Linux (runPDFC.sh)에서 사용할 수 있지만 파일은 아카이브에 없지만 (bat)에만 있지만 java이므로 아마 그것의 이름을 바꿀까요? (?)
Rinzwind

@Rinzwind : java가 왜 실행되지 않는지 알아낼만큼 충분하지 않습니다. 나는 : java -cp. -jar PDFC.jar하지만 java.lang.NoClassDefFoundError가를 :( 얻을
krumpelstiltskin

@Rinzwind : 나는 이것을 Windows에서 실행했다. 프로그램은 끔찍하다. 읽을 수없는 png를 만듭니다.
krumpelstiltskin

답변:


28

이를 위해 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)과 비교하게됩니다.


2
이것이 내가 본 것 중 최고입니다. 내가 볼 수있는 유일한 문제는 페이지마다 pdf를 비교한다는 것입니다. 따라서 1 페이지에 단락을 추가하면 그 이후의 모든 페이지의 시작과 끝이 일치하지 않습니다. :(
krumpelstiltskin

3
링크가 더 이상 정확하지 않다고 생각합니다. 새로운 버전 3. *는 Windows에서만 사용할 수있는 것 같습니다. 그래도 이전 버전 2. *를 여전히 설치할 수 있습니다 sudo apt-get install diffpdf.
peq

22

방금 DiffPDF (@qbi가 제안한 프로그램)를 사소한 변경 이상으로 사용할 수 있도록 해킹을 찾았습니다. 내가하는 일은 모든 페이지 pdfpdfjam을 사용하여 긴 스크롤로 연결 한 다음 스크롤을 비교하는 것입니다. 큰 섹션을 제거하거나 삽입 한 경우에도 작동합니다!

다음은 작업을 수행하는 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

2
스크립트를 공백과 호환하고 고유 한 임시 파일을 추가했습니다. 나는 당신이 상관하지 않기를 바랍니다.
Glutanimate

2
스크립트가 작업 디렉토리에 빈 텍스트 파일을 생성하는 작은 버그도 수정했습니다. ( ">"및 관련 피연산자를 사용하는 if 문에는 항상 대괄호를 사용해야합니다.)
Glutanimate

2
마지막 설명 :이 스크립트는 DIN A4 크기의 문서에만 적합합니다. 작은 문서에서 작업하려면 PAGEHEIGHT 값을 조정해야합니다. 자동화 할 수있는 방법이 있지만 확실하지는 않습니다.
Glutanimate

2
@Glutanimate를 개선해 주셔서 감사합니다. 임의의 크기와 다른 크기의 PDF를 비교할 수있는 지원을 추가했습니다 (각 PDF의 페이지 크기가 균일 한 한).
krumpelstiltskin

편의를 위해 요지에 저장 됨 gist.github.com/timabell/9616807b2fe3fa60f234
Tim Abell

8

이 방법으로 문제를 직접 해결할 수는 없지만 몇 가지 종속성이있는 명령 줄에서이 모든 것을 수행 할 수있는 좋은 방법이 있습니다.

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/

희망이 도움이됩니다.


3

비교할 2-3 개의 거대한 pdf (또는 epub 또는 기타 형식, 아래를 읽으십시오) 파일이있는 경우 다음과 같은 기능을 결합 할 수 있습니다.

  1. 구경 (소스를 텍스트로 변환)

  2. meld (텍스트 파일 간의 차이점을 시각적으로 검색)

  3. 병렬 (모든 시스템 코어를 사용하여 속도 향상)

아래 스크립트는 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 분이 걸렸습니다. 느리지 만 신뢰할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.