【问题标题】:How can I cleanly draw on a PDF both statically and dynamically on iOS?如何在 iOS 上以静态和动态方式干净地绘制 PDF?
【发布时间】:2016-08-31 23:51:18
【问题描述】:

我目前正在开发一个应用程序,我们希望在该应用程序中从远程服务器下载 PDF,然后在其上绘图。我们想在 PDF(静态绘制部分)上绘制 Google Maps pin-like annotation。此外,我们想检测用户是否触摸了一个图钉,然后在此 PDF 上绘制一个标注框(动态绘制部分)。我们显然希望 pdf 可以滚动/缩放。有谁知道实现这一目标的好方法?

我研究过的东西: 1) 在 UIWebView 中渲染。这似乎是一个很好的解决方案,但我不清楚如何在 PDF 上实现绘图代码。我听说有人说在 UIWebView 上方创建一个透明的 UIView 用于绘图。这似乎伴随着它的问题,它将如何处理缩放和滚动?

2) 使用 Quartz 2D 并从我从服务器获取的 PDF 生成我自己的 PDF。当我绘制自己的 PDF 内容时,我可以绘制静态标记图钉。一旦我有了这个 PDF,我就可以把它放到 WebView 中。然而,这种方法的问题是,当用户点击图钉时,我仍然需要处理标注框的动态绘制,这有点让我回到问题 1。

【问题讨论】:

    标签: ios uiwebview pdf-generation wkwebview cgpdfcontext


    【解决方案1】:

    你说得对,Apple 在这个问题上没有提供太多帮助。 UIWebView 可以预览和显示 PDF 文档,但它确实不适合添加注释,并且任何带有视图的“解决方案”都将非常脆弱,如果你能做到的话。它的意思是作为一个黑匣子来阅读 PDF 文档,而不是用于注释。

    你必须一路回到CGContextRef 并自己接管滚动、缩放和触摸处理/绘图。 Apple 的 ZoomingPDFViewer 示例是一个好的开始。

    自 2010 年以来,我一直致力于解决这个问题,我们为 iOS、Android 和 Web 的 PDF 注释提供了一个商业解决方案,称为 PSPDFKit。我们发布了一个自定义渲染器,它比 Apple 的 CoreGraphics 渲染器更好、更精确,但更有趣的是我们可以处理所有常见的 PDF 注释类型。您可以使用note annotations 来表示您的图钉并移动它们、添加注释、交互/覆盖默认的点击处理(例如,当人们点击它们时显示您自己的弹出框)。它们的大小也始终相同 - 因此它们可以固定在 PDF 中的某个确切点,然后您可以在它们保持相同大小的同时进行放大。最好的部分是这都是 PDF 规范的一部分,因此它们也可以与 Apple 的 Preview 应用程序或 Adob​​e Acrobat 一起使用,因此人们可以保存/自定义标记,然后所有内容都可以保存在 PDF 中。该架构非常灵活,因此您还可以简单地将所有内容保存在数据库中,或将其同步备份到您的服务器,然后简单地将其用于触摸处理。

    您也可以自己构建它 - 基本架构是 UIScrollView 和托管的视图。当您进行缩放并拥有需要保持相同大小+触摸处理的视图时,它很快就会变得棘手,也许您还想要多选或常规墨水绘图之类的东西。您还需要添加某种图像缓存层,因为在移动设备上渲染 PDF 文档可能会很慢。哦,如果你想让文本可选择或实现搜索,请准备好一个名为Adobe CMap and CIDFont Files Specification 的兔子洞。

    【讨论】:

    • 我已经接受了您的回答,因为它的回复很深入。事实证明,为了我的需要,我实际上不再需要渲染 PDF!这只是产品使用的一个术语,它们实际上是指 png 或 jpg 之类的图像。我需要做的就是使用嵌入在 UIScrollView 中的 UIImageView。结果是 subView 部分,我可以将它们作为 subViews 添加到 scrollView 以在滚动期间保持视图固定。要在捏合时更新子视图的位置,我应该能够通过在捏合动态发生时更新这些子视图的中心属性来做到这一点(这是棘手的部分)
    猜你喜欢
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2017-07-04
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多