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

2023-10-16  本文已影响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)
}

仅供参考!!!
欢迎改进

上一篇下一篇

猜你喜欢

热点阅读