PDF文件的视觉差异,以确定像素的完美度

Oli*_*gel 21 pdf comparison compare

我需要使用MS Reporting Services重构一些报告(使用Jasper生成).原始报告的副本以PDF格式提供.要求是使新报告"像素完美",这是非常麻烦的...

为了让生活更轻松,我希望有一个工具覆盖原始和生成的报告PDF,以测量它们是否完美.

有这样的工具吗?

Kur*_*fle 21

最简单,立即可用的方法:使用ImageMagickcompare(在Windows/Linux/Mac和其他设备上也可用).

它甚至可以比较PDF页面(尽管它使用Ghostscript作为其委托来首先将PDF页面渲染为像素图像):

 compare.exe         ^
    tested.pdf[0]    ^
    reference.pdf[0] ^
   -compose src      ^
    delta.pdf
Run Code Online (Sandbox Code Playgroud)

结果delta.pdf将每个像素描绘为红色,其在两个比较的PDF页面之间具有不同的颜色.所有相同的像素都是纯白色的.该[0]告知compare使用每个文件的第一页进行比较(页计数从零开始).

您可以通过以下示例了解其工作原理:

 compare.exe                      ^
    http://qtrac.eu/boson1.pdf[1] ^
    http://qtrac.eu/boson2.pdf[1] ^
   -compose src                   ^
    delta.pdf
Run Code Online (Sandbox Code Playgroud)

以下是相应的页面(转换为缩小的PNG以进行Web显示).参考页面位于左侧,修改后的页面位于中间位置,"delta-pixel-are-red"图像位于右侧:

第一页 第二页 三角洲图像

跳过-compose src参数可以获得略微不同的视觉效果.然后,您将原始文件的像素作为灰色阴影背景(对于上下文),增量像素为红色:

 compare.exe                      ^
    http://qtrac.eu/boson1.pdf[1] ^
    http://qtrac.eu/boson2.pdf[1] ^
    delta.pdf
Run Code Online (Sandbox Code Playgroud)

第一页 第二页 delta.pdf

如果您不喜欢像素差异的红色,请使用-highlight-color:

 compare.exe                      ^
    http://qtrac.eu/boson1.pdf[1] ^
    http://qtrac.eu/boson2.pdf[1] ^
   -highlight-color green         ^
    delta.pdf
Run Code Online (Sandbox Code Playgroud)

用于呈现PDF页面的默认分辨率为72 dpi.如果您需要更高的精度,可以使用如下-density参数切换到300 dpi :

 compare.exe                      ^
   -density 300                   ^
    http://qtrac.eu/boson1.pdf[1] ^
    http://qtrac.eu/boson2.pdf[1] ^
    delta.pdf
Run Code Online (Sandbox Code Playgroud)

请注意,切换到更高的密度会减慢进程并创建更大的文件.

您甚至可以为增量图像创建一个*.txt文件,该文件描述每个像素的坐标和相应的颜色值:

 compare                          ^
    http://qtrac.eu/boson1.pdf[1] ^
    http://qtrac.eu/boson2.pdf[1] ^
   -compose src                   ^
   -highlight-color black         ^
    delta.txt
Run Code Online (Sandbox Code Playgroud)

然后只计算总黑与黑像素的数量(对不起,这是Unix/Linux/MacOSX语法):

 total_pixels=$(( $(cat delta.txt | wc -l) - 1))
 black_pixels=$(( $(grep black delta.txt | wc -l) -1 ))
Run Code Online (Sandbox Code Playgroud)

在上面用于插图的示例中,我得到了

 total_pixels=500990
 black_pixels=8727
Run Code Online (Sandbox Code Playgroud)

当然,"理想"的结果将是

 black_pixels=0
Run Code Online (Sandbox Code Playgroud)