ios – 使用Swift生成PDF

我想从 Swift中的UITableView创建一个PDF.我发现了Objective C的一些教程,并尝试了但是这段代码仍然没有生成文件.
// get a temprorary filename for this PDF

        var path = NSTemporaryDirectory();
        var pdfFilePath = path.stringByAppendingPathComponent("mypdfdocument.pdf")

        UIGraphicsBeginPDFContextToFile(pdfFilePath,CGRectMake(0,self.tableView.contentSize.width,self.tableView.contentSize.height),nil)
        UIGraphicsBeginPDFPage();
        self.view.layer.renderInContext(UIGraphicsGetCurrentContext())
        self.tableView.scrollRectToVisible(CGRectMake(0,1,1),animated: false)
        self.tableView.layer.renderInContext(UIGraphicsGetCurrentContext())

        var screensInTable = Int(self.tableView.contentSize.width) / Int(self.tableView.contentSize.height)

        for i in 1...screensInTable {

            var point = CGFloat(CGFloat(i) * self.tableView.bounds.height)
            var contentOffset:CGPoint = CGPointMake(0,point)
            self.tableView.setContentOffset(contentOffset,animated: false)
            self.tableView.layer.renderInContext(UIGraphicsGetCurrentContext())
        }

        UIGraphicsEndPDFContext();

而且:我有一个包含4个部分的表和不同的行高和单元格模板.是否有机会使用此类代码轻松生成PDF?或者使用CoreText创建Row by Row会更好吗?

提前致谢.

解决方法

这是我的方法.使用模板视图.它具有所有静态文本和图像.然后为pdf中的每个页面使用此模板视图.这是我使用的功能:
func renderAsPDF(demandEntry: ParsedDemandEntry,inView view: UIView) -> NSData? {
    let entries = demandEntry.demands
    let pageCount = Int(ceil(Double(entries.count) / Double(demandCountForPage)))
    if pageCount != 0 {
        let views = (1...pageCount).map { (pageNumber: Int) -> UIView in
            let pdfPageView = createTemplatePageViewWithParsedEntry(demandEntry,inView: view)

            let pageRange = ((pageNumber - 1) * demandCountForPage)..<(min(pageNumber * demandCountForPage,entries.count))
            let entriesForPage = Array(entries[pageRange])

            addEntries(entriesForPage,toView: pdfPageView)

            pdfPageView.removeFromSuperview()

            return pdfPageView
        }

        return toPDF(views)
    } else {
        return nil
    }
}

ParsedDemandEntry是我的模型对象. view参数是一个容器视图,用于在其中准备pdf视图.这是必要的,因为我使用自动布局来定位pdf视图中的所有标签.没有超级视图布局过程将无法正常工作.

让我们走进去吧.首先,我从模型对象中获取条目.认为这些是需要填充pdf的行.之后我计算了我需要的页数.然后循环开始.在每个循环中,我创建一个tamplate视图. (pdfPageView).然后填入条目. (addEntries(_:toView :)函数调用).

在循环之后,我将所有视图都提供给toPDF函数.它创建表示pdf的NSData.以下是如何将PDF功能看起来像:

private func toPDF(views: [UIView]) -> NSData? {

    if views.isEmpty {
        return nil
    }

    let pdfData = NSMutableData()
    UIGraphicsBeginPDFContextToData(pdfData,CGRect(x: 0,y: 0,width: 612,height: 792),nil)

    let context = UIGraphicsGetCurrentContext()

    for view in views {
        UIGraphicsBeginPDFPage()
        view.layer.renderInContext(context)
    }

    UIGraphicsEndPDFContext()

    return pdfData
}

这很简单.首先,我创建pdf上下文.然后循环遍历视图数组.对于每个视图,它将视图呈现为pdf上下文.

我希望这将有所帮助.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...