美文网首页
Swift - 将tableView(表格)页面绘制成PDF

Swift - 将tableView(表格)页面绘制成PDF

作者: 小猪蛋蛋 | 来源:发表于2023-10-16 15:33 被阅读0次

    此方法可以快速的将表格页面绘制成一个PDF文件,仅传入一个tableView即可
    其中 判断文件路径 的方法是自己扩展FileManager写的,可根据自己的需求进行调整或删除
    分享是使用 UIActivityViewController 调用自身的分享方法

    //将tableView页面绘制成PDF
    func pdfDataWithTableView(tableView: UITableView) {
        let hud = view.showWait()
        //记录tableView的bounds
        let originalBounds = tableView.bounds
        //计算tableView的内容的高度,方便后面的PDF分页
        let suitableSize = tableView.sizeThatFits(CGSize(width: originalBounds.size.width, height: tableView.contentSize.height))
        //将tableView的大小调整为适合大小,以便在后续操作中用于生成PDF页面
        tableView.bounds = CGRect(origin: .zero, size: suitableSize)
        //定义了PDF页面的边界框大小,其中宽度与tableView的宽度相同,高度与视图控制器的视图高度相关
        let pdfPageBounds = CGRect(x: 0, y: 0, width: originalBounds.width, height: self.view.frame.height)
        //创建一个NSMutableData对象,用于存储生成的PDF数据
        let pdfData = NSMutableData()
        //开始一个PDF上下文,将绘制的内容保存到pdfData中,并使用定义的页面边界框大小
        UIGraphicsBeginPDFContextToData(pdfData, pdfPageBounds,  nil)
        var pageOriginY: CGFloat = 0
        while pageOriginY < suitableSize.height {
            //创建一个新的PDF页面
            UIGraphicsBeginPDFPageWithInfo(pdfPageBounds, nil)
            //保存当前图形上下文的状态
            UIGraphicsGetCurrentContext()!.saveGState()
            //通过向上移动坐标原点,将内容绘制到正确的位置。
            UIGraphicsGetCurrentContext()!.translateBy(x: 0, y: -pageOriginY)
            //将tableView的内容渲染到PDF上下文中。
            tableView.layer.render(in: UIGraphicsGetCurrentContext()!)
            //恢复之前保存的图形上下文状态。
            UIGraphicsGetCurrentContext()!.restoreGState()
            //更新pageOriginY,以便渲染下一页的内容。
            pageOriginY += pdfPageBounds.size.height
            //更改tableView视图的内容偏移量
            tableView.contentOffset = CGPoint(x: 0, y: pageOriginY)
        }
        //结束PDF上下文,完成PDF文档的生成
        UIGraphicsEndPDFContext()
        //将tableView的边界框大小恢复到原始大小
        tableView.bounds = originalBounds
        
        //判断文件路径是否存在,不存在则创建
        if !FileManager.judgeFileOrFolderExists(filePath: Utils.vinPDFPath) {
            FileManager.createFolder(folderPath: Utils.vinPDFPath)
        }
        let docURL = URL(fileURLWithPath: Utils.vinPDFPath + "\(model.vin).pdf")
        //保存文件到指定的路径,并进行分享操作
        do {
            try pdfData.write(to: docURL, options: .atomic)
            hud.hide(animated: true)
            sharePDF(docURL: docURL)
        } catch {
            PrintLog(message: error.localizedDescription)
            view.showText(title: "PDF生成失败:\(error.localizedDescription)")
        }
    }
    
    //分享
    private func sharePDF(docURL: URL){
        let activityItems = [docURL as Any]
        let activityController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
        activityController.modalPresentationStyle = .fullScreen
        activityController.completionWithItemsHandler = {
            (type, flag, array, error) -> Void in
            if flag == true {
                PrintLog(message: "成功")
            } else {
                PrintLog(message: "失败")
            }
        }
        self.present(activityController, animated: true, completion: nil)
    }
    

    仅供参考!!!
    欢迎改进

    相关文章

      网友评论

          本文标题:Swift - 将tableView(表格)页面绘制成PDF

          本文链接:https://www.haomeiwen.com/subject/ivnxidtx.html