2014-11-08 124 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