(См. Также обновление ниже!)
Я делаю то же самое, используя сценарий оболочки в Linux, который включает
- Команда
compare
ImageMagick - утилита
pdftk
- Ghostscript (опционально)
(было бы довольно просто перенести это в .bat
Batch-файл для DOS / Windows.)
У меня есть несколько справочных PDF-файлов, созданных моим приложением, которые "известны как хорошие".Вновь созданные PDF-файлы после изменения кода сравниваются с этими ссылочными PDF-файлами.Сравнение выполняется попиксельно и сохраняется как новый PDF.В этом PDF все неизмененные пиксели закрашены белым, а все отличающиеся пиксели закрашены красным.
Вот строительные блоки:
pdftk
Используйте эту команду, чтобы разбить многостраничные PDF-файлы на несколько одностраничных PDF-файлов:
pdftk reference.pdf burst output somewhere/reference_page_%03d.pdf
pdftk comparison.pdf burst output somewhere/comparison_page_%03d.pdf
сравнить
Используйте эту команду для создания PDF-страницы "diff" для каждой из страниц:
compare \
-verbose \
-debug coder -log "%u %m:%l %e" \
somewhere/reference_page_001.pdf \
somewhere/comparison_page_001.pdf \
-compose src \
somewhereelse/reference_diff_page_001.pdf
Ghostscript
Из-за автоматически вставленных метаданных (например, текущей даты +время), вывод PDF не работает хорошо для сравнений файлов на основе MD5hash.
Если вы хотите автоматически обнаруживать все случаи, которые состоят из чисто белых страниц, вы также можете преобразовать в растровый формат без метаданных, используяbmp256
устройство вывода.Вы можете сделать это для оригинальных PDF-файлов (справка и сравнение) или для страниц diff-PDF:
gs \
-o reference_diff_page_001.bmp \
-r72 \
-g595x842 \
-sDEVICE=bmp256 \
reference_diff_page_001.pdf
md5sum reference_diff_page_001.bmp
Если сумма MD5 - это то, что вы ожидаете для полностью белой страницы 595x842 точек PostScript, тогдаваш модульный тест пройден.
Обновление:
Я не знаю, почему я раньше не думал о создании гистограммы вывода из ImageMagick compare
...
Ниже приведен конвейер команд, объединяющий две разные команды:
- первая такая же, как и выше
compare
, который генерирует белый цвет пиксели равны, красные пиксели - формат различий, только он выводит внутренний формат miff
ImageMagick.Он не записывает в файл, но в stdout . - второй использует
convert
для чтения stdin , генерирует гистограмму и выводит результат втекстовая форма.Будет две строки: - одна указывает на количество белых пикселей
- другая указывает на количество красных пикселей.
Вот так:
compare \
reference.pdf \
current.pdf \
-compose src \
miff:- \
| \
convert \
- \
-define histogram:unique-colors=true \
-format %c \
histogram:info:-
Пример вывода:
56934: (61937, 0, 7710,52428) #F1F100001E1ECCCC srgba(241,0,30,0.8)
444056: (65535,65535,65535,52428) #FFFFFFFFFFFFCCCC srgba(255,255,255,0.8)
(Пример вывода был создан с использованием этих reference.pdf и current.pdf files.)
Я думаю, что этот тип вывода действительно хорошо подходит для автоматического модульного тестирования.Если вы вычислите два числа, вы можете легко вычислить процент «красного пикселя», и вы даже можете решить вернуть PASSED или FAILED на основе определенного порога (если вы необязательно нужен "ноль красный" по какой-то причине).