位置: IT常识 - 正文

Vue页面生成PDF的方法(vue 页面生成pdf)

编辑:rootadmin
Vue页面生成PDF的方法

推荐整理分享Vue页面生成PDF的方法(vue 页面生成pdf),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue模板动态生成pdf,vue页面生成pdf的原理,vue pdf,vue3 pdf,vue 页面生成pdf,vue pdf,vue 展示pdf文件内容,vue页面生成pdf的原理,内容如对您有帮助,希望把文章链接给更多的朋友!

最近项目有个需求,将系统统计的数据生成分析报告,然后可以导出成PDF。

这种方法可以有两种,一种是直接调用打印,用户通过浏览器提供的打印页面手动选择导出PDF。当然这种方式兼容性差,且体验不好,显然不是我们想要的效果。

那么第二种方法的实现思路是什么呢?

首先生成报告页面,也就是常规页面; 然后将页面转换成图片( 用到的组件 html2canvas ); 最后将图片导出成PDF( 用到的组件 jspdf )。

安装依赖npm install --save html2canvas // 页面转图片npm install jspdf --save // 图片转pdf页面转图片

新建一个 index.vue 页面:

<template> <div ref="pdf"> 这是待转换的页面,点击 <button @click="handleExport">导出</button> 按钮,完成导出操作。 </div></template><script>import {downloadPDF} from "@/util/pdf.js" //工具方法,导出操作export default { name: "pdf", data() { return {}; }, methods: { handleExport(){ downloadPDF(this.$refs.pdf) } }};</script>

页面很简单,一段话加上一个导出按钮。整个页面被设置别名 (ref=“pdf”),导出的时候通过别名导出整个页面。

按钮点击事件中调用了一个工具方法 downloadPDF(),来自于工具类 pdf.js:

import html2canvas from "html2canvas";export const downloadPDF = page => { html2canvas(page).then(function(canvas) { page.appendChild(canvas); });};Vue页面生成PDF的方法(vue 页面生成pdf)

也很简单,首先引入了 html2canvas,定义downloadPDF方法,接受一个参数就是要导出的内容,可以使用id获取,也可以使用 ref 。

运行结果:

当我们点击导出按钮后,在现有的页面增加了一行相同的内容。通过元素检查器可以看到增加的这行内容实际是一个 canvas 图像,里面的按钮已经不可以操作了。

这样,页面转换图片的过程就完成了。

图片转PDF

首先给index.vue改造一下,为了让我们导出的pdf好看一点,使用el-table做个表格,其它的导出逻辑不变:

<template> <div ref="pdf"> <el-table :data="tableData" style="width: 700px"> <el-table-column prop="date" label="时间" width="180"> </el-table-column> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column prop="address" label="对我说"> </el-table-column> </el-table> <button @click="handleExport">导出</button> </div></template><script>import {downloadPDF} from "@/util/pdf.js" //工具方法,导出操作export default { name: "pdf", data() { return { tableData: [{ date: '昨天', name: '刘德华', address: '你好帅' }, { date: '今天', name: '郭富城', address: '你最帅' }, { date: '明天', name: '张学友', address: '你贼帅' }, { date: '每天', name: '黎明', address: '我没你帅' }] }; }, methods: { handleExport(){ downloadPDF(this.$refs.pdf) } }};</script>

效果图: 然后改造一下pdf.js,增加上pdf转换逻辑

