How to create thumbnails from PDF document with iPhone SDK?

I read the Apple PDF documentation with Quartz .

But I do not know how to create thumbnails from a PDF document ...

Any idea / sample code?

+11
iphone pdf quartz-graphics
source share
6 answers

Here is my sample code.

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 (eg drawing, saving it to a file, etc) CGContextRestoreGState(context); } UIGraphicsEndImageContext(); CGPDFDocumentRelease(pdf); 
+28
source share

Starting with iOS 11, where the PDFKit platform became available, you can get a thumbnail as simple as:

 import PDFKit func pdfThumbnail(url: URL, width: CGFloat = 240) -> UIImage? { guard let data = try? Data(contentsOf: url), let page = PDFDocument(data: data)?.page(at: 0) else { return nil } let pageSize = page.bounds(for: .mediaBox) let pdfScale = width / pageSize.width // Apply if you're displaying the thumbnail on screen let scale = UIScreen.main.scale * pdfScale let screenSize = CGSize(width: pageSize.width * scale, height: pageSize.height * scale) return page.thumbnail(of: screenSize, for: .mediaBox) } 
+10
source share

At the same time, I created a library that supports PDFs, images and videos for creating thumbnails. Maybe someone else can use it:

https://github.com/prine/ROThumbnailGenerator

Solution in Swift. Just pass the NSURL to the PDF file and the page number you want to get as 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
source share

With iOS 11, you can use PDFKit .

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

Call it:

 let thumbnailSize = CGSize(width: 100, height: 100) let thumbnail = generatePdfThumbnail(of: thumbnailSize, for: url, atPage: 0) 
+3
source share

Swift 4 Prine Call Answer Version

 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 } 
0
source share

For lens s

 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]; 
0
source share

Source: https://habr.com/ru/post/650364/


All Articles