当前位置: 首页 > article >正文

vue2前端实现html导出pdf功能

1. 功能实现方案

1.html转换成canvas后生成图片导出pdf(本文选用)

  • html转canvas插件:html2canvas是一款将HTML代码转换成Canvas的插件;
  • canvas生成pdf:jsPDF是一个使用Javascript语言生成PDF的开源库

2.HTML代码转出pdf

wkhtmltopdf是一款将HTML代码转换成pdf的插件,表格场景使用居多

2.技术实现(基于html2canvas和jsPDF实现)

1.安装插件

npm install html2canvas
npm install jspdf

2.封装函数

这里函数参考了网上多种,最后自己选择了这种并发并修改了部分内容,实现可以传入两个参数来指定要导出为pdf的文件

src/utils/topdf.js

import html2Canvas from "html2canvas";
import JsPDF from "jspdf";

export default {
  install(Vue, options) {
    console.log(options);
    // vue原型上挂载getPdf方法实现转换功能
    // 参数:(dom元素,导出文件的文件名)
    Vue.prototype.getPdf = function (dom, title) {
      html2Canvas(document.querySelector(dom), {
        allowTaint: true,
      }).then(function (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);
        let PDF = new JsPDF("", "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(title + ".pdf");
      });
    };
  },
};

3.全局注册

在main.js中导入并注册

//全局注册 打印pdf:
import htmlToPdf from "./utils/topdf";
Vue.use(htmlToPdf);

4.使用

解释:1.为需要打印的dom元素添加类名或者id名以方便获取dom

​ 2.给打印按钮添加点击事件

​ 2.1 点击事件触发全局挂载的getPdf方法

​ 2.2 参数为 (dom元素,导出pdf的文件名)

<button @click="getPdf('.pdf', 'file2')">导出pdf</button>
    <div class="pdf">
      <p v-for="(item, index) in 50" :key="index">
        {{ item }}123123121322313212313132123
      </p>
	</div>

5. 问题

会出现衔接问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hsxiY8Ie-1677647378317)(C:\Users\28132\AppData\Roaming\Typora\typora-user-images\1677646897722.png)]

防止截断可以参考这个博客https://www.cnblogs.com/jimyking/p/17101947.html

等有时间再自己总结


http://www.kler.cn/a/1457.html

相关文章:

  • 灾难性遗忘(catastrophic forgetting)学习笔记
  • Linux中的标准IO【上】
  • FPGA纯verilog实现RIFFA的PCIE通信,提供工程源码和软件驱动
  • C++ 手撸简易服务器(完善版本)
  • 写CSDN博客两年半的收获--总结篇
  • Python3实现AI版贪吃蛇
  • AI_Papers周刊:第六期
  • Java面向对象:接口的学习
  • Vue学习 -- 如何用Axios发送请求(get post)Promise对象 跨域请求问题
  • 使用QT C++编写一个带有菜单和工具条的文本编辑器
  • QT串口助手开发3串口开发
  • C语言实例:字符转换为 ASCII 码,如何计算两个数的商,如何比较两个数的大小,如何交换两个数的值
  • VR全景城市,用720全景树立城市形象,打造3D可视化智慧城市
  • java-day01
  • 《Linux的权限》
  • 考研408每周一题(2019 41)
  • 嵌入式学习笔记——STM32的时钟树
  • 基于 Apache Flink 的实时计算数据流业务引擎在京东零售的实践和落地
  • 软件测试面试找工作你必须知道的面试技巧(帮助超过100人成功通过面试)
  • 【React】React入门--生命周期