2014-11-08 20 views
6

Chciałbym utworzyć plik PDF z UITableView w Swift. Znalazłem kilka samouczków dla Celu C i wypróbowałem go, ale nadal nie ma pliku wygenerowanego przez ten kod.Generowanie pliku PDF za pomocą 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(); 

I: Mam tabelę z 4 sekcjami i różnymi wysokościami rzędów i szablonami komórek. Czy istnieje szansa, że ​​wygenerowany plik PDF łatwo z tego typu kodu? A może lepiej byłoby utworzyć wiersz po wierszu za pomocą CoreText?

Z góry dziękuję.

Odpowiedz

7

Oto moje podejście. Użyj widoku szablonu. Ma wszystkie statyczne teksty i obrazy. A następnie dla każdej strony w formacie pdf użyj tego widoku szablonu. Oto funkcja, która używam:

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 jest mój model obiektowy. Parametr view jest widokiem kontenera, aby przygotować w nim widok pdf. Jest to konieczne, ponieważ używam automatycznego układu, aby umieścić wszystkie etykiety w widoku pdf. Bez układu widoku super widoku nie będzie działać.

Wejdźmy w funkcję. Najpierw otrzymuję wpisy z obiektu modelu. Sądzę, że są to wiersze, które należy wypełnić w formacie pdf. Potem obliczam, ile potrzebuję stron. Potem zaczyna się pętla. W każdej pętli tworzę widok tamplate. (pdfPageView). A następnie wypełnij go hasłami. (addEntries(_:toView:) wywołanie funkcji).

Po pętli dajemy wszystkie widoki funkcji toPDF. Tworzy on NSData, który reprezentuje pdf. Oto jak wygląda funkcja 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 
} 

Jest to dość proste. Najpierw tworzę kontekst pdf. A następnie przeprowadź pętlę przez macierz views. Dla każdego widoku renderuje widok w kontekście pdf.

Mam nadzieję, że to pomoże.

+0

Dziękuję za odpowiedź. Nie jestem pewien, w jaki sposób mogę użyć widoku "szablonu"? - Mam tutaj 9 różnych układów komórek, więc muszę utworzyć widok (dla wszystkich moich komórek?) i zapełnić je moimi danymi? – derdida

+1

Czy możesz wyjaśnić, co dzieje się w'createTemplatePageViewWithParsedEntry'? W jakim widoku wstawiasz model i jak ten widok jest obsługiwany? – Wiingaard

+0

Tworzy UIView, który reprezentuje twoją stronę pdf. @Rapsefar – mustafa

Powiązane problemy