2014-11-08 23 views
6

Tôi muốn tạo một tệp PDF từ UITableView trong Swift. Ill tìm thấy một số hướng dẫn cho Objective C, và đã thử nó ra nhưng vẫn không có tập tin được tạo ra bởi mã này.Tạo PDF với Swift

 // 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(); 

Và: Tôi có Bảng có 4 phần và Dòng độ cao khác nhau và Mẫu ô. Có cơ hội nào để tạo PDF dễ dàng với loại mã này không? Hoặc nó sẽ là tốt hơn để tạo Row by Row với CoreText?

Xin cảm ơn trước.

Trả lời

7

Đây là cách tiếp cận của tôi. Sử dụng chế độ xem mẫu. Nó có tất cả các văn bản tĩnh và hình ảnh. Và sau đó cho mỗi trang trong pdf sử dụng xem mẫu này. Đây là chức năng tôi sử dụng:

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 là đối tượng mô hình của tôi. Tham số view là chế độ xem vùng chứa để chuẩn bị chế độ xem pdf trong đó. Điều này là cần thiết vì tôi sử dụng bố cục tự động để định vị tất cả các nhãn trong chế độ xem pdf. Nếu không có quy trình bố cục chế độ xem siêu sẽ không hoạt động.

Hãy đi vào chức năng. Đầu tiên tôi nhận được các mục từ đối tượng mô hình. Hãy nghĩ đây là những hàng cần điền vào pdf. Sau đó tôi tính toán bao nhiêu trang tôi cần. Sau đó, vòng lặp bắt đầu. Trong mỗi vòng lặp, tôi tạo ra một cái nhìn tamplate. (pdfPageView). Và sau đó điền nó với các mục. (addEntries(_:toView:) cuộc gọi chức năng).

Sau vòng lặp, tôi cung cấp tất cả các chế độ xem cho hàm toPDF. Nó tạo ra NSData đại diện cho pdf. Dưới đây là cách chức năng toPDF trông giống như:

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 
} 

Điều này khá đơn giản. Đầu tiên tôi tạo ngữ cảnh pdf. Và sau đó lặp qua mảng views. Đối với mỗi khung nhìn Nó hiển thị khung nhìn trong ngữ cảnh pdf.

Tôi hy vọng điều này sẽ hữu ích.

+0

Cảm ơn câu trả lời của bạn. Tôi không chắc làm thế nào tôi có thể sử dụng một "mẫu" Xem? - Tôi có 9 Cell Layouts khác nhau ở đây, vì vậy tôi cần phải tạo một View (cho tất cả các tế bào của tôi?) và cư chúng với dữ liệu của tôi? – derdida

+1

Bạn có thể giải thích chi tiết về những gì xảy ra trong ´createTemplatePageViewWithParsedEntry´? Bạn đưa mô hình vào chế độ xem nào và chế độ xem đó được xử lý như thế nào? – Wiingaard

+0

Nó tạo ra một UIView đại diện cho trang pdf của bạn. @Rapsefar – mustafa