2014-11-08 5 views
6

Я хотел бы создать PDF из UITableView в Swift. Я нашел некоторые учебные пособия для Objective C и попробовал это, но файл по-прежнему не создан этим кодом.Создать PDF с помощью 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(); 

И: У меня есть таблица с 4 разделами и разными строками строк и шаблонами ячеек. Есть ли вероятность, что сгенерированный PDF легко с этим типом кода? Или было бы лучше создать Row by Row с CoreText?

Заранее спасибо.

ответ

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:) функция call).

После цикла я даю все виды функции toPDF. Он создает NSData, который представляет собой pdf. Вот как 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

Благодарим вас за ответ. Я не уверен, как я могу использовать «шаблон» View? - У меня есть 9 различных компоновки ячеек здесь, поэтому мне нужно создать View (для всех моих ячеек?) и заполнить их моими данными? – derdida

+1

Можете ли вы рассказать о том, что происходит в'createTemplatePageViewWithParsedEntry '? Какой вид вы вставляете в модель и как обрабатывается этот вид? – Wiingaard

+0

Создает UIView, представляющий вашу страницу в формате pdf. @Rapsefar – mustafa

Смежные вопросы