我正在编写一个使用Cairo图形库输出PDF文件的CAD应用程序。许多单元测试并不需要实际生成PDF文件,例如计算对象的预期边界框。但是,我希望确保在更改代码后生成的PDF文件“看起来”正确。有没有一种自动化的方法来做这件事?我怎样才能尽可能地自动化呢?我需要目视检查每个生成的PDF吗?我怎么才能解决这个问题而不把头发拉出来呢?
发布于 2011-01-13 03:16:56
您可以将PDF捕获为位图(或至少是无损压缩的)图像,然后将每次测试生成的图像与其预期外观的参考图像进行比较。任何差异都将被标记为测试的错误。
发布于 2011-01-13 07:05:12
(另请参阅下面的更新!)
我在Linux上使用一个shell脚本做同样的事情,它包装了
compare命令
pdftk ImageMagick(可选)(将其移植到.bat批处理文件中是相当容易的。)
我有一些由我的应用程序创建的参考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比较
使用此命令为每个页面创建一个"diff“PDF页面:
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.pdfGhostscript
由于自动插入的元数据(例如当前的date+time),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如果MD5sum是您期望的595x842 PostScript点的全白页面,那么您的单元测试通过了。
更新:
我不知道为什么我之前没有想过从ImageMagick compare生成直方图输出……
以下是链接两个不同命令的命令管道:
compare相同,它生成‘白色像素相等,红色像素不同’格式,只是它输出的是ImageMagick内部的miff格式。它不写入文件,而是写入标准输出。convert读取标准输入,生成直方图并以文本形式输出结果。将有两行:它是这样的:
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)(示例输出是使用这些和文件生成的。)
我认为这种类型的输出非常适合自动化单元测试。如果您评估这两个数字,您可以很容易地计算“红色像素”百分比,您甚至可以根据某个阈值决定返回“通过”或“未通过”(如果出于某种原因您不一定需要“零红色”)。
发布于 2011-01-13 06:04:28
我脑海中浮现的第一个想法是使用diff实用程序。它们通常用于比较文档的文本,但也可能比较PDF的布局。使用它,您可以将预期输出与提供的输出进行比较。
谷歌给我的第一个结果是this。尽管它是商业的,但可能还有其他免费/开源的替代方案。
https://stackoverflow.com/questions/4672945
复制相似问题