I\'m converting a PDF page into a UIImage. While doing so, I lose the image quality. Need help in getting high quality images.
Code to generate UIImage
This one gives the best quality... if you need another quality just change dpi.
func drawPDFfromURL(url: URL) -> UIImage? {
guard let document = CGPDFDocument(url as CFURL) else { return nil }
guard let page = document.page(at: 1) else { return nil }
let dpi: CGFloat = 300.0 / 72.0
let pageRect = page.getBoxRect(.mediaBox)
let renderer = UIGraphicsImageRenderer(size: CGSize(width: pageRect.size.width * dpi, height: pageRect.size.height * dpi))
let img1 = renderer.jpegData(withCompressionQuality: 1.0, actions: { cnv in
UIColor.white.set()
cnv.fill(pageRect)
cnv.cgContext.translateBy(x: 0.0, y: pageRect.size.height * dpi);
cnv.cgContext.scaleBy(x: dpi, y: -dpi);
cnv.cgContext.drawPDFPage(page);
})
let img2 = UIImage(data: img1)
return img2
}
When you ask the PDF for it's page size, you're getting a width/height for 72 PPI. You might try creating a context that's scaled up using a scale transform. For example, if you wanted to render at 300 dpi, add a scale transform to scale by 300.0/72.0
.
If you export as TIFF, you will be able to encapsulate the final PPI (300) of the generated image.
I've written a handy UIImage PDF renderer category that you may find helpful. It also caches all rendered results for high performance.
https://github.com/mindbrix/UIImage-PDF
As of iOS 11.0, macOS 10.13, Mac Catalyst 13.0 you can use thumbnailOfSize:forBox:
Try this code for Swift 3 :
func drawPDFfromURL(url: URL) -> UIImage? {
guard let document = CGPDFDocument(url as CFURL) else { return nil }
guard let page = document.page(at: 1) else { return nil }
let pageRect = page.getBoxRect(.mediaBox)
let renderer = UIGraphicsImageRenderer(size: pageRect.size)
let img1 = renderer.jpegData(withCompressionQuality: 1.0, actions: { cnv in
UIColor.white.set()
cnv.fill(pageRect)
cnv.cgContext.translateBy(x: 0.0, y: pageRect.size.height);
cnv.cgContext.scaleBy(x: 1.0, y: -1.0);
cnv.cgContext.drawPDFPage(page);
})
let img2 = UIImage(data: img1)
return img2
}
This gives much higher resolution
import PDFKit
let pdfDocument = PDFDocument(url: pdfUrl)!
let thumb = pdfDocument.page(at: pageIndex)?.thumbnail(of: size, for: .mediaBox)