【项目问题】前端如何实现打印和导出的功能?

一、前言

打印需要用到的工具是 print-js
导出需要用到的工具是 jspdf

二、准备工作

第一步:引入print-js 和 jspdf

npm i print-js
npm i jspdf

第二步:创建一个打印页面的组件
ng 是 angular/cli 脚手架快捷命令

ng g c pages/print

第三步:设计页面

<div id="print">
    <p>print content</p>
</div>
<br>
<button (click)="print()">打印</button>
<button (click)="export()">导出</button>

在这里插入图片描述

三、打印步骤

1:创建css文件,设计最终打印的样式
assets/style/print.css

#print{
    display: flex;
    align-items: flex-start;
    justify-content: flex-end;
    padding: 20px;
    height: 200px;
    border: 1px black dotted;
}

2:引入print-js,实现打印

import * as printJS from 'print-js';
print(){
    printJS({
      printable: document.getElementById("print"), //打印的节点
      type: "html", //打印类型,html,json,image
      css: '/assets/style/print.css', //打印css
      scanStyles: true //是否获取html的样式
    })
  }

效果:
在这里插入图片描述

四、导出步骤

1:引入html2Canvas 和 JsPDF

import html2Canvas from 'html2canvas';
import JsPDF from 'jspdf';

2:实现导出

export() {
    var printDom = document.getElementById('print');//获取打印的节点
    let opts: any = {
      useCORS: true, // 表示允许跨越的图片;allowTaint: true和useCORS: true选择一个
      // windowHeight: modal.scrollHeight + 24 + 100,//获取y方向页面包含滚动条的高度,24和100为padding,margin
      // width: dom.offsetWidth + 48,//48为padding值
      // height: dom.clientHeight + 400,//可见高度+padding+margin
      // y: window.pageYOffset + 100,//滚动条高度修复
      // scrollX: 17,
      scale: 1
    };
    //html2Canvas的作用是根据dom生成屏幕截图
    html2Canvas(printDom, opts).then(canvas => {
      let contentWidth = canvas.width;
      let contentHeight = canvas.height;
      let pageHeight = contentWidth / 592.28 * 841.89;
      let leftHeight = contentHeight;
      let position = 0;
      let imgWidth = 595.28;
      let imgHeight = 592.28 / contentWidth * contentHeight;
      let pageData = canvas.toDataURL('image/jpeg', 1.0);
      // landscape表示横向,portrait表示纵向
      let PDF = new JsPDF('portrait', 'pt', 'a4');//纵向
      if (leftHeight < pageHeight) {
        PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight);
      } else {
        while (leftHeight > 0) {
          PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight);
          leftHeight -= pageHeight;
          position -= 841.89;
          if (leftHeight > 0) {
            PDF.addPage();
          }
        }
      }
      PDF.save(`导出内容.pdf`);
    })
  }

效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Dai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值