Pertanyaan Diff dari dua file pdf?


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


32
2018-05-06 19:43


asal


Apakah harus open source dan gratis? - Rinzwind
@Rinzwind: Tentu saja itu lebih baik. - krumpelstiltskin
inetsoftware.de/other-products/pdf-content-comparer/… 2.2 di sini menyatakan itu dapat digunakan di Linux (runPDFC.sh) tetapi file tersebut tidak dalam arsip (hanya kelelawar ...) tetapi itu adalah java jadi mungkin mengganti namanya (?) - 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 jendela; programnya mengerikan. itu menciptakan png yang tidak terbaca. - krumpelstiltskin


Jawaban:


Kamu dapat memakai DiffPDF untuk ini. Dari uraian:

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


24
2018-05-06 23:18



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 katakan, halaman 1, permulaan dan akhir setiap halaman setelah itu tidak cocok. :( - krumpelstiltskin
Saya pikir tautannya tidak lagi benar. Versi baru 3. * sepertinya hanya tersedia untuk windows. Versi lama 2. * masih bisa diinstal via sudo apt-get install diffpdf, meskipun. - peq


Saya baru saja menemukan sebuah 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 ke dalam sebuah gulungan panjang menggunakan pdfjam lalu bandingkan gulungan itu. Ia bekerja bahkan ketika bagian besar dihapus atau dimasukkan!

Berikut ini skrip bash yang melakukan pekerjaan:

#!/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

17
2018-05-19 02:33



Saya membuat skrip Anda yang kompatibel dengan whitespace dan menambahkan tempfiles unik. Aku harap kamu tidak keberatan. - Glutanimate
Juga memperbaiki bug kecil di mana skrip akan membuat file teks kosong di direktori kerja. (ingat untuk selalu menggunakan tanda kurung ganda dengan jika pernyataan yang menggunakan ">" dan operan terkait.) - Glutanimate
Satu komentar terakhir: Skrip ini akan berfungsi dengan baik hanya untuk dokumen berukuran DIN A4. Anda harus menyesuaikan nilai PAGEHEIGHT agar dapat bekerja dengan dokumen yang lebih kecil. Saya yakin ada cara untuk mengotomatisasi ini tetapi tidak tahu bagaimana atm. - Glutanimate
Terima kasih telah melakukan perbaikan @Glutanimate. Saya telah menambahkan dukungan untuk perbandingan pdf ukuran sewenang-wenang dan berbeda (selama halaman dalam setiap pdf adalah ukuran seragam, yaitu). - krumpelstiltskin
disimpan ke inti untuk kenyamanan gist.github.com/timabell/9616807b2fe3fa60f234 - Tim Abell


Meskipun ini tidak menyelesaikan masalah secara langsung, ini 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 pdftotext yang lebih baru, Anda dapat mencoba -bbox dari pada -layout.

Sejauh program diffing pergi, saya suka menggunakan diffuse, jadi perintah berubah sedikit sekali:

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

http://diffuse.sourceforge.net/

Semoga itu membantu.


5
2018-05-11 15:39





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

  1. kaliber (untuk mengubah sumber Anda menjadi teks)

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

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

Di bawah skrip menerima sebagai masukan salah satu format file berikut: MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF dan LRS.

Jika tidak diinstal, lalu pasang 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, ketikkan saja:

diffepub FILE1 FILE2

Saya mengujinya untuk membandingkan 2 revisi pdf +1600 halaman dan itu bekerja sempurna. Karena kaliber ditulis menggunakan python untuk portabilitas, butuh 10 menit untuk mengonversi kedua file menjadi teks. Lambat, tetapi dapat diandalkan.


2
2017-09-08 09:02