在 Swift 中从 UIView 创建 PDF

Posted

技术标签:

【中文标题】在 Swift 中从 UIView 创建 PDF【英文标题】:Creating PDF from UIView in Swift 【发布时间】:2020-04-02 21:40:55 【问题描述】:

我已经被困/研究这个问题好几天了,下面的方法成功地从常规大小的 UIView 创建了 pdf。但是,我需要位于 UIScrollview 内的 containerView 的内容。我的 containerView 的高度是 5000。有人可以帮我将 containerView 渲染成多个 PDF 页面,或者指导我找到更好的方法。 `func exportAsPdfFromView() -> 字符串

    func screenShotScrollview() -> String 

    let scrollView = waiverViews.scrollView

    let pageDimensions = scrollView.bounds

    let pageSize = pageDimensions.size
    let totalSize = scrollView.contentSize

    let numberOfPagesThatFitVertivally = Int(ceil(totalSize.height/pageSize.height))

    let outputData = NSMutableData()

    UIGraphicsBeginPDFContextToData(outputData, pageDimensions, nil)

    let savedContentOffset = scrollView.contentOffset
    let savedContentInset = scrollView.contentInset

    scrollView.contentInset = UIEdgeInsets.zero

    let origin = CGRect(x: 0, y: 0, width: pageSize.width, height: pageSize.height)

    if let context = UIGraphicsGetCurrentContext() 

        for indexVertical in 0..<numberOfPagesThatFitVertivally 

            UIGraphicsBeginPDFPageWithInfo(origin, nil)

            let offsetVertical = CGFloat(indexVertical) * pageSize.height

            scrollView.contentOffset = CGPoint(x: 0, y: offsetVertical)

            context.translateBy(x: 0, y: -offsetVertical)

            scrollView.layer.render(in: context)

        
        UIGraphicsEndPDFContext()


        scrollView.contentInset = savedContentInset
        scrollView.contentOffset = savedContentOffset
    

    return self.saveViewPdf(data: outputData)

【问题讨论】:

【参考方案1】:

基本上,scrollView 不希望一直将所有内容呈现到其层,直到它被查看。

我猜这只是返回 UIScrollView 当前窗口的快照?

要拍摄 UIScrollView 的整个 contentBounds 的多个快照,您可能会在其总数 contentBounds.height/frame.height 中的滚动视图的 setTheContentOffset 中返回页面。然后在循环内生成PDF?

例如像这样,然后在 UX 方面,隐藏滚动视图。当它正在生成时,完成后将其取消隐藏。

for i in 0..<pages 
    scrollView.setContentOffset(.init(x: 0, y: i*scrollViewHeight))
    //PDF Generation flow
    //set the url to something like "pdf_file_\(i).pdf"

【讨论】:

你有这种方法的例子吗?我将不胜感激。 @WurlLink 我提供了一个示例 sn-p 这是否适用于我已经使用的方法?还是我必须一起尝试一种完全不同的方法? @WurlLink 我需要看看func saveViewPdf 做了什么来回答这个问题,但本质上它应该,如果将 pdf 数据写入本地文件 我已经尝试了您的答案,但不知何故,我只保存了前两页。我在我的问题中更新了我的代码。我非常感谢我能得到的任何帮助。

以上是关于在 Swift 中从 UIView 创建 PDF的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中从 NSData 显示 PDF - 如何将 PDF 保存到文档文件夹 Swift - 如何在 Swift 中通过 WebView 从保存的 NSData 显示 PDF

在 Swift 中从 HTML 生成带有图像的 PDF 而不显示打印界面

Swift PDF 渲染任何 UIView 或 UIViewController PDFKit

在自定义 UIView 类中从 UIView 快速创建 IBoutlet [重复]

Swift 中的函数将 Pdf 文件附加到另一个 Pdf

使用 AVPlayer 播放的视频在 swift3 中从其容器视图中消失