import html2canvas from "html2canvas";import jsPDF from "jspdf";export const downloadPDF = page => { html2canvas(page).then(function(canvas) { canvas2PDF(canvas); });};const canvas2PDF = canvas => { let contentWidth = canvas.width; let contentHeight = canvas.height; let imgHeight = contentHeight; let imgWidth = contentWidth; // 第一个参数: l:横向 p:纵向 // 第二个参数:测量单位("pt","mm", "cm", "m", "in" or "px") let pdf = new jsPDF("l", "pt"); pdf.addImage( canvas.toDataURL("image/jpeg", 1.0), "JPEG", 0, 0, imgWidth, imgHeight ); pdf.save("导出.pdf");};

canvas2PDF 方法中创建了jsPDF的实例,然后添加上一步生成的图片,最后保存导出pdf文件。

导出的文件效果:

A4打印适配

因为部分需求有需要生成的页面使用A4纸打印,那么pdf生成时的宽高尺寸就不能像上面一样设定。需要按照A4纸的尺寸比例调整(其它打印需求同理,使用对应纸张比例即可)

那么改造一下 pdf.js

import html2canvas from "html2canvas";import jsPDF from "jspdf";export const downloadPDF = page => { html2canvas(page).then(function(canvas) { canvas2PDF(canvas); });};const canvas2PDF = canvas => { let contentWidth = canvas.width; let contentHeight = canvas.height; //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高 let imgWidth = 595.28; let imgHeight = 592.28/contentWidth * contentHeight; // 第一个参数: l:横向 p:纵向 // 第二个参数:测量单位("pt","mm", "cm", "m", "in" or "px") let pdf = new jsPDF("p", "pt"); pdf.addImage( canvas.toDataURL("image/jpeg", 1.0), "JPEG", 0, 0, imgWidth, imgHeight ); pdf.save("导出.pdf");};

这里面将 imgWidth 和 imgHeight 按照A4纸比例调整后,导出的pdf就可以正常比例打印了。

本文链接地址:https://www.jiuchutong.com/zhishi/284160.html 转载请保留说明!

上一篇:路由器登录地址如何查看?查看路由器登陆地址方法(华硕路由器登录地址)

下一篇:十分钟,带你了解 Vue3 的新写法(十分钟带你了解阿氏圆)

  • 出口货物退货需要退税吗
  • 公司买车能一次性抵扣所得税吗
  • 减免增值税申报表
  • 房屋建筑物折旧率计算
  • 资本金可以出借吗
  • 公司投资控股其他公司如何做账务处理
  • 企业收到一笔钱不知道什么钱 如何做账
  • 销售生产用原材料取得的收入计入什么科目
  • 关于销售返利的说法正确的有
  • 劳务费发票和建筑劳务费发票
  • 一般纳税人以清包工方式
  • 房屋贷款基准利率表 历年查询
  • 违约方能否要求返还价款
  • 发放股票股利会增加流通在外股票的数量
  • 小型微利企业所得税率
  • 私车公用的费用可以抵税吗现在
  • 应届生能参考注册公司吗
  • 企业实际缴纳税款额账务怎么看
  • 买房 印花税
  • ElementPlus DateTimePicker日期时间选择器限制可选时间范围(精确时分秒)
  • 增值税多交可以退税吗
  • php实现图片上传的方法
  • 累计折旧在贷方还是借方
  • 基于核心素养下的大单元教学设计
  • YOLOv5网络结构组成
  • vue中的echarts
  • 如何在Android中找到关闭的文件
  • 现金流量表期初现金余额怎么计算
  • 提供加工劳务怎么开票
  • 补交上年所得税怎么调表
  • 哪些行业不用缴纳增值税
  • 工资表社保表格怎么算
  • 农民工工资专用账户
  • 存货跌价准备的账务处理
  • java timestamp localdatetime
  • 帝度官网 说明书
  • 取得发票没有加税怎么办
  • 企业所得税太高怎么合理规避
  • 小规模纳税人转让土地使用权税率
  • 残保金会计分录人员经费
  • 采购人员费用计入什么科目
  • 个体户和公司的税收相差多少
  • 固定成本和变动成本举例
  • 用友t3怎样查明细账
  • 存货发出的计价方式有哪些
  • 公司注销时财务报表要注意什么
  • 为什么当月增加的无形资产当月摊销
  • 现金短缺无法查明计入什么科目
  • 公司既没有收入怎么办
  • 汇算清缴如何调到不退不补
  • 工程施工科目核算内容
  • 年末本年利润没有结转影响报税吗
  • 民营医院的发票在哪里领
  • 新公司利润分配
  • 全资子公司的利与弊
  • 预付款项给供应商合法吗
  • SQL Server中通过reverse取某个最后一次出现的符号后面的内容(字符串反转)
  • mysql中的去重
  • 注册表修改数据
  • windows xp远程控制
  • 电脑xp系统虚拟内存不足怎么解决
  • 电脑safari点击没反应
  • 微软何时推出win10
  • win7断电后无法正常启动
  • win7 64位旗舰版电脑中如何让EditPlus软件在保存文件时不生成bak文件?
  • 5个小技巧让你成长
  • three.js菜鸟教程
  • javascript基础编程
  • perl 获取数据库查询结果
  • cocos2dx游戏开发
  • 全面了解中国历史英文
  • node创建服务
  • Linux CentOS系统下安装node.js与express的方法
  • js实现盒子移动
  • wpf 设置鼠标样式
  • 房产税什么时候开始征收
  • 企业自建厂房在建工程会计账务处理
  • 广西电子税务局电话人工客服电话
  • 银行存款利息收入现金流量表计入哪
  • 保险公司优惠的款项什么时候退款
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设