站点图标 Codeun

如何将 SwiftUI 的视图渲染保存为 PDF

iOS 16 中,有一个新的 Api 可以帮我们快速的把 SwiftUI 视图转换为 PDF 矢量图,内容可以优雅的放大查看,主要使用的是 ImageRenderer


使用 ImageRenderer 步骤

说的好像有点绕,贴一个示例,步骤放在注释中看应该就能清晰明了,代码量很小,写于 Xcode 14.2

@MainActor
struct ContentView: View {
    var body: some View {
        ShareLink("导出成PDF", item: render())
    }

    func render() -> URL {
        // 1: 选取一个 ImageRenderer 视图
        let renderer = ImageRenderer(content:
            Text("Hello, www.codeun.com!")
                .font(.largeTitle)
                .foregroundColor(.white)
                .padding()
                .background(.blue)
                .clipShape(Capsule())
        )

        // 2: 创建 PDF 保存地址
        let url = URL.documentsDirectory.appending(path: "codeun.pdf")

        // 3: 调用 render() 方法以开始执行渲染
        renderer.render { size, context in
            // 4: 指定 PDF 的大小;
            var box = CGRect(x: 0, y: 0, width: size.width, height: size.height)

            // 5: 创建一个 CGContext 对象来处理 PDF 页面
            guard let pdf = CGContext(url as CFURL, mediaBox: &box, nil) else {
                return
            }

            // 6: 再创建一个新的 PDF 页面
            pdf.beginPDFPage(nil)

            // 7: 将 SwiftUI 视图渲染到该页面上
            context(pdf)

            // 8: 结束页面并关闭 PDF 文档;
            pdf.endPDFPage()
            pdf.closePDF()
        }

        return url
    }
}

退出移动版