Я написал свой собственный скрипт, который делает что-то похожее на то, что вы просите.Сценарий использует 4 инструмента для достижения своей цели:
- Команда
compare
ImageMagick * - утилита
pdftk
(если у вас многостраничные файлы PDF) - Ghostscript (необязательно)
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»которые не имеют никаких отличий.