I'm trying to get the image(high quality) of each pdf page. I'm using below code running through a for loop until page count and it works.
guard let document = CGPDFDocument(pdfurl as CFURL) else { return }
guard let page = document.page(at: i) else { return }
let dpi: CGFloat = 300.0/72.0
let pagerect = page.getBoxRect(.mediaBox)
print(pagebounds)
print(pagerect)
let render = UIGraphicsImageRenderer(size: CGSize(width: pagerect.size.width * dpi, height: pagerect.size.height * dpi))
let imagedata = render.jpegData(withCompressionQuality: 0.5, 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 image = UIImage(data: imagedata)
I'm getting following issues with this ...
- sometimes the
imageisnil. - When this runs, the usage of
memory is very high. - With the page count(number of pages), usage of memory is very very high, and sometimes it goes to
1.4 GBand suddenly it crashes the app with the warning :Terminate due to memory waring. then I tried to run above code insideautoreleasepool. it did work but when the memory usage is more high (when it near to RAM size), again app crashes with above warning.
How can I avoid this memory warning and get the quality image form pdf page. hope any help. have a nice day.
1) sometimes the image is nil.
UIImageVS directly creating an uiimage (usingfunc image(actions: (UIGraphicsImageRendererContext) -> Void) -> UIImage)?UIImage(data:), use CGImage'sinit?(jpegDataProviderSource source: CGDataProvider, decode: UnsafePointer<CGFloat>?, shouldInterpolate: Bool, intent: CGColorRenderingIntent)then useUIImage(cgImage:)to get yourUIImageinstance2) When this runs, the usage of memory is very high