此方法可以快速的将表格页面绘制成一个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)
}
仅供参考!!!
欢迎改进
网友评论