vue2+html2pdf下载PDF,PDF分页切割

问题:

PDF下载下来后,文档内容被暴力分割。

解决方案:

HTML

html 复制代码
<!-- 打印按钮 -->
<el-button type="primary" size="small" class="el-icon-download right_btn" @click="downloadPDF">PDF</el-button>

<!-- 需要打印的dom,给最外层父元素设置ID -->
<div id="print">
	<!-- dom结构 -->
	<div class="paper-row"></div>
	... ...
</div>

JS

javascript 复制代码
methods: {
    downloadPDF() {//下载函数
      try {
        let vm = this;
        // A4宽高比例
        const A4_WIDTH = 592.28;
        const A4_HEIGHT = 841.89;
        
        vm.$nextTick(() => {
          let target = document.getElementById("print"); // 根据ID取到要打印的dom区域
          let pageHeight = target.scrollWidth * A4_HEIGHT / A4_WIDTH;//根据比例计算需要打印的文件的总高度
          // 获取每一行class类名为paper-row的dom集合
          let lableListID = document.getElementsByClassName("paper-row");
          let addMarginIndexs = [];//被添加了下边距的索引集合
          
          // 遍历每一行dom,计算它是否超出所在A4页,计算合适的分割点。
          for (let i = 0; i < lableListID.length; i++) {
          	//当前遍历的元素处于第几页A4纸,返回页码
            let multiple = Math.ceil((lableListID[i].offsetTop + lableListID[i].offsetHeight) / pageHeight);
            //当前元素是否超出当前页A4纸,true or false.
            let isOver = this.isSplit(lableListID, i, multiple * pageHeight);
            if (isOver) {//当dom内容超出a4的高度
            	// 当前页底部空白占位的高度 = 页码 * 每一页的高度 - (当前元素到顶部的距离 + 当前元素的高度)
              	let _H = multiple * pageHeight - (lableListID[i].offsetTop + lableListID[i].offsetHeight) + 230;// 230px是我计算的值与实际页面的偏差,因人而异,不一定非要加上。
              	// 给超出的dom添加margin-bottom,用空白占满当前页,把下一行元素顶到下一页。
              	lableListID[i].style['margin-bottom'] = _H + "px";
              	addMarginIndexs.push(i);//添加了margin-bottom的元素,保存其索引,用于下载完成后清空margin
            }
          }
          this.html2pdf(document.getElementById("print"), `试卷详情`);//开始下载文件

          //文件下载完成后,移除margin-bottom,否则原来的页面会有空白。
          addMarginIndexs.forEach(index => {
            lableListID[index].style['margin-bottom'] = '0px'
          })
          addMarginIndexs = []
        });
      } catch (error) {
        console.log(error);
      }
    },
    isSplit(nodes, index, pageHeight) {
      // 计算当前dom是否跨越了a4大小
      let nodesH = nodes[index].offsetTop + nodes[index].offsetHeight;
      // 判断条件:当前dom未超出A4,但是下一行dom超出了
      if (
        nodesH < pageHeight &&
        nodes[index + 1] &&
        nodes[index + 1].offsetTop + nodes[index + 1].offsetHeight > pageHeight
      ) {
        return true;
      }
      return false;
    },
}
相关推荐
环境栈笔记10 分钟前
指纹浏览器 WebRTC 怎么设置?从 ICE 候选、代理出口到功能验证
前端·人工智能·后端·自动化
赵大仁35 分钟前
官网性能优化实战:LCP 3.2s → 2.1s、CLS 0.107 → 0,以及被我推翻的 6 个判断
前端·性能优化·cls·lcp·core web vitals
xiancai_xianyu38 分钟前
Text2SQL落地生产库前,SQL要过哪三道闸
前端·数据库·sql·sql注入·text2sql·ai agent开发·企业级ai框架
小羊没烦恼!1 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
史瓦辛格1 小时前
给 DeepSeek Harness 写费用插件:把「这次会话花了多少钱」算准
前端·deepseek
星光不问赶路人1 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js
鸥梨菌Honevid1 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet
IT_陈寒1 小时前
Python多进程共享变量这个坑,差点让我加班到凌晨
前端·人工智能·后端
鸿蒙开发1 小时前
PDF 盖黑框不等于脱敏:用 PDF.js + Canvas + pdf-lib 实现永久遮盖
前端·react.js
xixingzhe21 小时前
Nginx 看懂请求耗时瓶颈
服务器·前端·nginx