Відмінність двох pdf-файлів?


39

Я шукаю хорошу програму, щоб показати мені відмінності між двома подібними файлами PDF. Зокрема, я шукаю те, що не просто працює розрізнюється у версії ascii (з "pdftotext") файлів. Це те, що робить pdfdiff.py .


Чи має це бути з відкритим кодом та безкоштовним?
Rinzwind

@Rinzwind: Звичайно, це було б краще.
krumpelstiltskin

inetsoftware.de/other-products/pdf-content-comparer/… 2.2 тут зазначено, що його можна використовувати під Linux (runPDFC.sh), але файл не знаходиться в архіві (лише bat ...), але це Java можливо перейменування (?)
Rinzwind

@Rinzwind: Я не знаю достатньо про Java, щоб зрозуміти, чому вона не працює. я роблю: java -cp. -jar PDFC.jar, але отримати java.lang.NoClassDefFoundError :(
krumpelstiltskin

@Rinzwind: я запустив це на Windows; програма жахлива. це створює PNG, нерозбірливі.
krumpelstiltskin

Відповіді:


28

Ви можете використовувати 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).


2
Це найкраще, що я бачив. Єдине питання, яке я бачу, це те, що він порівнює сторінку pdfs за сторінкою. Тож якщо ви додасте абзац на скажімо, сторінка 1, початок і кінець кожної сторінки після цього не збігаються. :(
krumpelstiltskin

3
Я думаю, що посилання більше не коректне. Нова версія 3. *, здається, доступна лише для Windows. Проте стару версію 2. * все ще можна встановити через sudo apt-get install diffpdf.
peq

22

Я щойно придумав хак, щоб зробити DiffPDF (програму, запропоновану @qbi), корисною для більш ніж незначних змін. Що я роблю, це об'єднати всі сторінки pdfs у довгу прокрутку за допомогою pdfjam, а потім порівняти прокрутки. Він працює навіть тоді, коли великі секції видаляються чи вставляються!

Ось базовий сценарій, який виконує цю роботу:

#!/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
Я зробив ваш сценарій пробілом сумісний і додав унікальні темпфіли. Сподіваюся, ви не заперечуєте.
Glutanimate

2
Також виправлена ​​невелика помилка, де сценарій створив би порожній текстовий файл у робочій директорії. (не забудьте завжди використовувати подвійні дужки, якщо заяви, які використовують ">" та пов'язані з ними операнди.)
Glutanimate

2
Останнє зауваження: Цей сценарій буде добре працювати лише для документів розміром DIN A4. Вам доведеться відрегулювати значення PAGEHEIGHT, щоб змусити його працювати з меншими документами. Я впевнений, що є спосіб автоматизувати це, але не знаю, як атм.
Glutanimate

2
Дякуємо за вдосконалення @Glutanimate. Я додав підтримку для порівняння pdfs довільних і різних розмірів (до тих пір, поки сторінки в кожному pdf мають однаковий розмір, тобто).
krumpelstiltskin

збережено в суть для зручності gist.github.com/timabell/9616807b2fe3fa60f234
Tim Abell

8

Хоча це не вирішує проблему безпосередньо, ось хороший спосіб зробити це все з командного рядка з кількома залежностями:

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 <(pdftotext -layout old.pdf /dev/stdout) <(pdftotext -layout new.pdf /dev/stdout)

http://diffuse.sourceforge.net/

Сподіваюся, що це допомагає.


4

Якщо у вас є 2-3 величезні файли pdf (або epub чи інших форматів, прочитайте нижче) для порівняння, то можна поєднати потужність:

  1. калібр (для перетворення джерела в текст)

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

  3. паралельно (використовувати всі ваші системні ядра для прискорення)

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

Якщо це не встановлено, встановіть мель, калібр та паралель:

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

Щоб мати змогу виконувати код з будь-якого місця вашого комп'ютера, збережіть наступний код у файлі під назвою "diffpub" (без розширень) всередині каталогу "/ 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 редакції PDF-сторінки на 1616 сторінок, і він працює ідеально. Оскільки калібр написано з використанням python для портативності, для перетворення обох файлів у текст знадобилося 10 хвилин. Повільний, але надійний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.