2014-11-08 4 views
6

के साथ पीडीएफ जेनरेट करें मैं स्विफ्ट में UITableView से पीडीएफ बनाना चाहता हूं। मुझे उद्देश्य सी के लिए कुछ ट्यूटोरियल मिले, और इसे आजमाया लेकिन अभी भी इस कोड द्वारा उत्पन्न कोई फ़ाइल नहीं है।स्विफ्ट

 // 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 अनुभागों और विभिन्न पंक्ति ऊंचाइयों और सेल टेम्पलेट्स वाली एक तालिका है। क्या इस तरह के कोड के साथ जेनरेट पीडीएफ आसानी से एक संभावना है? या CoreText के साथ पंक्ति द्वारा पंक्ति बनाने के लिए बेहतर होगा?

अग्रिम धन्यवाद।

उत्तर

7

मेरा दृष्टिकोण यहां है। एक टेम्पलेट दृश्य का प्रयोग करें। इसमें सभी स्थिर ग्रंथ और छवियां हैं। और फिर पीडीएफ में प्रत्येक पृष्ठ के लिए इस टेम्पलेट व्यू का उपयोग करें।

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 पैरामीटर इसमें पीडीएफ व्यू तैयार करने के लिए एक कंटेनर दृश्य है। यह आवश्यक है क्योंकि मैं पीडीएफ दृश्य में सभी लेबलों को स्थिति देने के लिए ऑटो लेआउट का उपयोग करता हूं। एक सुपर व्यू लेआउट प्रक्रिया के बिना काम नहीं करेगा।

चलो फ़ंक्शन में चलते हैं। सबसे पहले मुझे मॉडल ऑब्जेक्ट से प्रविष्टियां मिलती हैं। सोचें कि ये पंक्तियां हैं जिन्हें पीडीएफ में पॉप्युलेट करने की आवश्यकता है। उसके बाद मैं गणना करता हूं कि मुझे कितने पेज चाहिए। फिर लूप शुरू होता है। प्रत्येक पाश में मैं एक टैम्पलेट दृश्य बनाते हैं। (pdfPageView)। और फिर इसे प्रविष्टियों से भरें। (addEntries(_:toView:) फ़ंक्शन कॉल)।

लूप के बाद मैं toPDF फ़ंक्शन पर सभी विचार देता हूं। यह 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 
} 

यह काफी सरल है। सबसे पहले मैं पीडीएफ संदर्भ बनाते हैं। और फिर views सरणी के माध्यम से लूप। प्रत्येक दृश्य के लिए यह पीडीएफ संदर्भ में प्रस्तुत करता है।

मुझे आशा है कि इससे मदद मिलेगी।

+0

आपके उत्तर के लिए धन्यवाद। मुझे यकीन नहीं है कि मैं "टेम्पलेट" दृश्य का उपयोग कैसे कर सकता हूं? - मेरे पास 9 अलग-अलग सेल लेआउट हैं, इसलिए मुझे एक दृश्य (मेरी सभी कोशिकाओं के लिए?) बनाने की आवश्यकता है और उन्हें मेरे डेटा के साथ पॉप्युलेट करना है? – derdida

+1

क्या आप'createTemplatePageViewWithParsedEntry 'में क्या होता है, इस पर विस्तृत जानकारी दे सकते हैं? आप मॉडल को किस दृश्य में डालते हैं, और यह दृश्य कैसे संभाला जाता है? – Wiingaard

+0

यह एक UIView बनाता है जो आपके पीडीएफ पेज का प्रतिनिधित्व करता है। @Rapsefar – mustafa