加载PDF时iOS滞后

时间:2014-01-29 15:14:07

标签: ios objective-c pdf pdf-generation cgcontext

所以我的应用程序使用了很多PDF'这些表需要很长时间才能加载,(10秒+在iPad 2,iOS 7上)所以我想我是否可以将单独的表加载到文件目录,在ApplicationDidFinishLaunching() - 然后我可以引用用户目录中的文件,它们会加载更快 - 但它完全没有区别

以下是我负责显示PDF的DrawRect()方法

CGContextRef ctx = UIGraphicsGetCurrentContext();
//PDF might be transparent, assume white paper - set White Background
[[UIColor whiteColor] set];
CGContextFillRect(ctx, rect);

//PDF File Path
//"pdf" refers to the location in the directory where the file is saved"
CGPDFPageRef page1 = CGPDFDocumentGetPage(pdf, 1);

//Flip coordinates
CGContextGetCTM(ctx);
CGContextScaleCTM(ctx, 1, -1);
CGContextTranslateCTM(ctx, 0, -rect.size.height);

//Get the rectangle of the cropped inside
CGRect mediaRect = CGPDFPageGetBoxRect(page1, kCGPDFCropBox);

CGContextScaleCTM(ctx, rect.size.width / mediaRect.size.width,
                  rect.size.height / mediaRect.size.height);

//Draw PDF
CGContextDrawPDFPage(ctx, page1);
CGPDFDocumentRelease(pdf);

在idInit()方法中声明文件的目录中的位置

NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
    NSString *documentDirectory = [documentDirectories objectAtIndex:0];
    NSString *dataPath = [documentDirectory stringByAppendingPathComponent:
                          [NSString stringWithFormat:@"PDFSource"]];
    NSString *documentDirectoryFilename = [dataPath stringByAppendingPathComponent:
                                           [NSString stringWithFormat:@"BUEvenous.pdf"]];

    CFStringRef path = CFStringCreateWithCString (NULL, [documentDirectoryFilename UTF8String], kCFStringEncodingUTF8);
    CFURLRef url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, 0);
    CFRelease (path);
    pdf = CGPDFDocumentCreateWithURL(url);// 2
    CFRelease(url);

非常感谢您的帮助指导,建议以及我如何能够更快地加载此错误的地方

修改

@DavidvanDriessche感谢您的建议,我发现我使用的PDF文件实际上非常大(大约1 MB),我从测试中学到的是,如果我进一步压缩PDF文件,那么他们' re =< 500kbs然后我没有加载时间的问题 - 但压缩文件,导致PDF中的一些嵌入图像的图像质量损失:也可能是iPad 2 - 我会尝试在较新的设备上运行并添加到此帖子

还有其他建议吗?

任务

1 个答案:

答案 0 :(得分:2)

您可以考虑从pdf页面创建图像,并在后台线程中通过NSOperation或使用dispatch_async

来创建图像

从pdf页面创建图像:

+(UIImage *)getPDFPage:(CGPDFPageRef) page rect:(CGRect) rect
{

    CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);


    UIGraphicsBeginImageContext(pageRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextTranslateCTM(context, 0.0, pageRect.size.height);

    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextDrawPDFPage(context, page);

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    return img;
}

修改

此代码将为您提供由PDF文件(上面代码中的pageRect)决定的大小的图像。因此,缩放级别将由可用的媒体决定。请查看CGPDFPageGetBoxRect here的不同值。

请记住,图像可能占用大量内存。您可以使用以下方法将图像保存到磁盘:

NSData *imageData = UIImagePNGRepresentation(pdfImage);

然后在需要时加载相关页面。从iUnit磁盘加载图像非常快。