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

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


使用 ImageRenderer 步骤

  • 选取需要渲染的 SwiftUI 视图;
  • 创建一个用于保存 PDFURL地址;
  • 调用 render() 方法执行渲染;
  • 指定 PDF 的大小; (可以是固定尺寸,如 A4 或 US Letter,也可以是视图结构的大小)
  • 创建一个 CGContext 对象来处理 PDF 页面;
  • 再创建一个新的 PDF 页面;
  • SwiftUI 视图渲染到该页面上;
  • 结束页面并关闭 PDF 文档;

说的好像有点绕,贴一个示例,步骤放在注释中看应该就能清晰明了,代码量很小,写于 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
    }
}

  本文自 https://www.codeun.com 发布,相应代码均自主编写并严格审阅和测试,完整代码中包含丰富的学习笔记和使用方式、实用技巧。
  · 如若转载,请注明出处:https://www.codeun.com/archives/1114.html ·

(0)
上一篇 2023-06-04
下一篇 2023-06-10

发表回复

登录后才能评论