【问题标题】:Creating PDF from UIView in Swift在 Swift 中从 UIView 创建 PDF
【发布时间】: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)
}

【问题讨论】:

    标签: swift pdf uiview


    【解决方案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 数据写入本地文件
    • 我已经尝试了您的答案,但不知何故,我只保存了前两页。我在我的问题中更新了我的代码。我非常感谢我能得到的任何帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 2021-04-19
    • 1970-01-01
    • 2014-10-29
    • 2018-05-16
    • 2021-05-04
    • 2013-10-10
    • 2011-08-29
    相关资源
    最近更新 更多