Swift重绘PDF模板导出文件时出现分辨率降低问题如何解决
问题根源
你当前的实现存在不必要的栅格化步骤:drawPDFfromCGPDF 方法中使用 UIGraphicsImageRenderer 将矢量PDF模板渲染为位图UIImage,再将位图绘制到PDF上下文,相当于把原本的矢量文字、网格线全部转为固定分辨率的像素,自然会出现边缘模糊、分辨率损失的问题。
你尝试的两种存储方案都无法解决问题的原因:
- 方案1:PDF存项目本身没问题,但栅格化步骤直接丢失了矢量信息
- 方案2:PDF存Asset时,使用
UIImage(named:)加载默认会按当前设备屏幕分辨率渲染为位图,哪怕开启Preserve Vector Data,仅在UIImageView缩放场景下会保留矢量,直接绘制到上下文时仍为位图格式。
解决方案
删掉多余的栅格化逻辑,直接在当前的PDF矢量上下文中绘制原始PDF页,完整保留矢量信息。
修正后的代码
func createCompletedForm(records: [MyDataObject]) -> URL? { let directoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] let fileURL = URL(fileURLWithPath: "pdfToPrint", relativeTo: directoryURL).appendingPathExtension("pdf") guard let templateUrl = Bundle.main.url(forResource: "MyPdfTemplate", withExtension: "pdf") else { return nil } guard let document = CGPDFDocument(templateUrl as CFURL) else { return nil } guard let page = document.page(at: 1) else { return nil } let pageTemplate = page.getBoxRect(.mediaBox) UIGraphicsBeginPDFContextToFile(fileURL.path, pageTemplate, nil) guard let pdfContext = UIGraphicsGetCurrentContext() else { print("Unable to access PDF Context.") return nil } pdfContext.beginPDFPage(nil) pdfContext.saveGState() // 坐标转换适配PDF绘制 pdfContext.translateBy(x: 0, y: pageTemplate.height) pdfContext.scaleBy(x: 1, y: -1) // 直接绘制矢量PDF页,无分辨率损失 pdfContext.drawPDFPage(page) // 绘制填充文本(保持矢量直接绘制即可,不要转位图) addRecordsToTemplate(records: records) pdfContext.restoreGState() pdfContext.endPDFPage() UIGraphicsEndPDFContext() print("pdf created at : \(fileURL.path)") return fileURL }
注意:填充文本时请直接使用
NSString.draw(at:withAttributes:)等矢量绘制接口,不要将文本转为图像再绘制,避免再次出现栅格化模糊问题。
内容的提问来源于stack exchange,提问作者Andy P
相关产品推荐
相关产品推荐

