通过控制css样式,实现打印自动分页

问题:有多个病历,无法控制打印机纸张大小,每个病历是否需要分页,分多少页都不确定,计算高度实现手动分页
简单讲解一下思路:
通过class属性区分:testAll病历,testways病历中可能需要分页的块级元素,page_break分页元素;获取每个病历(testAll)中的testways元素,遍历通过当前病历(testAll)中的最后一个page_break元素(没有page_break元素则获取当前病历(testAll)距顶部高度)计算当前元素是否需要添加分页样式
注意:page-break-after在样式为display: block;下才会生效

<div id="copyDom">测试</div>
<div v-for="i in 3" class="testAll">
      {{ i }}
      <div v-for="i in 5" class="testways" style="height:50px">测试{{i}}</div>
      <div v-for="i in 5" class="testways" style="height:50px">测试{{i}}</div>
      <div v-for="i in 5" class="testways" style="height:50px">测试{{i}}</div>
      <div v-for="i in 5" class="testways" style="height:50px">测试{{i}}</div>
    </div>
.testAll{
	page-break-after: always;
}
.testways{
    break-inside: avoid;
  }
//引入js
 <script src="../print.js"></script>
 //在合适位置调用
printFun(this.send,data,148,'copyDom')
//func回调方法;data回调方法参数;height页面高度,copyDomId每页重复的表头元素id
printFun(func, data, height, copyDomId) {
        // 获取所有class为testAll的div元素(打印多个病历,一个病历div的class为testAll,用于计算分页长度)
        const pages = document.querySelectorAll('.testAll');

        // 遍历每个page元素(多个病历遍历)
        pages.forEach((page) => {
          // 获取该page元素中class为ways的div元素(获取当前病历中存在的分页元素)
          const waysDivs = page.querySelectorAll('.testways');
          const h = Math.floor(this.px2mm(height?height:208));
          console.log(h, '毫米转px');
          // 遍历每个testways元素
          waysDivs.forEach((waysDiv, i) => {
            const wayDivBreak = page.querySelectorAll('.page_break');
            let distance = 0
            console.log(wayDivBreak.length, '分页', i);
            // 计算waysDiv距离page顶部的垂直距离(当前病历距离顶部高度)
            if (wayDivBreak.length > 0) {
              distance = waysDiv.getClientRects()[0].top + waysDiv.offsetHeight - (wayDivBreak[[wayDivBreak.length - 1]].getClientRects()[0].top + wayDivBreak[[wayDivBreak.length - 1]].offsetHeight);
           // console.log('距离:',distance, '第几个', i, '自身距离顶部高度', waysDiv.offsetTop, '上一分页距顶部', wayDivBreak[[wayDivBreak.length - 1]].getClientRects()[0].top,'自身高度',wayDivBreak[[wayDivBreak.length - 1]].offsetHeight);
            } else {
              distance = waysDiv.getClientRects()[0].top + waysDiv.offsetHeight - page.getClientRects()[0].top;
            //console.log('距离',distance, '第几个', i, '————', waysDiv.getClientRects()[0].top, 'waysDiv距离page顶部的', page.getClientRects()[0].top);
            }
            // 判断距离是否超过208mm
            if (distance > h) {
              // 添加page-break-after: always样式
              waysDivs[i - 1].classList.add('page_break');
              waysDivs[i - 1].style.pageBreakAfter = 'always';
              //console.log(waysDivs[i - 1], '添加分页', waysDiv);
              if (copyDomId) {
		          //需要插入表头
		          let elementCopy = document.getElementById(copyDomId);
		          let clonesElement = elementCopy.cloneNode(true);
		          waysDivs[i].parentNode.insertBefore(clonesElement, waysDivs[i]);
		       }
            }
          });
        });
        setTimeout(() => {
        //回调方法
          func(data);
        }, 200);
      },
      px2mm(mm) {
        // 创建一个1mm宽的元素插入到页面
        let div = document.createElement("div");
        div.id = "mm";
        div.style.width = "1mm";
        document.querySelector("body").appendChild(div);
        // 原生方法获取浏览器对元素的计算值
        let mm1 = document.getElementById("mm").getBoundingClientRect();
        console.log(mm1, '一厘米宽度');
        document.querySelector("body").removeChild(div)
        return mm * mm1.width;
      },

        }
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值