2014-11-08 91 views
6

我想从Swift中的UITableView创建一个PDF。我找到了Objective C的一些教程,并试用了它,但是仍然没有这个代码生成的文件。使用Swift生成PDF

 // 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个部分和不同的行高和单元模板的表格。使用这种类型的代码能否轻松生成PDF?或者用CoreText创建Row by Row会更好吗?

在此先感谢。

回答

7

这是我的方法。使用模板视图。它具有所有的静态文本和图像。然后在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填充的行。之后,我计算了我需要的页数。然后循环开始。在每个循环中,我创建一个模板视图。 (pdfPageView)。然后填写条目。 (addEntries(_:toView:)函数调用)。

循环后我给所有意见toPDF函数。它创建代表pdf的NSData。以下是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 
} 

这很简单。首先我创建pdf上下文。然后通过views数组循环。对于每个视图它将视图呈现为pdf上下文。

我希望这会有所帮助。

+0

谢谢你的回答。我不知道如何使用“模板”视图? - 我在这里有9个不同的单元格布局,所以我需要创建一个视图(对于我所有的单元格?)并将它们填充到我的数据中? – derdida 2014-11-08 15:47:35

+1

您能否详细说明'createTemplatePageViewWithParsedEntry'中会发生什么?你将什么观点插入模型,以及该观点如何处理? – Wiingaard 2016-11-06 22:31:16

+0

它创建一个代表您的PDF页面的UIView。 @Rapsefar – mustafa 2016-11-07 07:06:42