为iBooks等PDF文件创建高效的缩略图

时间:2011-02-16 18:23:12

标签: iphone pdf graphics

iBooks如何能够在首次加载时如此快速地创建PDF页面缩略图?我尝试使用CGContext函数绘制页面,然后调整大小以获取缩略图。但这种方法需要很长时间。有没有一种有效的方法来获取PDF页面的缩略图?

提前致谢, 阿努邦

2 个答案:

答案 0 :(得分:0)

首先获取所有PDF文件数组中的路径[此处即:pdf]。然后,如果要在UICollectionView中显示所有这些PDF缩略图,只需将从集合视图委托方法“CellForRowAtIndexPath”获取的索引传递给以下内容,

-(UIImage *)GeneratingIcon:(int)index
{
    NSURL* pdfFileUrl = [NSURL fileURLWithPath:[pdfs objectAtIndex:index]];
    CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfFileUrl);
    CGPDFPageRef page;

    CGRect aRect = CGRectMake(0, 0, 102, 141); // thumbnail size
    UIGraphicsBeginImageContext(aRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIImage* IconImage;
    CGContextSaveGState(context);
    CGContextTranslateCTM(context, 0.0, aRect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextSetGrayFillColor(context, 1.0, 1.0);
    CGContextFillRect(context, aRect);

    // Grab the first PDF page
    page = CGPDFDocumentGetPage(pdf, 1);
    CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFMediaBox, aRect, 0, true);
    // And apply the transform.
    CGContextConcatCTM(context, pdfTransform);

    CGContextDrawPDFPage(context, page);

    // Create the new UIImage from the context
    IconImage = UIGraphicsGetImageFromCurrentImageContext();

    CGContextRestoreGState(context);

    UIGraphicsEndImageContext();
    CGPDFDocumentRelease(pdf);

    return IconImage;
}

希望这足够快,可以为PDF创建缩略图。

答案 1 :(得分:0)

免责声明:我没有检查这是否更快。


ImageIO中有一些专门用于创建缩略图的内置方法。应优化这些方法以创建缩略图。您需要将ImageIO.framework添加到项目中,并在代码中添加#import <ImageIO/ImageIO.h>

// Get PDF-data
NSData *pdfData = [NSData dataWithContentsOfURL:myFileURL];

// Get reference to the source
// NOTE: You are responsible for releasing the created image source
CGImageSourceRef imageSourceRef = CGImageSourceCreateWithData((__bridge CFDataRef)pdfData, NULL);

// Configure how to create the thumbnail
// NOTE: You should change the thumbnail size depending on how large thumbnails you need.
// 512 pixels is probably way too big. Smaller sizes will be faster.
NSDictionary* thumbnailOptions = 
    @{(id)kCGImageSourceCreateThumbnailWithTransform: (id)kCFBooleanTrue,
      (id)kCGImageSourceCreateThumbnailFromImageIfAbsent: (id)kCFBooleanTrue,
      (id)kCGImageSourceThumbnailMaxPixelSize: @512}; // no more than 512 px wide or high

// Create thumbnail
// NOTE: You are responsible for releasing the created image
CGImageRef imageRef = 
    CGImageSourceCreateThumbnailAtIndex(imageSourceRef,
                                        0, // index 0 of the source
                                        (__bridge CFDictionaryRef)thumbnailOptions);

// Do something with the thumbnail ...

// Release the imageRef and imageSourceRef
CGImageRelease (imageRef);
CFRelease(imageSourceRef);