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

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.lryc.cn/news/40990.html

相关文章:

  • 用 ChatGPT 辅助学好机器学习
  • 【动态规划】最长上升子序列(单调队列、贪心优化)
  • 海思SD3403/SS928V100开发(7)mcp2515-SPI转CAN驱动开发
  • 【安卓源码】SurfaceFlinger 启动及其与应用通信
  • springboot车辆充电桩
  • linux进程和进程通信编程(1)
  • 操作系统(1.3)--习题
  • 刷题笔记之十三(有假币、最难的问题、因子个数)
  • 5个代码技巧,加速你的Python
  • 字节跳动软件测试岗,前两面过了,第三面HR天坑!竟然跟我说……
  • [数据分析与可视化] Python绘制数据地图1-GeoPandas入门指北
  • ChatGPT加强版GPT-4面世,打工人的方式将被颠覆
  • Python逆向及相关知识
  • Python基础语法、注意点加实例全解
  • ETH RPC搭建
  • 南京邮电大学数据库第一次课后作业
  • 近期投简历、找日常实习的一些碎碎念(大二---测试岗)
  • ThreadLocal的使用
  • Java ~ Reference【总结】
  • 最快方法求最长上升子序列(LIS)+最长公共子序列(LCS)模板(C/C++)
  • 012+limou+C语言深入知识——(4)“结构体”与“枚举体”与“联合体”
  • Canvas百战成神-圆(1)
  • 详解分库分表设计
  • 动态规划-基础(斐波那契数、爬楼梯、使用最小花费爬楼梯、不同路径、不同路径II、整数拆分、不同的二叉搜索树)
  • 深入理解WebSocket协议
  • Vector的扩容机制
  • 22讲MySQL有哪些“饮鸩止渴”提高性能的方法
  • 10.0自定义SystemUI下拉状态栏和通知栏视图(六)之监听系统通知
  • 怎样在外网登录访问CRM管理系统?
  • Activity工作流(三):Service服务