如何使用iPhone SDK从PDF文档生成缩略图?

时间:2010-12-21 23:11:36

标签: iphone pdf quartz-graphics

我已阅读the Apple PDF documentation with Quartz

但我不知道如何从PDF文档中生成缩略图......

任何想法/示例代码?

6 个答案:

答案 0 :(得分:28)

这是我的示例代码。

NSURL* pdfFileUrl = [NSURL fileURLWithPath:finalPath];
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfFileUrl);
CGPDFPageRef page;

CGRect aRect = CGRectMake(0, 0, 70, 100); // thumbnail size
UIGraphicsBeginImageContext(aRect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
UIImage* thumbnailImage;


NSUInteger totalNum = CGPDFDocumentGetNumberOfPages(pdf);

for(int i = 0; i < totalNum; i++ ) {


    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, i + 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
    thumbnailImage = UIGraphicsGetImageFromCurrentImageContext();

    //Use thumbnailImage (e.g. drawing, saving it to a file, etc)

    CGContextRestoreGState(context);

}


UIGraphicsEndImageContext();    
CGPDFDocumentRelease(pdf);

答案 1 :(得分:6)

从可以使用PDFKit框架的iOS 11开始,您可以像以下一样获得缩略图:

{{1}}

答案 2 :(得分:3)

与此同时,我创建了一个支持PDF,图像和视频的库,用于创建缩略图。也许其他人可以使用它:

https://github.com/prine/ROThumbnailGenerator

Swift中的解决方案。只需将NSURL传递给PDF和您想要检索为UIImage的页码:

func getThumbnail(url:NSURL, pageNumber:Int) -> UIImage {

    var pdf:CGPDFDocumentRef = CGPDFDocumentCreateWithURL(url as CFURLRef);

    var firstPage = CGPDFDocumentGetPage(pdf, pageNumber)

    // Change the width of the thumbnail here
    var width:CGFloat = 240.0;

    var pageRect:CGRect = CGPDFPageGetBoxRect(firstPage, kCGPDFMediaBox);
    var pdfScale:CGFloat = width/pageRect.size.width;
    pageRect.size = CGSizeMake(pageRect.size.width*pdfScale, pageRect.size.height*pdfScale);
    pageRect.origin = CGPointZero;

    UIGraphicsBeginImageContext(pageRect.size);

    var context:CGContextRef = UIGraphicsGetCurrentContext();

    // White BG
    CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
    CGContextFillRect(context,pageRect);

    CGContextSaveGState(context);

    // ***********
    // Next 3 lines makes the rotations so that the page look in the right direction
    // ***********
    CGContextTranslateCTM(context, 0.0, pageRect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(firstPage, kCGPDFMediaBox, pageRect, 0, true));

    CGContextDrawPDFPage(context, firstPage);
    CGContextRestoreGState(context);

    var thm:UIImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    return thm;
}

答案 3 :(得分:2)

在iOS 11中,您可以使用PDFKit

import PDFKit

func generatePdfThumbnail(of thumbnailSize: CGSize , for documentUrl: URL, atPage pageIndex: Int) -> UIImage? {
    let pdfDocument = PDFDocument(url: url)
    let pdfDocumentPage = pdfDocument?.page(at: pageIndex)
    return pdfDocumentPage?.thumbnail(of: thumbnailSize, for: PDFDisplayBox.trimBox)
}

调用:

let thumbnailSize = CGSize(width: 100, height: 100)

let thumbnail = generatePdfThumbnail(of: thumbnailSize, for: url, atPage: 0)

答案 4 :(得分:0)

Swift 4 Prine的答案版本

func thumbnailFromPdf(withUrl url:URL, pageNumber:Int, width: CGFloat = 240) -> UIImage? {
    guard let pdf = CGPDFDocument(url as CFURL),
        let page = pdf.page(at: pageNumber)
        else {
            return nil
    }

    var pageRect = page.getBoxRect(.mediaBox)
    let pdfScale = width / pageRect.size.width
    pageRect.size = CGSize(width: pageRect.size.width*pdfScale, height: pageRect.size.height*pdfScale)
    pageRect.origin = .zero

    UIGraphicsBeginImageContext(pageRect.size)
    let context = UIGraphicsGetCurrentContext()!

    // White BG
    context.setFillColor(UIColor.white.cgColor)
    context.fill(pageRect)
    context.saveGState()

    // Next 3 lines makes the rotations so that the page look in the right direction
    context.translateBy(x: 0.0, y: pageRect.size.height)
    context.scaleBy(x: 1.0, y: -1.0)
    context.concatenate(page.getDrawingTransform(.mediaBox, rect: pageRect, rotate: 0, preserveAspectRatio: true))

    context.drawPDFPage(page)
    context.restoreGState()

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}

答案 5 :(得分:0)

对于Objective-c

CGRect pageSize = [[self.pdfView.document pageAtIndex:0] boundsForBox:kPDFDisplayBoxMediaBox];
CGFloat pdfScale = [UIScreen mainScreen].bounds.size.width /pageSize.size.width;
CGFloat scale = [UIScreen mainScreen].scale * pdfScale;
UIImage thumbnailImage = [[self.pdfView.document pageAtIndex:0] thumbnailOfSize:CGSizeMake(pageSize.size.width *scale, pageSize.size.height *scale) forBox:kPDFDisplayBoxMediaBox];