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.
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.
Yanıtlar:
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.
sudo apt-get install diffpdf
.
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
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 -bbox
bunun 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.
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:
calibre (kaynağınızı metne dönüştürmek için)
meld (Metin dosyaları arasındaki farkları görsel olarak aramak için)
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.