【发布时间】:2011-04-22 19:45:41
【问题描述】:
最近有很多关于绘制 PDF 的问题。
是的,您可以使用UIWebView 轻松呈现 PDF,但这无法提供您期望从一个好的 PDF 查看器中获得的性能和功能。
您可以在to a CALayer 或 to a UIImage 绘制PDF 页面。苹果甚至有示例代码来展示如何绘制一个大的 PDF in a Zoomable UIScrollview
但同样的问题不断出现。
UIImage 方法:
-
UIImage中的 PDF 不是光学的 规模以及层方法。 - CPU 和内存命中生成
UIImages来自PDFcontext限制/防止使用它来创建 新缩放级别的实时渲染。
CATiledLayer 方法:
- 存在大量开销(时间)
将完整的 PDF 页面绘制到
CALayer:可以看到各个图块呈现(即使调整了 tileSize) -
CALayers不能提前准备 时间(在屏幕外渲染)。
通常,PDF 查看器的内存也很重。甚至监控苹果的可缩放 PDF 示例的内存使用情况。
在我当前的项目中,我正在开发一个 PDF 查看器,并在单独的线程中呈现页面的UIImage(这里也有问题!)并在比例为 x1 时呈现它。 CATiledLayer 一旦比例大于 1,就会开始渲染。 iBooks 采用了类似的双重拍摄方法,就像您滚动页面时,您可以在不到一秒钟的时间内看到较低分辨率的页面,然后出现清晰的版本。
我在焦点页面的每一侧渲染 2 页,以便 PDF 图像在开始绘制之前准备好遮盖图层。当页面距离焦点页面 +2 页时,它们会再次被销毁。
有没有人有任何见解,无论多么小或多么明显,以提高绘图 PDF 的性能/内存处理?或此处讨论的任何其他问题?
编辑: 一些提示(Credit- Luke Mcneice、VdesmedT、Matt Gallagher、Johann):
尽可能将任何媒体保存到磁盘。
如果在 TiledLayers 上渲染,请使用更大的 tileSizes
用占位符对象初始化常用数组,或者另一种设计方法是this one
请注意,图像的渲染速度比
CGPDFPageRef更快使用
NSOperations或 GCD & Blocks 来准备页面 时间。在
CGContextDrawPDFPage之前调用CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);以减少绘制时的内存使用量使用 docRef 初始化您的
NSOperations是个坏主意(内存),请将 docRef 包装到单例中。取消不必要的
NSOperations如果可以,尤其是当他们将使用内存时,请注意不要让上下文保持打开状态!回收页面对象并销毁未使用的视图
在不需要时立即关闭所有打开的上下文
在收到内存警告时释放并重新加载 DocRef 和任何页面缓存
其他 PDF 功能:
Getting Raw Text(和here和Here和here(定位重点))
Searching(和 here)(不适用于所有 PDF(有些只是显示奇怪的字符,我猜这是编码问题,但我不确定)-Credit BrainFeeder)
CALayer and Off-Screen Rendering - 渲染下一页以实现快速/流畅的显示
文档
- Quartz PDFObjects(用于元信息、注释、拇指)
- Abobe PDF Spec
示例项目
-
Apple/ ZoomingPDF - 缩放,
UIScrollView,CATiledLayer -
vfr/ reader - 缩放、分页、
UIScrollView、CATiledView - brow/ leaves - 带有漂亮过渡的分页
- / skim - 看起来的一切(OSX 的 PDF 阅读器/编辑器)
【问题讨论】:
-
发表评论以确保窥视者收到编辑通知
-
+1 感谢您添加所有这些信息,希望我在开发阅读器时拥有它;)也感谢您添加有关 PDF 注释的问题(它还包含示例代码的答案)。几天前我打开了这个:stackoverflow.com/questions/4097044/pdf-search-on-the-iphone你有什么建议吗?
-
我自己还没有介绍过这个,所以除了将你指向随机想法博客之外,我无话可说:random-ideas.net/posts/42 不过感谢您的帖子,我正在尝试收集所有 PDF 问题在一个地方。
-
在我的公司,我们使用了一个名为
PSPDFKit的 3rd 方解决方案来进行 Pdf 渲染、符号等,它并不便宜,但值得:pspdfkit.com -
+1 我为我的开源 pdf 查看器遵循了这些有用的提示 Swifty PDF github.com/prcela/SwiftyPDF
标签: ios swift pdf calayer apple-pdfkit