PDF сравнить в командной строке Linux - PullRequest
27 голосов
/ 24 июня 2011

Я ищу инструмент командной строки Linux для сравнения двух файлов PDF и сохранения различий в файл PDF.Инструмент должен создавать diff-pdf в пакетном процессе.Файлы PDF являются планами строительства, поэтому чистое сравнение текста не работает.

Что-то вроде:

<tool> file1.pdf file2.pdf -o diff-out.pdf

Большинство найденных мною инструментов преобразуют файлы PDF в изображения и сравнивают ихно только с графическим интерфейсом.

Любое другое решение также приветствуется.

Ответы [ 3 ]

39 голосов
/ 27 июня 2011

Я написал свой собственный скрипт, который делает что-то похожее на то, что вы просите.Сценарий использует 4 инструмента для достижения своей цели:

  1. Команда compare ImageMagick *
  2. утилита pdftk (если у вас многостраничные файлы PDF)
  3. Ghostscript (необязательно)
  4. md5sum (необязательно)

Должно быть довольно просто перенести это в .bat командный файл для DOS / Windows.

Но сначала обратите внимание: это хорошо работает только для PDF-файлов с одинаковым размером страницы / носителя.Сравнение выполняется попиксельно между двумя входными PDF-файлами.Полученный файл представляет собой изображение, показывающее «diff», как это:

  • Каждый пиксель, который остается неизменным, становится белым.
  • Каждый измененный пиксель окрашен в красный цвет.

Это разностное изображение сохраняется в виде нового PDF-файла, чтобы сделать его более доступным на разных платформах ОС.

Я использую это, например, чтобы обнаружить минимальные различия в отображении страницы при замене шрифтав обработке PDF вступает в игру.

Может случиться, что между вашими PDF нет видимой разницы, хотя они различаются по хэшам MD5 и / или размеру файла.В этом случае PDF-страница вывода diff будет полностью белой.Вы можете автоматически обнаружить это условие, поэтому вам нужно только визуально исследовать небелые PDF-файлы, автоматически удаляя полностью белые.

Вот стандартные блоки:

pdftk

Используйте эту утилиту командной строки, чтобы разбить многостраничные PDF-файлы на несколько одностраничных PDF-файлов:

pdftk  file_1.pdf  burst  output  somewhere/file_1---page_%03d.pdf
pdftk  file_2.pdf  burst  output  somewhere/file_2---page_%03d.pdf

Если вы сравниваете только одностраничные PDF-файлы, этот строительный блок является необязательным.Поскольку вы говорите о «планах строительства», это, вероятно, имеет место.

сравнить

Используйте эту утилиту командной строки из ImageMagick для создания PDF-страницы "diff" для каждой из страниц:

compare \
       -verbose \
       -debug coder \
       -log "%u %m:%l %e" \
        somewhere/file_1---page_001.pdf \
        somewhere/file_2---page_001.pdf \
       -compose src \
        somewhereelse/file_1--file_2---diff_page_001.pdf

Ghostscript

Из-за автоматически вставляемых метаданных (таких как текущая дата + время) вывод PDF не работает для сравнений файлов на основе MD5hash.

Если вы хотите автоматически обнаружить все случаи, когда diff PDF состоит из чисто белой страницы, вам следует преобразовать страницу PDF в формат точечных рисунков без метаданных, используя устройство вывода bmp256.Вы можете сделать это следующим образом:

Сначала выясните, каков формат страницы вашего PDF.Опять же, эта маленькая утилита identify входит в состав любой установки ImageMagick:

 identify \
   -format "%[fx:(w)]x%[fx:(h)]" \
    somewhereelse/file_1--file_2---diff_page_001.pdf

Вы можете сохранить это значение в переменной окружения, например:

 export my_size=$(identify \
   -format "%[fx:(w)]x%[fx:(h)]" \
    somewhereelse/file_1--file_2---diff_page_001.pdf)

Теперь Ghostscript входит вВоспроизвести, используя командную строку, которая включает обнаруженный выше размер страницы, поскольку она хранится в переменной:

 gs \
   -o somewhereelse/file_1--file_2---diff_page_001.ppm \
   -sDEVICE=ppmraw \
   -r72 \
   -g${my_size} \
    somewhereelse/file_1--file_2---diff_page_001.pdf

Это дает вам PPM (Portable PixMap) с разрешением 72 dpi от исходной страницы PDF.72 dpi обычно достаточно для того, что мы хотим ... Затем создайте чисто белую страницу PPM с таким же размером страницы:

 gs \
   -o somewhereelse/file_1--file_2---whitepage_001.ppm \
   -sDEVICE=ppmraw \
   -r72 \
   -g${my_size} \
   -c "showpage"

Часть -c "showpage" - это команда PostScript, которая предписывает Ghostscript выдаватьтолько пустая страница.

сумма MD5

Используйте хеш MD5 для автоматического сравнения исходного PPM с PPM для белой страницы.В случае, если они одинаковы, вы можете с уверенностью предположить, что между PDF-файлами нет различий, и, следовательно, переименовать или удалить diff-PDF:

 MD5_1=$(md5sum somewhereelse/file_1--file_2---diff_page_001.ppm | awk '{print $1}')
 MD5_2=$(md5sum somewhereelse/file_1--file_2---whitepage_001.ppm | awk '{print $1}')

 if [ "x${MD5_1}" == "x${MD5_2}" ]; then 
     mv  \
       somewhereelse/file_1--file_2---diff_page_001.pdf \
       somewhereelse/file_1--file_2---NODIFFERENCE_page_001.pdf # rename all-white PDF
     rm  \
       somewhereelse/file_1--file_2---*_page_001.ppm            # delete both PPMs
 fi

Это избавляет вас от необходимости визуально проверять «diff-файлы PDF»которые не имеют никаких отличий.

24 голосов
/ 24 июня 2011

Вот хак, чтобы сделать это.

pdftotext file1.pdf
pdftotext file2.pdf
diff file1.txt file2.txt
5 голосов
/ 29 августа 2011

Выполнено в 2 строки с (всемогущим) imagemagick и pdftk:

compare -verbose -debug coder $PDF_1 $PDF_2 -compose src $OUT_FILE.tmp
pdftk $OUT_FILE.tmp background $PDF_1 output $OUT_FILE

Опции -verbose и -debug являются необязательными.

  • сравнить создает PDF сdiff как красные пиксели.
  • pdftk объединяет diff-pdf с фоном PDF_1
...