最近在处理一个绘制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?()
}
}
欢迎指正
网友评论