2つのPDFファイルの差分?


39

2つの類似したpdfファイルの違いを示す良いプログラムを探しています。特に、ファイルのアスキーバージョン( "pdftotext")でdiffを実行するだけではないものを探しています。これがpdfdiff.pyの機能です。


オープンソースで無料でなければなりませんか?
リンツウィンド

@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は、2つのPDFファイルを比較するために使用されます。デフォルトでは、比較はページの各ペアのテキストで行われますが、ページの外観の比較もサポートされています(たとえば、図が変更されたり、段落が再フォーマットされた場合)。特定のページまたはページ範囲をオンにすることもできます。たとえば、2つのバージョンのPDFファイルがある場合、1つはページ1-12で、もう1つはページ4として追加されたページが1から13である場合、2つのページ範囲を指定して比較できます、1最初の場合は-12、2番目の場合は1〜3、5〜13です。これにより、DiffPDFは(1、1)、(2、2)、(3、3)、(4、5)、(5、6)などのペアのページを(12、13)と比較します。


2
これは私が見た中で最高です。私が見る唯一の問題は、pdfをページごとに比較することです。たとえば、ページ1に段落を追加すると、その後の各ページの始まりと終わりが一致しなくなります。:(
krumpelstiltskin

3
リンクはもう正しくないと思います。新しいバージョン3. *は、Windowsでのみ使用できるようです。sudo apt-get install diffpdfただし、古いバージョン2. *は、まだインストールできます。
ペック14

22

DiffPDF(@qbiが提案するプログラム)を小さな変更以上に使用できるようにするためのハックを見つけました。私がやることは、pdfjamを使用してすべてのページのpdfを連結して長いスクロールにし、スクロールを比較することです。大きなセクションが削除または挿入されても機能します!

これを実行する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
スクリプトを空白に対応させ、一意の一時ファイルを追加しました。気にしないでください。
グルタニメート

2
また、スクリプトが作業ディレクトリに空のテキストファイルを作成するという小さなバグを修正しました。( ">"および関連するオペランドを使用するifステートメントでは常に二重括弧を使用することを忘れないでください。)
グルタニメート

2
最後に、このスクリプトはDIN A4サイズのドキュメントでのみ正常に機能します。PAGEHEIGHT値を調整して、小さなドキュメントで機能するようにする必要があります。これを自動化する方法があると確信していますが、どのようにATMがわからないのでしょう。
グルタニメート

2
@Glutanimateを改善してくれてありがとう。任意のサイズと異なるサイズのpdfの比較のサポートを追加しました(各pdf内のページが均一なサイズである限り)。
-krumpelstiltskin

コンビニエンスための要旨に保存gist.github.com/timabell/9616807b2fe3fa60f234
ティム・アベル

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を使用するのが好きなので、コマンドはこれまでとは少し異なります。

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

http://diffuse.sourceforge.net/

お役に立てば幸いです。


4

比較する2〜3個の巨大なpdf(またはepubまたは他の形式、以下をお読みください)ファイルがある場合は、次の機能を組み合わせることができます。

  1. 口径(ソースをテキストに変換するため)

  2. meld(テキストファイル間の違いを視覚的に検索するため)

  3. 並列(すべてのシステムコアを使用して高速化する)

以下のスクリプトは、MOBI、LIT、PRC、EPUB、ODT、HTML、CBR、CBZ、RTF、TXT、PDF、およびLRSのいずれかのファイル形式を入力として受け入れます。

インストールされていない場合は、meld、calibre、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の2つのリビジョンを比較するためにテストし、完璧に動作します。Calibreは移植性のためにPythonを使用して記述されているため、両方のファイルをテキストに変換するのに10分かかりました。遅いが信頼できる。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.