首页 > 解决方案 > Swift:重绘 PDF 时分辨率丢失

问题描述

我正在尝试使用 PDF 文件(包含带有多个“记录”的表格的表格)作为模板。我的想法是将原始文件作为模板读取,然后使用Swifts绘图功能在相关位置插入文本,然后保存为新的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
    }
    
    // Mark the beginning of the page.
    pdfContext.beginPDFPage(nil)

    // Save the context state to restore after we are done drawing the image.
    pdfContext.saveGState()

    // Change the PDF context to match the UIKit coordinate system.
    pdfContext.translateBy(x: 0, y: StandardPageDimensions.ISO216_A4.height)
    pdfContext.scaleBy(x: 1, y: -1)

    // Option 1: Draw PDF from a file added to my project
    DrawingHelper.drawPDFfromCGPDF(page: page, drawingArea: pageTemplate)
    
    // Option 2: Draw PDF from Assets
    //let baseTemplate = UIImage(named: "MyPdfTemplate")
    //baseTemplate?.draw(at: CGPoint(x: 0, y: 0))

    // Draw the records over the template - NOT the source of the problem, happens even when commented out
    //addRecordsToTemplate(records: records)

    // Restoring the context back to its original state.
    pdfContext.restoreGState()

    // Mark the end of the current page.
    pdfContext.endPDFPage()
    
    UIGraphicsEndPDFContext()
    
    // Useful to find and open the file produced on the simulator
    print("pdf created at : \(fileURL.path)")
    
    return fileURL
}

    // And the drawing function from my helper class
    static func drawPDFfromCGPDF(page: CGPDFPage, drawingArea: CGRect) {

    let renderer = UIGraphicsImageRenderer(size: drawingArea.size)
    let img = renderer.image { ctx in
        UIColor.white.set()
        ctx.fill(drawingArea)

        ctx.cgContext.translateBy(x: 0.0, y: drawingArea.size.height)
        ctx.cgContext.scaleBy(x: 1.0, y: -1.0)

        ctx.cgContext.drawPDFPage(page)
    }

    img.draw(at: CGPoint(x: 0, y: 0))
}

标签: swiftpdf-generationuigraphicsimagerenderer

解决方案


推荐阅读