• jsPDF + html2canvas A4分页截断 完美解决方案(含代码 + 案例)


    业务需求

    网页html生成A4大小分页的pdf,翻遍了整个互联网发现没有很系统的整理与分析,甚至对jsPDF的解析也没有几篇。遇到过几次,用的比较多,完成代码编写后特此整理分析,自我记录。

    业务难点

    1.存在图片/组件/文字被分割的现象,即分页处理
    2.包括页头、页脚、上下安全间隔的情况
    3.富文本分页情况

    处理思路

    通过深度搜索优先遍历,从顶部遍历需要转换的HTML节点, 并将节点分为三种情况进行处理(1. 普通节点。2. 需要进行分页处理并且内部可能包含也需要分页处理子节点的节点。3. 需要进行分页内部不包含需要分页处理的节点,即深度搜索的终点节点),通过从高到低遍历维护一个分页数组pages,该数组记录每一页的起始位置,如:pages[0] 对应 第一页起始位置pages[1] 对应 第二页起始位置

    图解如下:

    通过深度遍历后得出每页起始位置的数组,遍历数组,通过jspdfaddImage接口对canvas进行画面截取,由于addImage只能固定位置的左上角起始点,不能进行非常精确的上下定位截取(下一节会详解addImage),会造成截取多余的内容(如上图页面1pages[1] 下方的内容会和 页面2pages[1] 下方的内容会一样(除长度外),而页面1pages[1] 下方的内容是多余的(是属于页面2的内容))因此需要对页面不需要的内容 使用jspdf的addBlank进行空白遮挡处理

    jsPDF.addImage详解

    官方文档链接addImage - Documentation (artskydj.github.io)

    需要注意的点是坐标(x,y) 的取值, (x,y)对应的是添加图片的左上角取值,宽高则是根据转化成canvas的宽高取值,图解如下

    因此在对一个长图片进行截取时,往往将y值设未负数,让需要截取图片的起始位置落于当前的pdf页面内,在当前案例下,每一页的图片摆放坐标y = -pages[i]

    jsPDF.rect详解

    文档链接 context2d - Documentation (artskydj.github.io)

    该接口的参数 &#x

  • 相关阅读:
    leetcode-240:搜索二维矩阵 II
    Qt学习17 对话框及其类型
    神经网络和深度神经网络,深度神经网络发展历程
    什么蓝牙耳机听歌好?听歌音质好的蓝牙耳机推荐
    "高绩效"指南
    【C++】运算符重载
    二叉树(Java版)
    数据预处理|数据清洗|使用Pandas进行异常值清洗
    信号类型(雷达)——雷达波形认识(一)
    EF Core助力信创国产数据库
  • 原文地址:https://blog.csdn.net/web2022050903/article/details/127069911