Создать PDF из tableView, включая закадровую часть - PullRequest
0 голосов
/ 16 июня 2020
extension UITableView {

   public func generateToPDF() -> Data? {
        let priorBounds = self.bounds
        let fittedSize = self.sizeThatFits(CGSize(width:priorBounds.size.width, height: self.contentSize.height))
        self.bounds = CGRect(x:0, y: 0, width:fittedSize.width, height:fittedSize.height)
        let pdfPageBounds = CGRect(x:0, y: 0, width: self.frame.width, height:self.frame.height)

        let pdfData = NSMutableData()
        var pageOriginY: CGFloat = 0
        UIGraphicsBeginPDFContextToData(pdfData, pdfPageBounds, nil)
        while pageOriginY < fittedSize.height {
            UIGraphicsBeginPDFPageWithInfo(pdfPageBounds, nil)
            UIGraphicsGetCurrentContext()!.saveGState()
            UIGraphicsGetCurrentContext()!.translateBy(x: 0, y: -pageOriginY)
            self.layer.render(in: UIGraphicsGetCurrentContext()!)
            UIGraphicsGetCurrentContext()!.restoreGState()
            pageOriginY += pdfPageBounds.size.height
        }
        UIGraphicsEndPDFContext()
        self.bounds = priorBounds
        return pdfData.copy() as? Data
    }
}

1 Ответ

0 голосов
/ 18 июня 2020

Наконец, я разобрался сам, надеюсь, это поможет тому, кто его ищет.

  1. Визуализируйте весь контент tableview как UIImage и поместите его в UIImageView

    func getPdf() -> Data? {
            UIGraphicsBeginImageContextWithOptions(self.contentSize, false, 0)
            self.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: false)
            self.layer.render(in: UIGraphicsGetCurrentContext()!)
    
            let interationCount: Int = Int(ceil(self.contentSize.height / self.bounds.size.height))
            for i in 0..<interationCount {
                self.setContentOffset(CGPoint(x: 0, y: Int(self.bounds.size.height) * i), animated: false)
                self.layer.render(in: UIGraphicsGetCurrentContext()!)
            }
    
            let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
            let pdfImg: UIImageView = UIImageView(image: image)
            UIGraphicsEndImageContext()
    
            return self.createPDFFromUIView(pdfImg: pdfImg)
    
    }
    
  2. Конвертировать UIImageView (который содержит изображение pdf) в pdf

    private func createPDFFromUIView(pdfImg: UIView) -> Data? {
        let pdfData = NSMutableData()
        UIGraphicsBeginPDFContextToData(pdfData, pdfImg.bounds, nil)
        UIGraphicsBeginPDFPage()
        pdfImg.layer.render(in: UIGraphicsGetCurrentContext()!)
        UIGraphicsEndPDFContext()
    
        return pdfData.copy() as? Data
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...