用Swift生成PDF
我想在Swift中从UITableView创buildPDF。 我find了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();
而且:我有一个有4个部分和不同的行高和单元格模板的表格。 有这种types的代码轻松生成PDF的机会吗? 或者用CoreText创buildRow by Row会更好吗?
提前致谢。
这是我的方法。 使用模板视图。 它具有所有的静态文本和图像。 然后在pdf中的每一页使用这个模板视图。 这是我使用的function:
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视图。 没有超级视图布局的过程将无法正常工作。
让我们走进function。 首先我从模型对象中获取条目。 认为这些是需要在pdf中填充的行。 之后,我计算我需要多less页。 然后循环开始。 在每个循环中,我创build一个模板视图。 ( pdfPageView
)。 然后填写条目。 ( addEntries(_:toView:)
函数调用)。
循环之后,我将所有的观点toPDF
function。 它创build代表pdf的NSData
。 以下是toPDF
function的样子:
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 }
这很简单。 首先我创buildpdf上下文。 然后通过views
数组循环。 对于每个视图它呈现视图到pdf上下文。
我希望这将有所帮助。