html2canvas+jsPDF实现前端导出pdf

html2canvas+jsPDF实现前端导出pdf

  1. 安装插件包
npm install jspdf
npm install html2canvas
  1. 引入插件
import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';
  1. 生成pdf
        const perCanvas = document.createElement('canvas');
        perCanvas.style.backgroundColor = '#fff'
        const context = perCanvas.getContext('2d');
        html2canvas(this.$refs.pdfContent, {
          scale: 4, //放大防止模糊
          dpi: 300 // 处理模糊问题
        }).then((canvas) => {
          const canvasData = canvas.toDataURL('image/jpeg', 1.0);
          // pdf的尺寸
          const pdfWidth = canvas.width;
          const pdfHeight = pdfWidth * 1.414;
          //切割后的canvas图片的宽高,就等于每页pdf的宽高
          perCanvas.width = canvas.width;
          perCanvas.height = pdfHeight;
          // 每张图片的高度:适当减少100,上下各留50页边距
          const perHeight = pdfHeight - 100;

          // 计算切割次数
          let splitCount = Math.ceil(canvas.height / perHeight);
          if (splitCount * perHeight < canvas.height) splitCount++;

          //创建img对象,加载完整的canvas图片
          const img = new Image();
          img.src = canvasData;

          //创建pdf对象

          //待图片加载完成
          setTimeout(() => {
            let pdf = new jsPDF('p', 'pt', [pdfWidth, pdfHeight]);
            //切割canvas图片,贴到每一页pdf中
            for (let i = 0; i < splitCount; i++) {
              const startY = i * perHeight; // 起始y坐标
              // 清空画布
              context.clearRect(0, 0, perCanvas.width, pdfHeight);
              context.fillStyle = '#fff';
              context.fillRect(0, 0, perCanvas.width, pdfHeight);
              // 绘制当前切割区域的图片
              context.drawImage(img, 0, startY, perCanvas.width, perHeight, 0, 0, perCanvas.width, perHeight);
              const perCanvasData = perCanvas.toDataURL('image/jpeg', 1.0);
              pdf.addImage(perCanvasData, 'JPEG', 0, 50, perCanvas.width, perCanvas.height, '', 0);
              if (i < splitCount - 1) pdf.addPage();
            };

            let pdfBlob = pdf.output('blob');
            // pdf.save("content.pdf"); 执行此api会直接下载
            this.showpdf = false
            let signBlob = new FormData() //把文件上传到后台
            signBlob.append('file', pdfBlob, ".pdf")
            //此处将signBlob上传即可
          }, 0)

相关推荐

  1. html2canvas+jsPDF实现前端导出pdf

    2024-03-10 14:02:04       23 阅读
  2. html2canvas+jspdf实现前端导出pdf时,4k屏浏览器卡死

    2024-03-10 14:02:04       15 阅读
  3. html2canvas+jsPDF导出超长网页的PDF

    2024-03-10 14:02:04       40 阅读
  4. jsPDF+html2canvas实现htmlpdf下载+打印

    2024-03-10 14:02:04       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 14:02:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 14:02:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 14:02:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 14:02:04       20 阅读

热门阅读

  1. python使用pdfkit把html文本转换成pdf非常慢

    2024-03-10 14:02:04       21 阅读
  2. urllib.error.HTTPError: HTTP Error 400: Bad Request

    2024-03-10 14:02:04       20 阅读
  3. 【DevOps实战篇】原生Docker集群项目向Kubernetes移行

    2024-03-10 14:02:04       17 阅读
  4. 事务(transaction)

    2024-03-10 14:02:04       25 阅读
  5. 清除Mac OS上Xcode占用的空间

    2024-03-10 14:02:04       20 阅读
  6. uniapp路由跳转的方式

    2024-03-10 14:02:04       24 阅读