在Swift,iOS中将tableView转换为多页PDF的最佳方法之一

时间:2016-09-02 09:09:21

标签: ios swift uitableview pdf

使用此函数获取多个页面pdf tableView的版本,只需将tableView名称传递给此函数: -

func pdfDataWithTableView(tableView: UITableView) {


        let priorBounds = tableView.bounds
        let fittedSize = tableView.sizeThatFits(CGSizeMake(priorBounds.size.width, tableView.contentSize.height))
        tableView.bounds = CGRectMake(0, 0, fittedSize.width, fittedSize.height)
        let pdfPageBounds = CGRectMake(0, 0, tableView.frame.width, self.view.frame.height)
        let pdfData = NSMutableData()
        UIGraphicsBeginPDFContextToData(pdfData, pdfPageBounds,nil)
        var pageOriginY: CGFloat = 0
        while pageOriginY < fittedSize.height {
            UIGraphicsBeginPDFPageWithInfo(pdfPageBounds, nil)
            CGContextSaveGState(UIGraphicsGetCurrentContext())
            CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0, -pageOriginY)
            tableView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
            CGContextRestoreGState(UIGraphicsGetCurrentContext())
            pageOriginY += pdfPageBounds.size.height
        }
        UIGraphicsEndPDFContext()
        tableView.bounds = priorBounds

        var docURL = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)).last! as NSURL
        docURL = docURL.URLByAppendingPathComponent( "myDocument.pdf")
        pdfData.writeToURL(docURL, atomically: true)
    }

2 个答案:

答案 0 :(得分:10)

使用swift 3更新

   func pdfDataWithTableView(tableView: UITableView) {    
        let priorBounds = tableView.bounds
        let fittedSize = tableView.sizeThatFits(CGSize(width:priorBounds.size.width, height:tableView.contentSize.height))
        tableView.bounds = CGRect(x:0, y:0, width:fittedSize.width, height:fittedSize.height)
        let pdfPageBounds = CGRect(x:0, y:0, width:tableView.frame.width, height:self.view.frame.height)    
        let pdfData = NSMutableData()
        UIGraphicsBeginPDFContextToData(pdfData, pdfPageBounds,nil)
        var pageOriginY: CGFloat = 0
        while pageOriginY < fittedSize.height {
            UIGraphicsBeginPDFPageWithInfo(pdfPageBounds, nil)
            UIGraphicsGetCurrentContext()!.saveGState()
            UIGraphicsGetCurrentContext()!.translateBy(x: 0, y: -pageOriginY)
            tableView.layer.render(in: UIGraphicsGetCurrentContext()!)
            UIGraphicsGetCurrentContext()!.restoreGState()
            pageOriginY += pdfPageBounds.size.height
        }
        UIGraphicsEndPDFContext()
        tableView.bounds = priorBounds
        var docURL = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL
        docURL = docURL.appendingPathComponent("myDocument.pdf")
        pdfData.write(to: docURL as URL, atomically: true)
    }

答案 1 :(得分:0)

为了使Raj Joshi解决方案以不同的单元格高度渲染整个表格,您需要在每个渲染周期更改表格视图的内容偏移量。

完整片段:

func pdfDataWithTableView(tableView: UITableView) {    
  let priorBounds = tableView.bounds

  let fittedSize = tableView.sizeThatFits(CGSize(
    width: priorBounds.size.width, 
    height: tableView.contentSize.height
  ))

  tableView.bounds = CGRect(
    x: 0, y: 0,
    width: fittedSize.width,
    height: fittedSize.height
  )

  let pdfPageBounds = CGRect(
    x :0, y: 0,
    width: tableView.frame.width, 
    height: self.view.frame.height
  )    

  let pdfData = NSMutableData()
  UIGraphicsBeginPDFContextToData(pdfData, pdfPageBounds, nil)

  var pageOriginY: CGFloat = 0
  while pageOriginY < fittedSize.height {
    UIGraphicsBeginPDFPageWithInfo(pdfPageBounds, nil)
    UIGraphicsGetCurrentContext()!.saveGState()
    UIGraphicsGetCurrentContext()!.translateBy(x: 0, y: -pageOriginY)
    tableView.layer.render(in: UIGraphicsGetCurrentContext()!)
    UIGraphicsGetCurrentContext()!.restoreGState()
    pageOriginY += pdfPageBounds.size.height
    tableView.contentOffset = CGPoint(x: 0, y: pageOriginY) // move "renderer"
  }
  UIGraphicsEndPDFContext()

  tableView.bounds = priorBounds
  var docURL = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL
  docURL = docURL.appendingPathComponent("myDocument.pdf")
  pdfData.write(to: docURL as URL, atomically: true)
}