Подтвердить что ты не робот

Сравнение PDF в командной строке linux

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

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

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

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

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

4b9b3361

Ответ 1

Готово в 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 являются необязательными.

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

Ответ 2

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

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

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

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

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

Этот 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 файлы, этот строительный блок является необязательным. Поскольку вы говорите о "планах строительства", это, вероятно, так.

<сравнения/h2 >

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

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 PDFs", которые не имеют никаких различий.

Ответ 3

Вот это взломать.

pdftotext file1.pdf
pdftotext file2.pdf
diff file1.txt file2.txt