首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对绘制PDF图形的Python函数进行单元测试?

如何对绘制PDF图形的Python函数进行单元测试?
EN

Stack Overflow用户
提问于 2011-01-13 03:11:51
回答 5查看 5K关注 0票数 19

我正在编写一个使用Cairo图形库输出PDF文件的CAD应用程序。许多单元测试并不需要实际生成PDF文件,例如计算对象的预期边界框。但是,我希望确保在更改代码后生成的PDF文件“看起来”正确。有没有一种自动化的方法来做这件事?我怎样才能尽可能地自动化呢?我需要目视检查每个生成的PDF吗?我怎么才能解决这个问题而不把头发拉出来呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-13 03:16:56

您可以将PDF捕获为位图(或至少是无损压缩的)图像,然后将每次测试生成的图像与其预期外观的参考图像进行比较。任何差异都将被标记为测试的错误。

票数 8
EN

Stack Overflow用户

发布于 2011-01-13 07:05:12

(另请参阅下面的更新!)

我在Linux上使用一个shell脚本做同样的事情,它包装了

  • utility

  • Ghostscript command的compare命令

  • pdftk ImageMagick(可选)

(将其移植到.bat批处理文件中是相当容易的。)

我有一些由我的应用程序创建的参考PDF,它们是“已知良好”的。将代码更改后新生成的PDF与这些参考PDF进行比较。比较是逐个像素完成的,并另存为新的PDF。在此PDF中,所有未更改的像素都被绘制为白色,而所有不同的像素都被绘制为红色。

以下是构建块:

pdftk

使用此命令将多页PDF文件拆分为多个单页PDF:

代码语言:javascript
复制
pdftk  reference.pdf  burst  output  somewhere/reference_page_%03d.pdf
pdftk  comparison.pdf burst  output  somewhere/comparison_page_%03d.pdf

比较

使用此命令为每个页面创建一个"diff“PDF页面:

代码语言:javascript
复制
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

由于自动插入的元数据(例如当前的date+time),PDF输出不能很好地用于基于MD5hash的文件比较。

如果您希望自动发现由纯白色页面组成的所有案例,还可以使用bmp256输出设备转换为无元数据的位图格式。您可以对原始PDF(引用和比较)或diff-PDF页面执行此操作:

代码语言:javascript
复制
 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生成直方图输出……

以下是链接两个不同命令的命令管道:

  1. 第一个与上面的compare相同,它生成‘白色像素相等,红色像素不同’格式,只是它输出的是ImageMagick内部的miff格式。它不写入文件,而是写入标准输出。
  2. 第二个使用convert读取标准输入,生成直方图并以文本形式输出结果。将有两行:
    • ,一行表示白色像素
    • 的数量,另一行表示红色red的数量

它是这样的:

代码语言:javascript
复制
compare \
   reference.pdf \
   current.pdf \
  -compose src \
   miff:- \
| \
convert \
   - \
  -define histogram:unique-colors=true \
  -format %c \
   histogram:info:-

示例输出:

代码语言:javascript
复制
 56934: (61937,    0, 7710,52428) #F1F100001E1ECCCC srgba(241,0,30,0.8)
444056: (65535,65535,65535,52428) #FFFFFFFFFFFFCCCC srgba(255,255,255,0.8)

(示例输出是使用这些和文件生成的。)

我认为这种类型的输出非常适合自动化单元测试。如果您评估这两个数字,您可以很容易地计算“红色像素”百分比,您甚至可以根据某个阈值决定返回“通过”或“未通过”(如果出于某种原因您不一定需要“零红色”)。

票数 22
EN

Stack Overflow用户

发布于 2011-01-13 06:04:28

我脑海中浮现的第一个想法是使用diff实用程序。它们通常用于比较文档的文本,但也可能比较PDF的布局。使用它,您可以将预期输出与提供的输出进行比较。

谷歌给我的第一个结果是this。尽管它是商业的,但可能还有其他免费/开源的替代方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4672945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档