如何在SwiftUI iOS中将SwiftUI长视图转换为具有多个页面的PDF?

smdncfj3  于 2023-04-22  发布在  iOS
关注(0)|答案(1)|浏览(164)

如果iPad上的swiftUI视图内容高度超过1500,我想创建多页PDF。
我在谷歌上尝试的多种解决方案都不起作用。
我需要将我的整个SwiftUI视图转换为iPad上的多个PDF页面。
SwiftUI视图的大小= CGSize(width:1118.0,,身高:1700.0)

我在这里添加了我的看法,我希望到PDF的多个页面的看法,因为我的看法的高度超过A4大小的高度。

@MainActor func render(view: some View) -> URL? {
// 1: Render Hello World with some modifiers
if #available(iOS 16.0, *) {
    let renderer = ImageRenderer(content: view)
    // 2: Save it to our documents directory
    let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let url = documentDirectory.appendingPathComponent("SwiftUIPDF1.pdf")
    
    print(url)

    // 3: Start the rendering process
    renderer.render { size, context in
        // 4: Tell SwiftUI our PDF should be the same size as the views we're rendering
        var box = CGRect(x: 0, y: 0, width: size.width, height: size.height)

        // 5: Create the CGContext for our PDF pages
        guard let pdf = CGContext(url as CFURL, mediaBox: &box, nil) else {
            return
        }

        // 6: Start a new PDF page
        pdf.beginPDFPage(nil)

        // 7: Render the SwiftUI view data onto the page
        context(pdf)

        // 8: End the page and close the file
        pdf.endPDFPage()
        pdf.closePDF()
    }

    return url
} else {
    // Fallback on earlier versions
}
return nil
}
zpgglvta

zpgglvta1#

我没有一个复制和粘贴代码的解决方案给你,但我可以提供一个算法,你需要做什么来创建一个多页的PDF。
您的代码创建一个PDF页面的原因是因为代码只创建一个PDF页面。您只调用beginPDFPageendPDFPage一次。您必须为PDF中的每个页面调用这些函数一次。
首先创建一个变量,存储视图中开始绘制PDF页面的位置。将此变量的初始值设置为0。
当起始位置小于视图大小时,请执行以下操作:

  • 调用beginPDFPage
  • 从视图中从开始位置开始绘制一个PDF页面。
  • 调用endPDFPage
  • 通过添加在当前页面中绘制的量来更新起始位置值。

创建完PDF页面后调用closePDF

相关问题