我想从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, 0, self.tableView.contentSize.width, self.tableView.contentSize.height), nil)
UIGraphicsBeginPDFPage();
self.view.layer.renderInContext(UIGraphicsGetCurrentContext())
self.tableView.scrollRectToVisible(CGRectMake(0, 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();
Run Code Online (Sandbox Code Playgroud)
而且:我有一个包含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
}
}
Run Code Online (Sandbox Code Playgroud)
这ParsedDemandEntry是我的模型对象.该view参数是一个容器视图,用于在其中准备pdf视图.这是必要的,因为我使用自动布局来定位pdf视图中的所有标签.没有超级视图布局过程将无法正常工作.
让我们走进去吧.首先,我从模型对象中获取条目.认为这些是需要填充pdf的行.之后我计算了我需要的页数.然后循环开始.在每个循环中,我创建一个tamplate视图.(pdfPageView).然后填入条目.(addEntries(_:toView:)函数调用).
在循环之后,我给所有视图toPDF起作用.它创建NSData代表pdf.这是toPDF函数的样子:
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
}
Run Code Online (Sandbox Code Playgroud)
这很简单.首先,我创建pdf上下文.然后循环遍历views数组.对于每个视图,它将视图呈现为pdf上下文.
我希望这将有所帮助.
| 归档时间: |
|
| 查看次数: |
16632 次 |
| 最近记录: |