2011-05-29 130 views
3

我正在编写一个应用程序,它管理用户的文档并(最终)张贴通过iPhone/iPad上的Web服务提供的PDF文件。这些几乎都是扫描的PDF文件,并且它们看起来会严重阻塞iOS设备。iOS提高PDF渲染速度

我想出的第一个解决方案就是将PDF托管在UIWebView中。这对于“生成的”PDF文件确实很好,但对于扫描的PDF文件却不适用(我猜这里的区别是光栅还是矢量?)。

我的下一个解决方案是实现一个UIDocumentInteractionController,据说这增加了快乐。我可以报告说,它确实比UIWebView的速度快,但即使在小型的2页PDF文件中,它的速度仍然令人无法接受。 (在旁注中,“另一个应用程序中的自动打开”功能以及内置打印功能是超级光滑的!)

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

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

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

谢谢!

(顺便说一句:我已经19小时连续的今天被编码,所以如果我天马行空或没有意义,请原谅我!:))

+0

有你可以上传我们的样本PDF占位符图像(使用CATiledLayer)?最有可能与使用的TIFF压缩类型有关(假设纸张最初被扫描到TIFF)。 – Rowan 2011-05-30 08:14:50

回答

2

你可能想尝试缩小图像尺寸。大型PDF实际上是将iPad/iPhone推向极限。当然这意味着你需要自己绘制/管理pdf,用Quartz调用。

适当的缓存可以提高速度。您可以将页面呈现在屏幕外,并在不打开实际PDF的情况下显示它们 - 这要快得多。

1

如果你绝望,你可以重新处理你的服务器上的PDF文件,把它们变成简单的图像文件(与原始PDF文件相关联),然后加载这些文件。这种方式不需要“pdf”解析。然后您可以在服务器上托管,或者在音量不足的情况下作为应用的一部分加入。

基本上你需要一个服务器脚本来完成所有的重新处理并将新文件粘贴到一个特殊的文件夹中。也许你会创建一个数据库来引用新文件。或者可能为每个反映原始pdf文件名的新文件创建目录名称。

1

通过使用UIWebView来渲染PDF,我们将无法正确控制PDF。就像我们无法直接进入所需页面一样。我们无法搜索某个单词并突出显示。

它更好地使用CGPDF类如CGPDFDocumentRef和CGPDFPageRef来正确处理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; 
} 
6

最快的解决方案是使用CGPDFDocument类编写自己的自定义pdf解析器和渲染框架。超快pdf渲染的秘诀是使用如下技术:

  • 将全尺寸页面离屏渲染为图像。
  • 只在特定缩放级别后激活CATiledLayer绘图。当用户以默认缩放级别查看您的PDF页面时,无需激活CATiledLayer绘图,因为它非常昂贵。只显示已经离屏的渲染图像。当用户开始放大时,您可以激活CATiledLayer。
  • 使用智能算法来缓存离屏渲染的pdf页面。您可以将上一页和下一页缓存为离屏渲染图像。
  • 在快速设备(iPhone 4或更高版本以及iPad 2或更高版本)上,您可以启动后台作业,将所有页面呈现在屏幕外并保存到磁盘。
  • 缓存经常使用的关于pdf页面的信息,例如:原始矩形,旋转,旋转矩形等。
  • 您将使用很多CGPDFPageRef对象。知道这会增加内存使用量很重要。一个小技巧就是在收到内存警告时关闭并重新打开CGPDFDocumentRef对象。

我在PDFTouch SDK for iOS中使用了上述所有技术,这是我开发的一个快速的pdf渲染框架!

0

这里是我的2美分关于简单和快速pdf渲染在迅速。

SwiftyPDF

  • 寻呼与系统UIPageViewController
  • 与UIScrollView的缩放功能
  • 缩放通过转换页面占位符图像快速渲染PDF
  • PDF页面的缩放和分成小砖。瓷砖被缓存到图像文件,并呈现在

不过WIP