最近有许多关于绘制PDF的问题。
是的,您可以使用轻松渲染PDF,UIWebView
但这不能提供您期望的优质PDF查看器所具有的性能和功能。
您可以将PDF页面绘制到CALayer或UIImage。苹果甚至提供了示例代码来展示如何在Zoomable UIScrollview中绘制大型PDF
但是同样的问题不断出现。
UIImage方法:
- PDF
UIImage
不像图层方法那样光学缩放。 - CPU和内存击中产生
UIImages
从PDFcontext
使用它来创建一个实时渲染的新的放大级别限制/防止。
CATiledLayer方法:
- 将整个PDF页面绘制到上有大量开销(时间)
CALayer
:可以看到各个图块的呈现(即使使用tileSize进行了调整) CALayers
无法提前准备(在屏幕外渲染)。
通常,PDF查看器也占用大量内存。甚至监视苹果可缩放PDF示例的内存使用情况。
在我当前的项目中,我正在开发PDF查看器,并UIImage
在单独的线程中渲染页面的A(此处也有问题!),并在比例为x1时显示它。CATiledLayer
比例大于1时,渲染就会开始。iBooks采用类似的重复处理方法,就好像您滚动页面一样,在显示清晰版本之前,可以看到页面的较低分辨率版本不到一秒钟。
我在页面的每一侧都渲染了2页,以便PDF图像准备好在开始绘制之前掩盖该层。当页面距聚焦页面+2页时,页面将再次被销毁。
是否有任何见解,无论大小或明显程度如何提高Drawing PDF的性能/内存处理能力?还是这里讨论的任何其他问题?
编辑:一些技巧(信贷-卢克·麦克尼斯,VdesmedT,马特·加拉格尔,约翰):
尽可能将任何媒体保存到磁盘。
如果在TiledLayers上渲染,请使用更大的tileSize
INIT频繁使用的阵列,占位符对象,alternitively另一设计方法是这一个
请注意,图像的渲染速度比
CGPDFPageRef
使用
NSOperations
或GCD和块来提前准备页面。CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
之前调用CGContextDrawPDFPage
以减少绘图时的内存使用量用docRef初始化您的
NSOperations
主意(内存)是一个坏主意,将docRef包装为单例。不需要
NSOperations
时取消可以的话,尤其是当他们将使用内存时,请当心不要打开上下文!回收页面对象并销毁未使用的视图
不需要任何打开的上下文后,立即关闭它们
在收到内存警告时释放并重新加载DocRef和任何页面缓存
其他PDF功能:
-
获取链接的目标(从
/Dest
数组中获取页码)
搜索(和在此处)(不适用于所有PDF(有些只是显示奇怪的字符,我想这是编码问题,但不确定)-Credit BrainFeeder)
CALayer和屏幕外渲染 -渲染下一页以实现快速/流畅的显示
文献资料
- Quartz PDFObjects(用于元信息,注释,拇指)
- Abobe PDF规格
示例项目
PSPDFKit
,这是不便宜,但值得:pspdfkit.com