vue中html如何转成pdf下载,pdf转base64,忽略某个元素渲染在pdf中,方法封装

news/2024/11/8 11:58:42 标签: vue.js, html, pdf, 前端

一、下载 html2Canvas jspdf

npm install jspdf   html2canvas

二、封装转换下载方法 htmlToPdf.js

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

  /**
   * @param {*} reportName 下载时候的标题
   * @param {*} isDownload  是否下载默认为下载,传false不下载
   */
export default function (dom, reportName = '文件', isDownload = false) {
  if (!dom) {
    return
  }

  // document.getElementById('hideDom').style.display='none'


  //  var target = document.getElementsByClassName("right-aside")[0];
  // target.style.background = "#FFFFFF";
  return new Promise((resolve, reject) => {
    html2Canvas(dom, {
      allowTaint: true,
      dpi: window.devicePixelRatio * 2,
      useCORS: true,
    }).then((canvas) => {
      console.log('canvas: ', canvas);
      let contentWidth = canvas.width
      let contentHeight = canvas.height
      //一页pdf显示html页面生成的canvas高度;
      let pageHeight = contentWidth / 592.28 * 841.89
      //未生成pdfhtml页面高度
      let leftHeight = contentHeight
      //页面偏移
      let position = 0
      //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
      let imgWidth = 595.28
      let imgHeight = 592.28 / contentWidth * contentHeight
      let pageData = canvas.toDataURL('image/jpeg', 1.0)
      let PDF = new JsPDF('', 'pt', 'a4', true)
      //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
      //当内容未超过pdf一页显示的范围,无需分页
      if (leftHeight < pageHeight) {
        PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight, undefined, 'FAST')
      } else {
        while (leftHeight > 0) {
          PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight, undefined, 'FAST')
          leftHeight -= pageHeight
          position -= 841.89
          //避免添加空白页
          if (leftHeight > 0) {
            PDF.addPage()
          }
        }
      }
      if (isDownload) {
        PDF.save(reportName + '.pdf')
      }

      /**
      * output可选参数
      * arraybuffer
      * blob
      * bloburi
      * datauristring
      * datauri
      * dataurlnewwindow
      * pdfobjectnewwindow
      * pdfjsnewwindow
      */
      // const pdfBlob = pdf.output('blob')

      //别的方法:pdf.output("dataurlstring").split("base64,")[1]是base64,
      //实际上pdf.output("dataurlstring")就是base64
      //const dataurl = `data:application/pdf;base64,${PDF.output('dataurlstring').split('base64,')[1]}`
      var pdfData = PDF.output('datauristring')//获取base64Pdf
      resolve(pdfData)
    }
    ).catch(err => {
      console.log('err: ', err);
      reject(err)
    })
  })
}

三、vue页面使用

  <button @click="onGeneratePDF">生成 PDF</button>
  <div : id="htmlToPdfDom">
  		<div>内容内容内容</div>
  		<div>内容内容内容</div>
  		<div :data-html2canvas-ignore="true">我是页面显示的元素,pdf不显示的元素,标签增加一个:data-html2canvas-ignore="true"属性即可</div>
  </div>


//引入封装的js方法
import htmlToPdf  from './htmlToPdf.js'

//按钮点击的方法
onGeneratePDF () {
  this.$nextTick(() => {
      htmlToPdf(document.getElementById('htmlToPdfDom'),'自定义下载pdf的文件名',true).then(res=>{
        console.log('我是pdf转的base64',res)
        console.log('需要传给后端base64可以在此请求接口')
      })

    })
  }

四、html2canvas直通车

html2canvas中文文档链接:https://www.html2canvas.cn/html2canvas-configuration.html在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/5743860.html

相关文章

Flutter PC端UI组件库

一、参考Element-ui的设计和交互&#xff0c;构建基于dart的Flutter UI组件库 https://javonhuang.github.io/sky-ui-page/index.html

麒麟信安支撑2024年电力监控系统网络安全加固培训护航电力网络安全!

在网络安全形势日益复杂的今天&#xff0c;电力行业的网络安全尤为重要。为提升电力监控系统网络安全运维人员的专业技能&#xff0c;由国调中心网安处精心策划&#xff0c;国家电网技术学院组织开展的“2024年电力监控系统网络安全加固培训”于近日圆满结束。麒麟信安作为重要…

从0开始深度学习(25)——多输入多输出通道

之前我们都只研究了一个通道的情况&#xff08;二值图、灰度图&#xff09;&#xff0c;但实际情况中很多是彩色图像&#xff0c;即有标准的RGB三通道图片&#xff0c;本节将更深入地研究具有多输入和多输出通道的卷积核。 1 多输入通道 当输入包含多个通道时&#xff0c;需要…

汽车和飞机研制过程中“骡车”和“铁鸟”

在汽车和飞机的研制过程中&#xff0c;“骡车”和“铁鸟”都扮演着至关重要的角色。 “骡车”在汽车研制中&#xff0c;是一种处于原型车和量产车之间的过渡阶段产物。它通常由不同的零部件组合而成&#xff0c;就像骡子是马和驴的杂交后代一样&#xff0c;取各家之长。“骡车…

oracle-函数-grouping sets(x1,x2,x3...)的妙用

GROUPING SETS 允许你为多个列组合生成分组汇总。它类似于多个 GROUP BY 子句的 UNION ALL 操作&#xff0c;但更加简洁和高效 首先&#xff1a;创建表及接入测试数据 create table students (id number(15,0), area varchar2(10), stu_type varchar2(2), score number(20,2))…

Java[面试题]-真实面试

1.什么是IOC和AOP&#xff1f;了解么&#xff1f; IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09; 1. IOC&#xff08;控制反转&#xff09; 概念 IOC&#xff08;Inversion of Control&#xff09;是面向对象编程中的一个设计原则&#xf…

蓝牙 SPP 协议详解及 Android 实现

文章目录 前言一、 什么是蓝牙 SPP 协议&#xff1f;SPP 的适用场景 二、SPP的工作流程1. 蓝牙设备初始化2. 设备发现与配对3. 建立 SPP 连接4. 数据传输5. 关闭连接 三、进阶应用与常见问题蓝牙连接中断与重试机制数据传输中的延迟与错误处理电池消耗和蓝牙优化 总结 前言 蓝…

OpenMVS OpenMVG 笔记

OpenMVS & OpenMVG 笔记 OpenMVS 和 OpenMVG 都是计算机视觉中用于三维重建的开源库。两者都可以实现从图像集合中计算出相机位姿和三维点云&#xff0c;但它们的重点略有不同。 OpenMVG 主要关注于从输入图像集合中提取稠密的特征匹配&#xff0c;通过这些匹配计算相机的…