You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:06:04