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