PDFPage的分辨率?

时间:2010-08-11 18:34:46

标签: objective-c cocoa pdf quartz-graphics

我有一个PDF文档是通过创建大小为72dpi的NSImages创建的,每个都有一个以像素为单位的表示。然后我使用initWithImage将这些图像放入PDFPages,然后保存文档。

当我打开文档时,我需要原始图像的分辨率。但是,PDFPage给出的所有矩形都是用点来衡量的,而不是像素。

我知道信息就在那里,我想我可以通过浏览voyeur.app示例来尝试自己解析PDF数据......但是这样做是为了做一些应该很漂亮的事情。正常...

有更简单的方法吗?

添加了:

我尝试过两种技巧:

  1. 从中获取PDFRepresentation数据 页面,并用它来制作一个新的 NSImage通过initWithData。这个 但是,图像有两种作用 尺寸和像素大小为72dpi。

  2. 将PDFPage绘制为新的 离屏上下文,然后得到一个 CGImage来自那个。问题是 当我在创造背景时,它 似乎我需要知道大小 以像素为单位,失败了 目的的一部分......

1 个答案:

答案 0 :(得分:3)

您需要了解有关PDF的一些事项:

  • PDF坐标系统在 默认为点(1/72英寸)。

  • PDF坐标系统没有分辨率。 (这是一个白色谎言 - 分辨率实际上是32位浮点数的限制。)

  • PDF中的图像本身并没有附加任何分辨率(这是一个白色谎言 - 使用JPEG2000压缩的图像在其嵌入的元数据中仍具有分辨率)。

  • PDF中的图像由一个对象表示,该对象包含使用某些压缩过滤器存储的一系列样本。

  • 图像对象可以在任意大小的页面上多次呈现。

由于分辨率定义为每单位距离的像素数(或样本数),因此分辨率仅表示页面上图像的特定渲染。因此,如果要渲染特定图像以填充页面,则dpi中的分辨率为

xdpi = image_width / (pageWidthInPoints / 72.0);
ydpi = image_height / (pageHeightInPoints / 72.0);

如果图像没有呈现为页面的完整大小,那么完整的解决方案非常棘手。 Adobe规定应将图像视为1x1,并更改页面转换矩阵以确定如何渲染它们。这意味着您需要在渲染图像时需要矩阵,并且需要将点(0,0),(0,1),(1,0)推到矩阵中。 (0,0)'和(1,0)'之间的欧几里德距离将给出点的宽度,(0,0)'和(0,1)'之间的欧几里德距离将给出点的高度。

那你怎么得到那个矩阵?那么,你需要页面的内容流,你需要编写一个PDF解释器,可以翻录内容流并跟踪CTM的变化。当您到达图像时,为其提取CTM。

如果您熟悉该工具包,那么最后一步应该是一个小时的PDF工具包。写这个工具包是几年人的工作。