İki pdf dosyası farklı mı?


39

Bana iki benzer pdf dosyası arasındaki farkları göstermek için iyi bir program arıyorum. Özellikle, dosyaların ascii sürümünde ("pdftotext" ile) sadece farklı olmayan bir şey arıyorum. Bu nedir pdfdiff.py yapar.


Açık kaynaklı ve özgür olmak zorunda mı?
Rinzwind

@ Rinzwind: Elbette tercih edilirdi.
krumpelstiltskin

inetsoftware.de/other-products/pdf-content-comparer/… 2.2 burada Linux (runPDFC.sh) altında kullanılabileceğini ancak dosyanın arşivde olmadığını (sadece bir yarasa ...) belirtir ancak java yani belki yeniden adlandırarak (?)
Rinzwind

@ Rinzwind: Neden işe yaramadığını anlamak için java hakkında yeterince bilgim yok. Yaparım: java -cp. -jar PDFC.jar ama bir java.lang.NoClassDefFoundError alın :(
krumpelstiltskin

@ Rinzwind: Bunu pencerelerde koştum; program korkunç. okunamayan png oluşturur.
krumpelstiltskin

Yanıtlar:


28

Bunun için DiffPDF'yi kullanabilirsiniz . Açıklamadan:

DiffPDF iki PDF dosyasını karşılaştırmak için kullanılır. Varsayılan olarak karşılaştırma, her bir sayfa çiftindeki metinden yapılır, ancak sayfaların görünümünü karşılaştırmak da desteklenir (örneğin, bir diyagram değişirse veya paragraf yeniden biçimlendirilmişse). Belirli sayfaları veya sayfa aralıklarını kaldırmak da mümkündür. Örneğin, bir PDF dosyasının iki sürümü varsa, biri sayfa 1-12, biri sayfa 1-4 eklenmiş olduğu için sayfa 1-13 eklenmişse, iki sayfa aralığı belirtilerek karşılaştırılabilir. Birinci için -12 ve ikinci için 1-3, 5-13. Bu, DiffPDF'nin sayfaları (1, 1), (2, 2), (3, 3), (4, 5), (5, 6) ve benzeri sayfalarda (12, 13) karşılaştırmasını sağlar.


2
Bu gördüğüm en iyisi. Gördüğüm tek sorun sayfa pdfs sayfasını karşılaştırması. Dolayısıyla, sayfa 1'deki bir paragrafı eklerseniz, bundan sonra her sayfanın başlangıcı ve bitişi eşleşmez. :(
krumpelstiltskin

3
Bence bu bağlantı artık doğru değil. Yeni sürüm 3. * sadece pencereler için mevcut görünüyor. Eski sürüm 2. * yine de üzerinden yüklenebilir sudo apt-get install diffpdf.
peq

22

DiffPDF (@qbi tarafından önerilen program) ufak değişikliklerden daha fazlası için kullanılabilir hale getirmek için bir saldırı buldum. Yaptığım şey tüm sayfaları pdfs'de pdfjam kullanarak uzun bir kaydırmada birleştirmek ve sonra kaydırmaları karşılaştırmak. Büyük bölümler çıkarıldığında veya takıldığında bile çalışır!

İşte işi yapan bir bash betiği:

#!/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
Komut dosyanızı boşlukla uyumlu hale getirdim ve benzersiz geçici dosyalar ekledim. Umarım sakıncası yoktur.
16’da

2
Ayrıca betiğin çalışma dizininde boş bir metin dosyası oluşturacağı küçük bir hata düzeltildi. (">" ifadesini ve ilgili operandları kullanan her zaman çift parantez kullanmayı unutmayın.)
Glutanimate

2
Son bir not: Bu senaryo sadece DIN A4 boyutlu belgeler için iyi çalışacaktır. Daha küçük belgelerle çalışması için PAGEHEIGHT değerini ayarlamanız gerekir. Eminim bunu otomatikleştirmenin bir yolu vardır, ama nasıl atm bilmiyorum.
17’de

2
@Glutanimate geliştirmeleri yaptığınız için teşekkür ederiz. İsteğe bağlı ve farklı boyutlarda pdf'lerin karşılaştırılması için destek ekledim (her pdf içindeki sayfalar aynı boyutta olduğu sürece).
krumpelstiltskin

kolaylık için özünden kaydedilir gist.github.com/timabell/9616807b2fe3fa60f234
Tim Abell

8

Bu, sorunu doğrudan çözmese de, hepsini birkaç bağımlılıkla komut satırından yapmanın güzel bir yolu:

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

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

Temel pdf karşılaştırmaları için gerçekten iyi çalışıyor. Daha yeni bir pdftotext sürümüne sahipseniz -bboxbunun yerine deneyebilirsiniz -layout.

Farklı programlar devam ederken, diffuse kullanmaktan hoşlanıyorum, bu yüzden komut hiç bu kadar hafif değişmedi:

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

http://diffuse.sourceforge.net/

Umarım yardımcı olur.


3

Karşılaştırma yapmak için 2-3 dev pdf (veya epub veya başka biçimlerde, aşağıda okuyan) dosyalarınız varsa, gücünü birleştirmek mümkündür:

  1. calibre (kaynağınızı metne dönüştürmek için)

  2. meld (Metin dosyaları arasındaki farkları görsel olarak aramak için)

  3. paralel (hızlandırmak için tüm sistem çekirdeklerinizi kullanmak için)

Aşağıdaki komut dosyası aşağıdaki dosya formatlarından herhangi birini girdi olarak kabul eder: MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF ve LRS.

Takılı değilse, meld, calibre ve paralel'i kurun:

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

Kodu bilgisayarınızın herhangi bir yerinden yürütebilmek için, aşağıdaki kodu "/ usr / local / bin" dizinindeki "diffepub" (uzantısız) bir dosyaya kaydedin.

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

Sahibin sizin kullanıcınız olduğundan ve yürütme izinlerine sahip olduğundan emin olun:

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

Test etmek için, sadece şunu yazın:

diffepub FILE1 FILE2

+1600 sayfalık pdf sayfasının 2 düzeltmesini karşılaştırmak için test ediyorum ve mükemmel çalışıyor. Calibre taşınabilirlik için python kullanılarak yazıldığından, her iki dosyayı da metne dönüştürmek 10 dakika sürdü. Yavaş ama güvenilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.