PDF裁剪图像几乎正确

时间:2016-10-09 01:27:44

标签: image pdf pdf-generation

我继承了一些手工处理PDF文件的代码。此代码执行的操作之一是将大图像作为资源插入到PDF中,然后在PDF命令流中裁剪该图像的各个部分并单独绘制。

例如,如果大图像是1000 x 400像素,则代码绘制从大图像((0,0)到(250,200)的左上角提取的块,然后在旁边绘制另一个从大图像的顶部中间提取的块((250,0),(500,200))(在这篇文章中,我使用标准图像坐标系描述了裁剪坐标,其原点在左上角)。

代码执行此操作的方式是创建一个辅助XObject,它只绘制大图像,适当缩放和偏移。因此,要从((250,0)到(500,200))提取图像,它定义了一个新的XObject,如下所示:

/Type/XObject /Subtype/Form /FormType 1 /Name/Img4 /BBox [0 0 1 1] /Matrix [1 0 0 1 0 0] /Length 26/Resources << /XObject << /img3 23 0 R >> >>

4 0 0 2 1 1 cm
/img3 Do

(显然我已经删除了很多PDF,不用担心,它有效,所以你看不到的PDF基本上是正确的)

如果我理解正确的话,取原始图像的XObject(1 x 1平方),使其在x方向上大4倍,在y方向上大2倍,抵消它在x和y中都是1,现在我们想要的图像部分出现在((0,0),(1,1))的XObject矩形中。所以代码可以在任何地方绘制新的XObject,并获取大图像的裁剪部分。

这基本上可以正常工作,但当然在现实世界中,大图像是656 x 656,被提取的部分是308 x 120和40 x 120,因此数字不是很好。

如果我在Adobe Acrobat Reader中以高倍率(1600%)查看生成的PDF,那就完美了。所有像素都应该是它们应该的位置。

Portion of PDF output at 1600%

我遇到的问题是,在较低的放大率(200%)下,我最终得到了这两个图像邻接的奇怪偏移:

Portion of PDF output at 200%

对于此示例,执行裁剪的变换矩阵为:

2.12987 0 0 5.46667 -0 -4.46667 cm

这似乎应该是足够精确的数字,但即使我提高了精度:

2.1298701 0 0 5.4666667 -0 -4.4666667 cm

发生完全相同的问题。

Adob​​e Reader似乎在计算中的某个位置截断了精度。

知道为什么会这样,以及如何绕过它?

0 个答案:

没有答案