【问题标题】:How to display a PDF document that includes hyperlinks? (on iOS)如何显示包含超链接的 PDF 文档? (在 iOS 上)
【发布时间】:2011-05-06 06:41:26
【问题描述】:
情况:我有一个包含超链接的 pdf 文档。我希望我的 iPhone 应用程序显示此 pdf 文档,并启用点击超链接。
注意:目前,我正在尝试使用 UIWebView 执行此操作,不幸的是,它似乎无法检测到链接点击。我在文档中读到了一系列名为 CGPDF 的类和方法。该文档讨论了所有关于解析 pdf 文档的内容,以及没有但没有具体说明如何检测链接点击以及什么不是(感谢苹果)。
【问题讨论】:
标签:
iphone
xcode
pdf
ios
cgpdfdocument
【解决方案1】:
我不能评论 UIWebView,但 CGPDF 的东西是 CoreGraphics 的一部分。所以它主要用于绘图——你将有一个 PDF 对象和一个上下文来绘制它(几乎可以肯定通过 UIView 的自定义子类接收)并要求它以特定的比例和位置绘制。如果您是 CoreGraphics 和/或自定义 UIView 子类的新手,那么可能需要一天左右的时间才能开始使用,但最糟糕的情况是几百行。
CoreGraphics 对用户交互一无所知,所以我认为 Apple 认为它暗示了那里没有点击的概念,因此 CoreGraphics 无法直接帮助您捕捉点击。
在this document 的顶部有一个加载 PDF 并将其绘制到上下文的示例代码。 CoreGraphics 在 OS X 和 iOS 上是相同的,只是初始坐标系是相反的。在 OS X 上它与 PDF 的方式相同,在 iOS 上则相反,因此如果未经调整,PDF 将沿 y 呈现反转。示例显示代码之后的部分标题为“为 PDF 页面创建转换”,应该对此有所帮助——您只需要应用一个反转 y 的转换。
tutorial here 介绍了如何创建包含一些 CoreGraphics 绘图步骤的自定义 UIView 子类。
关于捕捉水龙头,事情变得有点复杂。由于文件格式的工作方式,您无需执行完整的 PDF 检查之类的操作。链接的东西被绘制出来,但是它们应该按照 CoreGraphics 可以为您处理的正常 PDF 操作来查看。然后有单独的表格描述了用于捕捉点击的边界框矩形和它们应该去的链接。这些表格由 CoreGraphics 解析为易于阅读的格式,但未经检查。因此,您可以获得所有工具来找出链接所在的位置,而无需过多了解文件格式,但您仍然需要自己摸索。
相关的 CoreGraphics 构造是 CGPDFDictionary。您可以获取最新的 PDF 规范 here,但其中 99% 与您无关或涵盖了 CoreGraphics 已经实现的内容。您需要来回浏览文档以将所有部分拼凑在一起,但您可以跳到第 488 页上的第 8.4 节注释。
它最终是一个相当复杂的代码组合,出于商业原因我不能发布我自己的,但你会想要建立一个页面名称到页码的映射,遍历链接注释(它们是链接到命名页面)并做一些事情来捕捉水龙头。就我个人而言,我只是添加了不可见的 UIButtons 作为我的自定义 PDF 视图的子视图。显然,您应用于 PDF 的任何转换也需要应用于注释坐标。
总共大概有 1000 行。