Iphone iOS提高PDF渲染速度
我正在编写一个应用程序,为用户管理文档,并(最终)通过iPhone/iPad上的web服务发布PDF文件。这些文件几乎都是扫描过的PDF文件,它们似乎真的会让iOS设备陷入困境 我提出的第一个解决方案是将PDF托管在UIWebView中。这对“生成的”PDF文件非常有效,但对扫描的PDF文件无效(我猜这里的区别是光栅和矢量?) 我的下一个解决方案是实现UIDocumentInteractionController,据说它可以提高敏捷性。我可以报告说,它确实看起来比UIWebView快,但它仍然慢得令人无法接受,即使是在较小的2页PDF文件上。(另一方面,“在另一个应用程序中自动打开”功能以及内置打印非常流畅!) 我读过一两篇关于QuickLook框架的文章,我计划对此进行研究,但我也偶然发现了一些关于CGPDFDocument类之类的文章。这些似乎对文档导航有更好的控制(一个la-xPdf),但我不知道从哪里开始。另外,我甚至不确定它是否能为我所做的工作带来性能优势 那么,第一个问题:在iPhone/iPad上呈现扫描PDF文件的最快方式是什么 第二个问题:扫描的PDF文件是由我的公司生成的,所以我可以控制PDF生成设置。有人知道什么设置可以提高基于图像的PDF文件的加载速度吗 谢谢Iphone iOS提高PDF渲染速度,iphone,ios,ipad,pdf,render,Iphone,Ios,Ipad,Pdf,Render,我正在编写一个应用程序,为用户管理文档,并(最终)通过iPhone/iPad上的web服务发布PDF文件。这些文件几乎都是扫描过的PDF文件,它们似乎真的会让iOS设备陷入困境 我提出的第一个解决方案是将PDF托管在UIWebView中。这对“生成的”PDF文件非常有效,但对扫描的PDF文件无效(我猜这里的区别是光栅和矢量?) 我的下一个解决方案是实现UIDocumentInteractionController,据说它可以提高敏捷性。我可以报告说,它确实看起来比UIWebView快,但它仍然慢
(顺便说一句:我今天已经连续写了19个小时了,所以如果我说得太多或没有意义,请原谅我!:)你可能想尝试减小图像大小。大型PDF将iPad/iPhone推向了极限。当然,这意味着您需要使用Quartz调用自己绘制/管理pdf
适当的缓存可以提高速度。您可以在屏幕外渲染页面,并在不打开实际pdf的情况下显示它们-这要快得多。如果您感到绝望,可以在服务器上重新处理pdf文件,将其转换为简单的图像文件(与原始pdf文件相关联),然后加载这些文件。这样就不需要进行“pdf”解析。然后,您可以在服务器上托管,或者在卷较低时将其作为应用程序的一部分
基本上,您需要一个服务器脚本来完成所有的重新处理,并将新文件粘贴到一个特殊的文件夹中。也许你可以建立一个数据库来引用新文件。或者,您可以为每个新文件创建一个目录名,以镜像原始pdf文件名。使用UIWebView呈现pdf,我们将无法正确控制pdf。就像我们不能直接进入想要的页面一样。我们不能搜索特定的单词并突出显示 最好使用CGPDFDocumentRef和CGPDFPageRef等CGPDF类来正确处理pdf文档 使用这些类,我们有两个选项来处理pdf。 1.将pdf页面单独提取为图像,并使用UIImageView显示。 2.使用CGPDFPageRef提取每个页面的内容,并在运行时为每个页面创建pdf,并显示在webview上。(更好地控制pdf和整洁的显示) 下面是将单个页面提取为图像的示例代码
-(UIImage *)getPage : (NSString*) filePath{
const char *myBuffer = (const char*)filePath; // PDF Path
CFStringRef urlString = (CFStringRef)myBuffer;
CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, urlString, 2, NO);
CGPDFDocumentRef myDocumentRef = CGPDFDocumentCreateWithURL(url);
CGPDFPageRef myPageRef = CGPDFDocumentGetPage(myDocumentRef, 1);
CGRect pdfcropBox = CGPDFPageGetBoxRect(myPageRef,kCGPDFCropBox); //kCGPDFCropBox
UIGraphicsBeginImageContext (pdfcropBox.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM (context,0,pdfcropBox.size.height);// [self pageRect].origin.x,[self pageRect].origin.y+[self pageRect].size.height); //320);
// scale 1:1 100%
CGContextScaleCTM (context, 1.0, -1.0);
CGContextSaveGState (context);
CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(myPageRef, kCGPDFCropBox, CGRectMake(0, 0, pdfcropBox.size.width,pdfcropBox.size.height), 0, true); //
CGContextConcatCTM (context, pdfTransform);
CGContextDrawPDFPage (context, myPageRef);
CGContextRestoreGState (context);
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext ();
CGPDFDocumentRelease (myDocumentRef);
//CGPDFPageRelease(myPageRef);
//myPageRef = nil;
myDocumentRef = nil;
urlString = nil;
url = nil;
return resultingImage;
}
最快的解决方案是使用CGPDFDocument类编写自己的自定义pdf解析器和呈现框架。超高速pdf渲染的秘诀是使用以下技术:
- 将全尺寸页面屏幕外呈现为图像
- 仅在特定缩放级别后激活CATiledLayer图形。当用户以默认缩放级别查看pdf页面时,无需激活CATiledLayer图形,因为它非常昂贵。只需显示已在屏幕外渲染的图像。当用户开始放大时,可以激活CATiledLayer
- 使用智能算法缓存屏幕外呈现的pdf页面。可以将上一页和下一页缓存为屏幕外渲染的图像
- 在快速设备(iPhone4或更高版本和iPad2或更高版本)上,您可以启动后台作业,将所有页面呈现在屏幕外并保存到磁盘
- 缓存有关pdf页面的常用信息,如:原始矩形、旋转矩形、旋转矩形等
- 您将使用许多CGPDFPageRef对象。重要的是要知道这将大大增加内存使用。一个小技巧是在收到内存警告时关闭并重新打开CGPDFDocumentRef对象
我使用了上面提到的所有技术,这是我开发的一个快速pdf渲染框架 以下是我关于用swift轻松快速地呈现pdf的2分钱
- 使用系统UIPageViewController进行分页
- 使用UIScrollView缩放功能进行缩放
- 通过将页面转换为占位符图像快速呈现PDF
- PDF页面按比例缩放并划分为小块。平铺将缓存到图像文件并在占位符图像上渲染(使用CATiledLayer)
Still WIP有PDF样本可以上传给我们吗?最有可能与使用的TIFF压缩类型有关(假定纸张最初扫描到TIFF)。