Я ищу инструмент командной строки Linux для сравнения двух файлов PDF и сохранения различий в PDF файле. Инструмент должен создать diff-pdf в пакетном процессе. PDF файлы - это планы строительства, поэтому чистый текст-сравнение не работает.
Большинство инструментов, которые я нашел, конвертируют PDF файлы в изображения и сравнивают их, но только с графическим интерфейсом.
Также приветствуется любое другое решение.
Ответ 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", которые не имеют никаких различий.