1

我正在一个 ios 应用程序中创建一个代表各种类型(PDF、图像、视频、HTML、.pages、.numbers、Word 等)下载文件的单元格网格,并且正在寻找一种方法来抢先创建预览缩略图让这些文件显示在单元格中。我目前正在使用 UIDocumentInteractionController 在用户选择一个文档后预览这些文档,并希望图标数组能够返回预览图像。不幸的是,它只返回一个通用图标。

我看到 Pages 和 Numbers 这样做,但他们拥有文档和格式。我希望 Quicklook 框架能提供一个解决方案,但我还没有找到它。有没有其他人找到一种方法来轻松生成这些缩略图?

我更喜欢使用实际的 UIImage 而不是其他人建议的 UIWebView 。该解决方案似乎是一个黑客,我必须相信那里有更好的解决方案。

我的下一个选择是在他们打开文档后通过将视图捕获为图像来生成预览,但这仍然看起来很老套。

有人有任何想法或更清晰的选择吗?

谢谢,

4

1 回答 1

3

我的解决方案:我从来没有找到一个完整的解决方案这个特定的问题,但我能够相当有效地处理 PDF。老实说,我不记得是我写了这个还是找到了一个例子。如果是您的代码发布在其他地方,谢谢!此处的最终结果是 docImage 为空,或者包含 PDF 的第一页作为图像。加载表格行时,我将图像预览设置为默认图像,然后使用块在后台线程上运行此代码。完成后,我只需将预览动画返回到单元格中。

NSURL *pdfFileURL = [NSURL fileURLWithPath:localFilePath];
CGPDFDocumentRef pdfDoc = CGPDFDocumentCreateWithURL((__bridge CFURLRef) pdfFileURL);
NSUInteger numPages = CGPDFDocumentGetNumberOfPages(pdfDoc);

if(numPages > 0) {
    docImage = [UIImage imageFromPDFDocumentRef:pdfDoc];
}
CGPDFDocumentRelease(pdfDoc);

UIImage 类别:

@implementation UIImage (CGPDFDocument)

+(UIImage *)imageFromPDFDocumentRef:(CGPDFDocumentRef)documentRef {
    return [self imageFromPDFDocumentRef:documentRef page:1];
} 
+(UIImage *)imageFromPDFDocumentRef:(CGPDFDocumentRef)documentRef page:(NSUInteger)page {
    CGPDFPageRef pageRef = CGPDFDocumentGetPage(documentRef, page);
    CGRect pageRect = CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox);

    UIGraphicsBeginImageContext(pageRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, CGRectGetMinX(pageRect),CGRectGetMaxY(pageRect));
    CGContextScaleCTM(context, 1, -1);  
    CGContextTranslateCTM(context, -(pageRect.origin.x), -(pageRect.origin.y));
    CGContextDrawPDFPage(context, pageRef);

    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return finalImage;    
}
@end
于 2012-12-05T22:47:26.787 回答