Различаются два файла PDF?

Я ищу хорошую программу, чтобы показать мне различия между двумя похожими PDF-файлами. В частности, я ищу что-то, что не просто запускает diff для версии ascii (с "pdftotext") файлов. Это то, что делает pdfdiff.py .

36
задан 28 March 2014 в 06:03

4 ответа

Если у вас есть 2-3 огромных файла в формате pdf (или epub или других форматах, см. Ниже) для сравнения, тогда можно объединить мощность:

  1. калибр (для преобразовать ваш источник в текст)

  2. meld (для визуального поиска различий между текстовыми файлами)

  3. параллельно (чтобы использовать всю вашу систему ядер для ускорения)

Ниже скрипт принимает в качестве входных данных любой из следующих форматов файлов: MOBI, LIT, PRC, EPUB, ODT, HTML, CBR, CBZ, RTF, TXT, PDF и LRS.

Если не установлено, установите meld, калибр и параллель:

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

Чтобы иметь возможность выполнить код из любой точки вашего компьютера, сохраните следующий код в файле с именем «difpub» (без расширения) внутри каталога "/ 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

Убедитесь, что владелец является вашим пользователем и у него есть права на выполнение:

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

Чтобы проверить это, просто введите:

diffepub FILE1 FILE2

Я проверяю его сравнить 2 ревизии +1600 страниц PDF, и он отлично работает. Поскольку Calibre написан с использованием Python для переносимости, преобразование обоих файлов в текст заняло 10 минут. Медленно, но надежно.

0
ответ дан 28 March 2014 в 06:03

Я только что понял, как использовать DiffPDF (программу, предложенную @qbi) для более чем незначительных изменений. Что я делаю, это объединяю все страницы pdf в длинную прокрутку, используя pdfjam , а затем сравниваю прокрутки Он работает даже при удалении или вставке больших разделов!

Вот скрипт 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
0
ответ дан 28 March 2014 в 06:03

Для этого вы можете использовать DiffPDF . Из описания:

DiffPDF используется для сравнения двух файлов PDF. По умолчанию сравнение выполняется для текста на каждой паре страниц, но сравнение внешнего вида страниц также поддерживается (например, если диаграмма изменена или переформатирован абзац). Также возможно сравнение отдельных страниц или диапазонов страниц. Например, если существует две версии файла PDF, одна со страницами 1-12, а другая со страницами 1-13 из-за добавления дополнительной страницы как страницы 4, их можно сравнить, указав два диапазона страниц: 1 -12 для первого и 1-3, 5-13 для второго. Это заставит DiffPDF сравнивать страницы в парах (1, 1), (2, 2), (3, 3), (4, 5), (5, 6) и т. Д. С (12, 13).

0
ответ дан 28 March 2014 в 06:03

Хотя это не решает проблему напрямую, вот хороший способ сделать все это из командной строки с несколькими зависимостями:

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

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

Это действительно хорошо работает для базового сравнения PDF. Если у вас есть более новая версия pdftotext, вы можете попробовать -bbox вместо -layout.

Что касается программ сравнения, мне нравится использовать diffuse, поэтому команда меняется очень незначительно:

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

http://diffuse.sourceforge.net/

Надеюсь, это поможет.

0
ответ дан 28 March 2014 в 06:03

Другие вопросы по тегам:

Похожие вопросы: