使用CoreGraphics绘制PDF提高分辨率的方法

最近在处理一个绘制PDF文件但是清晰度不够的问题,网上查了很多资料,大多都只是讲绘制上去的方法,发现很少有提及如何提高PDF分辨率的方法。在反复尝试和摸索后,实现了在有限的显示范围内展示分辨率较高的PDF文件方法。不一定是唯一和最好的方法,如有更好更简便的方法欢迎交流。

1. 摸索

class PDFView: UIView {

init(frame: CGRect, pageIndex: Int, pdfDocument: CGPDFDocument) {
        self.pageIndex = pageIndex
        self.pdfDocument = pdfDocument
        super.init(frame: frame)

        self.backgroundColor = UIColor.white
    }
    
override dynamic func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }
        // 绘制pdf内容
        guard let page = pdfDocument.page(at: pageIndex) else {
            return
        }
        // pdf文件size
        let pdfSize = PDFView.pdfPageSize(pageIndex: pageIndex, pdfDocument: pdfDocument)
        // 调整坐标系
        context.translateBy(x: 0, y: pdfSize.height)
        context.scaleBy(x: 1, y: -1)
        context.saveGState()
        
        let transform = page.getDrawingTransform(CGPDFBox.cropBox, rect: CGRect(x: 0, y: 0, width: pdfSize.width , height: pdfSize.height ), rotate: 0, preserveAspectRatio: true)
        
        context.concatenate(transform)
        context.drawPDFPage(page)
        
        context.restoreGState()
    }
    
}

上面是使用CoreGraphics绘制PDF的一般方法,但是没有找到可以调整分辨率或者清晰度的参数或方法。

1.1 调整scaleBy来增大分辨率

通过尝试,发现调整scaleBy的比例可以拉伸绘制画面,从而提高分辨率context.scaleBy(x: 1, y: -1),但是拉伸了画面后会导致在有限的View中不能完整的展示整个PDF文件了。

1.2 以相同的比例同时扩大scale绘制比例及PDFView的frame

分辨率已经提高了,接下来就是解决展示不全的问题。那为什么会展示不全呢?是因为PDFView的frame没有增大,但是增大了绘制的比例,导致只有部分pdf绘制在PDFView上。所以思路很明显了,以相同的比例同时扩大scale绘制比例及PDFView的frame

2. 实践

最终思路就是:先以一定的比例增大整个PDFView及绘制pdf时的scale,再等绘制完成后调整整个PDFView的大小以适应展示大小,直接上代码:

class PDFView: UIView {
    var drawFinish:(()->Void)?  // 绘制完成回调
    var jwZoomScale : CGFloat     // 初始化缩放比(数值越大分辨率越高)-> 用于提高PDF分辨率,主要思路为初始化或翻页时,扩大几倍bounds.size,绘制出来的PDF图层就会清晰很多,然后在绘制完成后,缩小bounds.size至原来大小即可

init(frame: CGRect, pageIndex: Int, pdfDocument: CGPDFDocument) {
        self.jwZoomScale = 2
        self.pageIndex = pageIndex
        self.pdfDocument = pdfDocument
        let pdfSize = PDFView.pdfPageSize(pageIndex: pageIndex, pdfDocument: pdfDocument)
        super.init(frame:CGRect(x: 0, y: 0, width: pdfSize.width * self.jwZoomScale, height: pdfSize.height * self.jwZoomScale))

        self.backgroundColor = UIColor.white
    }
    
    override dynamic func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }
        // 绘制pdf内容
        guard let page = pdfDocument.page(at: pageIndex) else {
            return
        }
        // pdf文件size
        let pdfSize = PDFView.pdfPageSize(pageIndex: pageIndex, pdfDocument: pdfDocument)
        // 调整坐标系
        context.translateBy(x: 0, y: pdfSize.height * self.jwZoomScale)
        context.scaleBy(x: self.jwZoomScale, y: -self.jwZoomScale)
        context.saveGState()
        
        let transform = page.getDrawingTransform(CGPDFBox.cropBox, rect: CGRect(x: 0, y: 0, width: pdfSize.width , height: pdfSize.height ), rotate: 0, preserveAspectRatio: true)
        
        context.concatenate(transform)
        context.drawPDFPage(page)
        
        context.restoreGState()
        // 绘制完成调整展示大小回调方法
        drawFinish?()
    }

}

欢迎指正

你可能感兴趣的:(使用CoreGraphics绘制PDF提高分辨率的方法)