iOS Swift 绘制PDF,超长字符串分页绘制

最近自己做个小项目,需要把数据绘制成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,
  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值