最近有很多关于绘制 PDF 的问题。
是的,您可以使用 a 轻松渲染 PDF,UIWebView
但这不能提供您期望从一个好的 PDF 查看器获得的性能和功能。
您可以将 PDF 页面绘制到 CALayer或UIImage。Apple 甚至有示例代码来展示如何在可缩放 UIScrollview 中绘制大型 PDF
但同样的问题不断出现。
UIImage 方法:
- PDF 在
UIImage
不光学缩放以及图层方法中。 - CPU 和内存在生成
UIImages
限制PDFcontext
/阻止时使用它来创建新缩放级别的实时渲染。
CATiledLayer 方法:
- 将完整的 PDF 页面绘制到一个显着的开销(时间)
CALayer
:可以看到单个图块呈现(即使使用 tileSize 调整) CALayers
无法提前准备(渲染到屏幕外)。
一般来说,PDF 查看器的内存也很重。甚至监控苹果的可缩放 PDF 示例的内存使用情况。
在我当前的项目中,我正在开发一个 PDF 查看器,并UIImage
在一个单独的线程中呈现一个页面(这里也有问题!)并在比例为 x1 时呈现它。CATiledLayer
一旦比例大于 1,渲染就会开始。iBooks 采用了类似的双重拍摄方法,就像您滚动页面时,您可以在不到一秒钟的时间内看到较低分辨率的页面,然后出现清晰的版本。
我在焦点页面的每一侧渲染 2 页,以便 PDF 图像在开始绘制之前准备好遮盖图层。当页面距离焦点页面 +2 页时,它们会再次被销毁。
有没有人有任何见解,无论改善绘图 PDF 的性能/内存处理多么小或多么明显?或这里讨论的任何其他问题?
编辑:一些提示(信用 - Luke Mcneice,VdesmedT,Matt Gallagher,Johann):
尽可能将任何媒体保存到磁盘。
如果在 TiledLayers 上渲染,请使用更大的 tileSizes
用占位符对象初始化经常使用的数组,或者另一种设计方法是这个
请注意,图像的渲染速度比
CGPDFPageRef
使用
NSOperations
或 GCD & Blocks提前准备页面。在绘图时调用
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
beforeCGContextDrawPDFPage
以减少内存使用用docRef 初始化你
NSOperations
是一个坏主意(内存),将 docRef 包装成一个单例。不必要的取消
NSOperations
如果可以,尤其是当他们将使用内存时,请注意不要让上下文保持打开状态!回收页面对象并销毁未使用的视图
不需要时立即关闭所有打开的上下文
在收到内存警告时释放并重新加载 DocRef 和任何页面缓存
其他 PDF 功能:
获取 PDF 中的链接(以及此处和此处)
获取链接的目标
/Dest
(从数组中获取页码)
搜索(和此处)(不适用于所有 PDF(有些只是显示奇怪的字符,我猜这是编码问题,但我不确定)-Credit BrainFeeder)
CALayer 和屏幕外渲染- 渲染下一页以获得快速/流畅的显示
文档
- Quartz PDFObjects(用于元信息、注释、拇指)
- Abobe PDF 规范
示例项目
- Apple/ZoomingPDF - 缩放,
UIScrollView
,CATiledLayer
- vfr/阅读器- 缩放、分页
UIScrollView
、、CATiledView
- 眉毛/叶子- 带有漂亮过渡的分页
- /skim - 一切看起来(OSX 的 PDF 阅读器/编辑器)