High quality UIImage from PDF

后端 未结 6 1350
我寻月下人不归
我寻月下人不归 2020-12-14 03:57

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

相关标签:
6条回答
  • 2020-12-14 04:21

    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
    }
    
    0 讨论(0)
  • 2020-12-14 04:26

    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.

    0 讨论(0)
  • 2020-12-14 04:30

    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

    0 讨论(0)
  • 2020-12-14 04:35

    As of iOS 11.0, macOS 10.13, Mac Catalyst 13.0 you can use thumbnailOfSize:forBox:

    0 讨论(0)
  • 2020-12-14 04:42

    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

    0 讨论(0)
  • 2020-12-14 04:43
    import PDFKit
    
    let pdfDocument = PDFDocument(url: pdfUrl)!
    let thumb = pdfDocument.page(at: pageIndex)?.thumbnail(of: size, for: .mediaBox)
    
    0 讨论(0)
提交回复
热议问题