最近自己做个小项目,需要把数据绘制成PDF打印出来。
在研究PDF绘制的过程中,发现国内在这方面很难搜到优质有深度的内容,尤其是超长字符串分页绘制,基本没找到解决方案(我使用的原生方法绘制,所以不考虑使用HTML的情况)。无奈去google,在stackover上找到一篇帖子,根据它的思路,终于实现了基础功能。
使用PDFKit,绘制部分基本都是CoreGraphics,多行文字分页绘制使用了CoreText。
具体代码如下:
这是数据模型,主要记录每天早中晚饭,几点,吃的什么。
/// 组数据模型
class HomeSectionModel {
// 日期
var day: String = ""
// 单行数据模型 数组
var rowModels: [HomeRowModel] = []
}
/// 单行数据模型
class HomeRowModel {
// 数据ID
var objectID: String = ""
// 饮食类型
var type: String = ""
// 日期
var date: String = ""
// 食物
var food: String = ""
}
下面为绘制PDF的代码,我是一页PDF左右两列绘制的。
// 需要import的库
import UIKit
import PDFKit
import CoreGraphics
// PrintViewController中关于PDF的方法
/// PDF预览视图
private lazy var pdfView: PDFView = {
let pdfView = PDFView()
return pdfView
}()
/// 生成PDF,预览
/// - Parameters:
/// - models: 数据模型数组
/// - fromDate: 开始日期
/// - toDate: 结束日期
private func createPDFAndShow(models: [HomeSectionModel], fromDate: String, toDate: String) {
// PDF单页宽度
let pageWidth: CGFloat = 8.5 * 72.0
// PDF单页一半的宽度
let halfPageWidth: CGFloat = pageWidth / 2.0
// PDF单页高度
let pageHeight: CGFloat = 11 * 72.0
// PDF Rect
let pageRect = CGRect(x: 0, y: 0, width: pageWidth, height: pageHeight)
// 开始绘制PDF
let renderer = UIGraphicsPDFRenderer(bounds: pageRect)
let data = renderer.pdfData { (context) in
// 开启新的单页
context.beginPage()
// 绘制属性
let dateAttr = [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 17),
NSAttributedString.Key.foregroundColor: UIColor.systemRed]
let typeAttr = [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 15),
NSAttributedString.Key.foregroundColor: greenColor]
// 支持多行
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .natural
paragraphStyle.lineBreakMode = .byWordWrapping
let foodAttr = [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 13),
NSAttributedString.Key.foregroundColor: UIColor.darkGray,