High quality UIImage from PDF

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.


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
}

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