vue前端html导出pdf

package.json中添加依赖
在这里插入图片描述
调用方:

import htmlToPdf from '../../../utils/file/htmlToPdf.js'// 下载方法,pdfDownloadDpi为onClickDownLoad() {htmlToPdf.getPdf('标题1', 'jsfgyzcpgxmShow', this.pdfDownloadDpi)}

htmlToPdf.js

// 页面导出为pdf格式
import html2Canvas from 'html2canvas'
import jsPDF from 'jspdf'const htmlToPdf = {getPdf(title, url, dpi, fn) {var divId = ''if (url === 'gyzcpgxmShow') {divId = '#pdfDom'}if (url === 'jsfgyzcpgxmShow') {divId = '#pdfDom2'}if (url === 'stockRelation') {divId = '#stockRelationBody'}html2Canvas(document.querySelector(divId), {allowTaint: false,taintTest: false,logging: false,useCORS: true,dpi: window.devicePixelRatio * dpi, // 将分辨率提高到特定的DPI 提高四倍 【1: 0.4M左右, 2: 1000K 左右, 3: 2.1M , 4:3M 左右】scale: dpi // 按比例增加分辨率}).then(canvas => {// eslint-disable-next-line new-capvar pdf = new jsPDF('l', 'mm', 'a3') // A3纸,横向// var pdf = new jsPDF('p', 'mm', 'a4') // A4纸,纵向var ctx = canvas.getContext('2d')// var a4w = 190; var a4h = 277 // A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277// var a4w = 259; var a4h = 400var a4w = 286; var a4h = 420 // A3大小,279mm x 420mm,四边各保留10mm的边距,显示区域259x400// var imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度[这个计算方式应该是纵向]var imgHeight = Math.floor(a4w * canvas.width / a4h) // 按A4显示比例换算一页图像的像素高度[这个是横向打印的计算方法]var renderedHeight = 0while (renderedHeight < canvas.height) {var page = document.createElement('canvas')page.width = canvas.widthpage.height = Math.min(imgHeight, canvas.height - renderedHeight)// 可能内容不足一页// 用getImageData剪裁指定区域,并画到前面创建的canvas对象中page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0)// pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width)) // 添加图像到页面,保留10mm边距 [a4使用]pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w * 1.414, Math.min(a4h, a4w * page.height / page.width) * 1.414) // 添加图像到页面,保留10mm边距[a3使用1.414换算比例]renderedHeight += imgHeightif (renderedHeight < canvas.height) {pdf.addPage()// 如果后面还有内容,添加一个空页}// delete page;}// 保存文件pdf.save(title + '.pdf')}).catch(res => { console.log(res) }).finally(() => {if (fn) {fn()}})}
}export default htmlToPdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漏洞01-目录遍历漏洞/敏感信息泄露/URL重定向

目录遍历漏洞/敏感信息泄露/URL重定向 文章目录 目录遍历敏感信息泄露URL重定向 目录遍历 敏感信息泄露 于后台人员的疏忽或者不当的设计&#xff0c;导致不应该被前端用户看到的数据被轻易的访问到。 比如&#xff1a; ---通过访问url下的目录&#xff0c;可以直接列出目录下…

秋招面试—JS篇

2024 JavaScript面试题 1.new 操作符的工作原理 ①.创建一个新的空对象 ②.将这个对象的原型设置为函数的 prototype 对象 ③.让函数的this指向该对象&#xff0c;为函数添加属性和方法 ④.最后返回这个对象 2.什么是DOM&#xff0c;什么是BOM? DOM&#xff1a;文档对象…

代码随想录算法训练营第二十二天|235 二叉搜索树的最近公共祖先、701 二叉搜索树中的插入操作、450 删除二叉搜索树中的节点

235 二叉搜索树的最近公共祖先 题目链接&#xff1a;二叉搜索树的最近公共祖先 思路 因为二叉搜索树是有序的&#xff0c;因此p和q的最近公共祖先一定在两者之间&#xff0c;所以每到一个节点&#xff0c;该节点的数值如果大于p和q&#xff0c;则朝左子树走&#xff1b;如果…

C/C++ - 函数模板

目录 函数模板基础 函数模板定义 函数模板实例 函数模板调用 函数模板本质 模板函数特化 模板参数限定 默认模板参数 多个模板参数 非类型模板参数 函数模板拓展 模板参数匹配规则 函数模板基础 函数模板定义 使用 template <typename T>​​​​​ 或 templ…

ElementUI Form:Input 输入框

ElementUI安装与使用指南 Input 输入框 点击下载learnelementuispringboot项目源码 效果图 el-input.vue &#xff08;Input 输入框&#xff09;页面效果图 项目里el-input.vue代码 <script> export default {name: el_input,data() {return {input: ,input1: ,i…

SOME/IP SD 协议介绍(五)使用SOME/IP-SD宣布非SOME/IP协议的协议。

使用SOME/IP-SD宣布非SOME/IP协议的协议。 除了SOME/IP之外&#xff0c;车辆内部还使用其他通信协议&#xff0c;例如用于网络管理、诊断或闪存更新。这些通信协议可能需要传递服务实例或具有事件组。 对于非SOME/IP协议&#xff0c;应使用特殊的服务ID&#xff0c;并使用配置…

养猫家庭必备宠物空气净化器吗?性价比猫用空气净化器牌子推荐

家里的可爱猫咪们带来了很多快乐&#xff0c;但是它们的毛发却无处不在&#xff0c;飞舞在整个房间里。而且如果猫砂盆不及时清理&#xff0c;整个屋子都会弥漫着难闻的气味。每天都要清理工作&#xff0c;但是有时候我们也没有那么多精力。虽然享受着猫咪们带来的快乐&#xf…

C# wpf 字体图标预览,html字符与unicode转换

在进行wpf 开发工作过程中遇到字体图标无法预览的问题&#xff0c;特此记录。 1、把需要预览的字体文件上传到网站上进行转换 Create Your Own font-face Kits Font Squirrel2、下载文件后进行解压。 3、找到 Glyph Chart 查看字体html字符编码4、在wpf中直接使用即可 <…

C语言数据结构之二叉树

少年恃险若平地 独倚长剑凌清秋 &#x1f3a5;烟雨长虹&#xff0c;孤鹜齐飞的个人主页 &#x1f525;个人专栏 &#x1f3a5;前期回顾-栈和队列 期待小伙伴们的支持与关注&#xff01;&#xff01;&#xff01; 目录 树的定义与判定 树的定义 树的判定 树的相关概念 树的运用…

AI魔幻巨制《魔戒4》电影宣传片

AI魔幻巨制《魔戒4》电影宣传片 中土世界的命运悬于一线。 争夺魔戒的最终战斗已经开始。 面对无边的黑暗&#xff0c;光明战士将挺身而出。 光明与黑暗在终极对决中碰撞。 英雄崛起&#xff0c;传奇重生。 最后的战斗即将来临。 谁是拯救世界的英雄&#xff1f; 想看哪部…

Python生态系统中10个强大的 Web 框架

在蓬勃发展的Python生态系统中&#xff0c;一系列强大的 Web 框架可以满足不同的开发人员需求。选择正确的产品对于成功的 Web 开发之旅至关重要。 Django&#xff1a; Django是古老的 Python 框架&#xff0c;以其成熟、安全且功能丰富的架构而屹立不倒。它采用包含插件的理…

嵌入式学习第十六天

制作俄罗斯方块小游戏&#xff08;一&#xff09; 分析&#xff1a; printf函数高级用法 \033[&#xff1a;表示转义序列的开始 m&#xff1a;表示转义序列的结束 0&#xff1a;重置所有属性 1&#xff1a;设置粗体或高亮 30-37&#xff1a;设置字体色 30: 黑 31: 红 32:…

MySQL窗口函数--lead()函数

lead()函数&#xff1a; 查询当前行向下偏移n行对应的结果 该函数有三个参数&#xff1a;第一个为待查询的参数列名&#xff0c;第二个为向下偏移的位数&#xff0c;第三个参数为超出最下面边界的默认值。 如下代码&#xff1a; 查询向下偏移 2 位的年龄 SELECT user_id,user…

AI新工具(20240201) 字节推出了国内版的 Coze 扣子;ChatGemini-使用 Google 的生成式 AI 来生成对您的消息的响应

ChatGemini-使用 Google 的生成式 AI 来生成对您的消息的响应 ChatGemini 是一个基于 Google Gemini 的网页客户端&#xff0c;对标 ChatGPT 3.5&#xff0c;使用逻辑同 ChatGPT 3.5 一致&#xff0c;同时支持在聊天中上传图片&#xff0c;自动调用 Gemini-Pro-Vision 模型进行…

Python闭包

函数的引用 程序运行时函数会被在内存中创建&#xff0c;并有一个十进制的内存地址&#xff0c;这个内存地址就被保存在函数名中&#xff0c;通过这个内存地址就可以找到这个函数&#xff0c;当然也可以使用内存地址去执行这个函数 def test():pass # 内存地址保存在函数名中…

python+selenium的web自动化】- 元素的常用操作详解(一)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

旷视low-level系列(二):Practical Deep Raw Image Denoising on Mobile Devices

论文&#xff1a;ECCV 2020 代码&#xff1a;https://github.com/MegEngine/PMRID 文章目录 1. Motivation2. Contribution3. Methods3.1 噪声建模&参数估计3.2 k-Sigma变换3.3 移动端友好的网络结构 4. Experiments5. Comments 1. Motivation 业内周知&#xff0c;基于深…

Python程序设计 基础数据类型

1.1 编程规范 注释 python注释也有自己的规范&#xff0c;在文章中会介绍到。注释可以起到一个备注的作用&#xff0c;团队合作的时候&#xff0c;个人编写的代码经常会被多人调用&#xff0c;为了让别人能更容易理解代码的通途&#xff0c;使用注释是非常有效的。 在说规范…

SpringBoot实现动态数据源配置

场景描述&#xff1a; 前一阵子接手的新项目中需要使用2个数据源。 一个叫行云数据库&#xff0c;一个叫OceanBase数据库。 就是说&#xff0c;我有时候查询要查行云的数据&#xff0c;有时候查询要查 OceanBase 的数据&#xff0c;咋办&#xff1f; 废话不多说&#xff0c…

【go】延迟执行和定时器实现

目录 time.Sleep time.After time.NewTimer time.NewTicker time.Sleep time.Sleep可以实现延时执行 func TestSleep(t *testing.T) {fmt.Println("start time:", time.Now().Format("2006-01-02 15:04:05.000"))time.Sleep(2 * time.Second)fmt.Pri…