Diff dari dua file pdf?

39

Saya sedang mencari program yang bagus untuk menunjukkan kepada saya perbedaan antara dua file pdf yang serupa. Secara khusus, saya mencari sesuatu yang tidak hanya menjalankan diff pada versi ascii (dengan "pdftotext") dari file. Inilah yang dilakukan pdfdiff.py .

krumpelstiltskin
sumber
Apakah harus open source dan gratis?
Rinzwind
@Rinzwind: Tentu saja itu lebih disukai.
krumpelstiltskin
inetsoftware.de/other-products/pdf-content-comparer/... 2.2 di sini menyatakan dapat digunakan di Linux (runPDFC.sh) tetapi file tersebut tidak ada dalam arsip (hanya kelelawar ...) tetapi itu adalah java jadi mungkin mengubah nama itu (?)
Rinzwind
@Rinzwind: saya tidak cukup tahu tentang java untuk mencari tahu mengapa itu tidak berjalan. saya lakukan: java -cp. -jar PDFC.jar tetapi dapatkan java.lang.NoClassDefFoundError :(
krumpelstiltskin
@Rinzwind: saya menjalankan ini di windows; program ini mengerikan. itu menciptakan png yang tidak terbaca.
krumpelstiltskin

Jawaban:

28

Anda dapat menggunakan DiffPDF untuk ini. Dari uraian:

DiffPDF digunakan untuk membandingkan dua file PDF. Secara default perbandingannya adalah teks pada setiap pasangan halaman, tetapi membandingkan tampilan halaman juga didukung (misalnya, jika diagram diubah atau paragraf diformat ulang). Dimungkinkan juga untuk membandingkan halaman tertentu atau rentang halaman. Misalnya, jika ada dua versi file PDF, satu dengan halaman 1-12 dan yang lainnya dengan halaman 1-13 karena halaman tambahan telah ditambahkan sebagai halaman 4, mereka dapat dibandingkan dengan menentukan dua rentang halaman, 1 -12 untuk yang pertama dan 1-3, 5-13 untuk yang kedua. Ini akan membuat DiffPDF membandingkan halaman dalam pasangan (1, 1), (2, 2), (3, 3), (4, 5), (5, 6), dan seterusnya, hingga (12, 13).

qbi
sumber
2
Ini yang terbaik yang pernah saya lihat. Satu-satunya masalah yang saya lihat adalah membandingkan halaman pdf untuk halaman. Jadi, jika Anda menambahkan paragraf di katakanlah, halaman 1, awal dan akhir setiap halaman setelah itu tidak cocok. :(
krumpelstiltskin
3
Saya pikir tautannya tidak lagi benar. Versi baru 3. * tampaknya hanya tersedia untuk windows. Versi lama 2. * masih dapat diinstal melalui sudo apt-get install diffpdf.
peq
22

Saya baru saja menemukan hack untuk membuat DiffPDF (program yang disarankan oleh @qbi) dapat digunakan untuk lebih dari perubahan kecil. Apa yang saya lakukan adalah menggabungkan semua halaman pdf menjadi gulungan panjang menggunakan pdfjam dan kemudian membandingkan gulungan. Ini bekerja bahkan ketika bagian besar dihapus atau dimasukkan!

Berikut ini skrip bash yang berfungsi:

#!/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
krumpelstiltskin
sumber
2
Saya membuat skrip Anda yang kompatibel dengan spasi putih dan menambahkan tempfiles unik. Saya harap kamu tidak keberatan.
Glutanimate
2
Juga memperbaiki bug kecil di mana skrip akan membuat file teks kosong di direktori kerja. (ingatlah untuk selalu menggunakan tanda kurung ganda dengan pernyataan if yang menggunakan ">" dan operan terkait.)
Glutanimate
2
Satu komentar terakhir: Skrip ini hanya akan berfungsi dengan baik untuk dokumen berukuran DIN A4. Anda harus menyesuaikan nilai PAGEHEIGHT untuk membuatnya berfungsi dengan dokumen yang lebih kecil. Saya yakin ada cara untuk mengotomatisasi ini tetapi tidak tahu bagaimana atm.
Glutanimate
2
Terima kasih telah melakukan peningkatan @Glutanimate. Saya telah menambahkan dukungan untuk perbandingan pdf dengan ukuran sewenang-wenang dan berbeda (selama halaman dalam masing-masing pdf berukuran seragam, yaitu).
krumpelstiltskin
disimpan ke intisari untuk kenyamanan gist.github.com/timabell/9616807b2fe3fa60f234
Tim Abell
8

Meskipun ini tidak menyelesaikan masalah secara langsung, berikut adalah cara yang bagus untuk melakukan semuanya dari commandline dengan beberapa dependensi:

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

https://linux.die.net/man/1/pdftotext

Ini bekerja sangat baik untuk perbandingan pdf dasar. Jika Anda memiliki versi yang lebih baru dari pdftotext Anda dapat mencoba -bboxbukan -layout.

Sejauh program diffing pergi, saya suka menggunakan difuse, jadi perintahnya berubah sedikit:

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

http://diffuse.sourceforge.net/

Semoga itu bisa membantu.

phyatt
sumber
4

Jika Anda memiliki 2-3 file pdf besar (atau epub atau format lain, baca di bawah) untuk dibandingkan, maka dimungkinkan untuk menggabungkan kekuatan:

  1. kaliber (untuk mengonversi sumber Anda ke teks)

  2. berbaur (untuk mencari perbedaan antara file teks) secara visual

  3. paralel (untuk menggunakan semua inti sistem Anda untuk mempercepat)

Skrip di bawah ini menerima sebagai input format file berikut: MOBI, LIT, RRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF dan LRS.

Jika tidak diinstal, instal meld, kaliber dan paralel:

#install packages
sudo apt-get -y install meld calibre parallel

Untuk dapat mengeksekusi kode dari mana saja di komputer Anda, simpan kode berikut dalam file bernama "diffepub" (tanpa ekstensi) di dalam direktori "/ 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

Pastikan pemiliknya adalah pengguna Anda dan memiliki izin eksekusi:

sudo chown $USER:$USER /usr/local/bin/diffepub
sudo chmod 700 /usr/local/bin/diffepub

Untuk mengujinya, cukup ketik:

diffepub FILE1 FILE2

Saya mengujinya untuk membandingkan 2 revisi dari +1600 halaman pdf dan berfungsi sempurna. Karena kaliber ditulis menggunakan python untuk portabilitas, butuh 10 menit untuk mengonversi kedua file menjadi teks. Lambat, tapi bisa diandalkan.

luis_js
sumber