Iphone iOS提高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快,但它仍然慢

我正在编写一个应用程序,为用户管理文档,并(最终)通过iPhone/iPad上的web服务发布PDF文件。这些文件几乎都是扫描过的PDF文件,它们似乎真的会让iOS设备陷入困境

我提出的第一个解决方案是将PDF托管在UIWebView中。这对“生成的”PDF文件非常有效,但对扫描的PDF文件无效(我猜这里的区别是光栅和矢量?)

我的下一个解决方案是实现UIDocumentInteractionController,据说它可以提高敏捷性。我可以报告说,它确实看起来比UIWebView快,但它仍然慢得令人无法接受,即使是在较小的2页PDF文件上。(另一方面,“在另一个应用程序中自动打开”功能以及内置打印非常流畅!)

我读过一两篇关于QuickLook框架的文章,我计划对此进行研究,但我也偶然发现了一些关于CGPDFDocument类之类的文章。这些似乎对文档导航有更好的控制(一个la-xPdf),但我不知道从哪里开始。另外,我甚至不确定它是否能为我所做的工作带来性能优势

那么,第一个问题:在iPhone/iPad上呈现扫描PDF文件的最快方式是什么

第二个问题:扫描的PDF文件是由我的公司生成的,所以我可以控制PDF生成设置。有人知道什么设置可以提高基于图像的PDF文件的加载速度吗

谢谢


(顺便说一句:我今天已经连续写了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)。