实现点击按钮导出页面pdf

在Vue 3 + Vite项目中,你可以使用html2canvasjspdf库来实现将页面某部分导出为PDF文档的功能。以下是一个简单的实现方式:

1.安装html2canvasjspdf

pnpm install html2canvas jspdf

2.在Vue组件中使用这些库来实现导出功能:

<template><div><button @click="exportToPDF">导出PDF</button><div ref="pdfContent" class="pdf-content"><!-- 这里是你想要导出的页面部分 --></div></div>
</template><script lang="ts">
import { defineComponent, ref } from 'vue';
import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';export default defineComponent({setup() {const pdfContent = ref<HTMLElement | null>(null);const exportToPDF = async () => {if (pdfContent.value) {const canvas = await html2canvas(pdfContent.value);const imgData = canvas.toDataURL('image/png');const doc = new jsPDF({orientation: 'portrait',unit: 'px',format: 'a4',});const imgProps = doc.getImageProperties(imgData);const pdfWidth = doc.internal.pageSize.getWidth();const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;doc.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight);doc.save('exported.pdf');}};return {pdfContent,exportToPDF,};},
});
</script><style>
.pdf-content {/* 样式按需定制 */
}
</style>

最后点击导出按钮,即可成功按设置导出你想要导出的部分内容到pdf文档了,如下所以,打开pdf即可:

封装方法htmlToPdf.ts

import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
// title:下载文件的名称  htmlId:包裹的标签的id
const htmlToPdf = (title: string, htmlId: string) => {var element = document.querySelector(htmlId) as HTMLElementwindow.pageYOffset = 0document.documentElement.scrollTop = 0document.body.scrollTop = 0setTimeout(() => {// // 以下注释的是增加导出的pdf水印 !!!!!!!!!!!!!// const value = '我是水印'// //创建一个画布// let can = document.createElement('canvas')// //设置画布的长宽// can.width = 400// can.height = 500// let cans = can.getContext('2d') as any// //旋转角度// cans.rotate((-15 * Math.PI) / 180)// cans.font = '18px Vedana'// //设置填充绘画的颜色、渐变或者模式// cans.fillStyle = 'rgba(200, 200, 200, 0.40)'// //设置文本内容的当前对齐方式// cans.textAlign = 'left'// //设置在绘制文本时使用的当前文本基线// cans.textBaseline = 'Middle'// //在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置)// cans.fillText(value, can.width / 8, can.height / 2)// let div = document.createElement('div')// div.style.pointerEvents = 'none'// div.style.top = '20px'// div.style.left = '-20px'// div.style.position = 'fixed'// div.style.zIndex = '100000'// div.style.width = element.scrollHeight + 'px'// div.style.height = element.scrollHeight + 'px'// div.style.background =//   'url(' + can.toDataURL('image/png') + ') left top repeat'// element.appendChild(div) // 到页面中html2Canvas(element, {allowTaint: true,useCORS: true,scale: 2, // 提升画面质量,但是会增加文件大小height: element.scrollHeight, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面   避雷避雷!!!windowHeight: element.scrollHeight,}).then(function (canvas) {var contentWidth = 1948var contentHeight = canvas.height*1948 / canvas.width// console.log('contentWidth', contentWidth)// console.log('contentHeight', contentHeight)// 一页pdf显示html页面生成的canvas高度;var pageHeight = (contentWidth * 841.89) / 592.28// 未生成pdf的html页面高度var leftHeight = contentHeight// console.log('pageHeight', pageHeight)// console.log('leftHeight', leftHeight)// 页面偏移var position = 0// a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高  //40是左右页边距var imgWidth = 595.28-60var imgHeight = (592.28 / contentWidth) * contentHeightvar pageData = canvas.toDataURL('image/jpeg', 1.0)var pdf = new JsPDF('portrait', 'px', 'a4')// 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)// 当内容未超过pdf一页显示的范围,无需分页if (leftHeight < pageHeight) {// console.log('没超过1页')pdf.addImage(pageData, 'JPEG', 2, 2, imgWidth, imgHeight)// pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth, imgHeight)} else {while (leftHeight > 0) {// console.log('超过1页')pdf.addImage(pageData, 'JPEG', 5, position, imgWidth, imgHeight)leftHeight -= pageHeightposition -= 841.89// 避免添加空白页if (leftHeight > 0) {pdf.addPage()}}}pdf.save(title + '.pdf')})}, 1000)
}export default htmlToPdf

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

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

相关文章

统计信号处理基础 习题解答11-11

题目 考虑矢量MAP估计量 证明这个估计量对于代价函数 使贝叶斯风险最小。其中&#xff1a;, &#xff0c;且. 解答 贝叶斯风险函数&#xff1a; 基于概率密度的非负特性&#xff0c;上述对积分要求最小&#xff0c;那就需要内层积分达到最小。令内层积分为&#xff1a; 上述积…

苹果Mac电脑能玩什么游戏 Mac怎么运行Windows游戏

相对于Windows平台来说&#xff0c;Mac电脑可玩的游戏较少。虽然苹果设备的性能足以支持各种大型游戏&#xff0c;但由于系统以及苹果配套服务的限制&#xff0c;很多游戏无法在Mac系统中运行。不过&#xff0c;借助虚拟机软件&#xff0c;Mac电脑可以突破系统限制玩更多的游戏…

光照老化试验箱在化工产品暴晒测试中的应用

概述 光照老化试验箱是一种模拟自然光照条件下材料老化情况的实验设备&#xff0c;广泛应用于化工、建材、电子、汽车等行业中对材料的耐候性、耐光性能等进行测试。通过模拟日光中的紫外线和温度等环境因素&#xff0c;加速材料老化过程&#xff0c;以此评估材料在长期使用中…

2024阿里云大模型自定义插件(如何调用自定义接口)

1&#xff0c;自定义插件入口 2&#xff0c;插件定义&#xff1a;描述插件的参数 2.1&#xff0c;注意事项&#xff1a; 2.1.1&#xff0c;只支持json格式的参数&#xff1b;只支持application/JSON&#xff1b;如下图&#xff1a; 2.1.2&#xff0c;需要把接口描述进行修改&a…

03:Spring MVC

文章目录 一&#xff1a;Spring MVC简介1&#xff1a;说说自己对于Spring MVC的了解&#xff1f;1.1&#xff1a;流程说明&#xff1a; 一&#xff1a;Spring MVC简介 Spring MVC就是一个MVC框架&#xff0c;Spring MVC annotation式的开发比Struts2方便&#xff0c;可以直接代…

LeetCode 算法:二叉搜索树中第K小的元素 c++

原题链接&#x1f517;&#xff1a;二叉搜索树中第K小的元素 难度&#xff1a;中等⭐️⭐️ 题目 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从1开始计数&#xff09;。 示例 1&#xff1a;…

第一周题目总结

1.车尔尼有一个数组 nums &#xff0c;它只包含 正 整数&#xff0c;所有正整数的数位长度都 相同 。 两个整数的 数位不同 指的是两个整数 相同 位置上不同数字的数目。 请车尔尼返回 nums 中 所有 整数对里&#xff0c;数位不同之和。 示例 1&#xff1a; 输入&#xff1a…

【嵌入式DIY实例-ESP8266篇】-LCD ST7735显示网络时间

LCD ST7735显示网络时间 文章目录 LCD ST7735显示网络时间1、硬件准备2、代码实现本文将介绍如何使用 ESP8266 NodeMCU Wi-Fi 板实现互联网时钟,其中时间和日期显示在 ST7735 TFT 显示屏上。 ST7735 TFT是一款分辨率为128160像素的彩色显示屏,采用SPI协议与主控设备通信。 1…

SQL语句(DML)

DML英文全称是Data Manipulation Language&#xff08;数据操作语言&#xff09;&#xff0c;用来对数据库中表的数据记录进行增删改等操作 DML-添加数据 insert into employee(id, workno, name, gender, age, idcard) values (1,1,Itcast,男,10,123456789012345678);select *…

AI 与数据的智能融合丨大模型时代下的存储系统

WOT 全球技术创新大会2024北京站于 6 月 22 日圆满落幕。本届大会以“智启新纪&#xff0c;慧创万物”为主题&#xff0c;邀请到 60 位不同行业的专家&#xff0c;聚焦 AIGC、领导力、研发效能、架构演进、大数据等热门技术话题进行分享。 近年来&#xff0c;数据和人工智能已…

记录搭建一台可域名访问的HTTPS服务器

一、背景 近期公司业务涉及到微信小程序&#xff0c;即将开发完成需要按照微信小程序平台的要求提供带证书的域名请求服务器。 资源背景介绍如下&#xff1a; 1、域名 公司已有一个二级域名&#xff0c;再次申请新的二级域名并且实现ICP备案不仅需要花重金重新购买&#xff0c;…

Docker实现Redis主从,以及哨兵机制

Docker实现Redis主从,以及哨兵机制 目录 Docker实现Redis主从,以及哨兵机制准备Redis镜像创建Redis主节点配置文件启动Redis从节点确认主从连接哨兵主要功能配置哨兵文件创建Redis哨兵的Docker容器 要通过Docker实现Redis的主从&#xff08;master-slave&#xff09;复制&#…

汽车EDI: BMW EDI项目案例

宝马集团是全世界成功的汽车和摩托车制造商之一&#xff0c;旗下拥有BMW、MINI和Rolls-Royce三大品牌&#xff1b;同时提供汽车金融和高档出行服务。作为一家全球性公司&#xff0c;宝马集团在14个国家拥有31家生产和组装厂&#xff0c;销售网络遍及140多个国家和地区。 本文主…

什么是 Socks5 代理?了解和使用 SOCKS5 代理的终极指南

SOCKS5是什么以及它如何工作&#xff1f; 在网络和互联网协议领域&#xff0c;有多种工具和技术在确保安全高效的通信方面发挥着至关重要的作用。 SOCKS5 就是这样一个工具&#xff0c;它代表套接字安全版本 5。 在这篇博文中&#xff0c;我们将深入探讨 SOCKS5 的细节&…

CoAtNet(NeurIPS 2023, Google)论文解读

paper&#xff1a;CoAtNet: Marrying Convolution and Attention for All Data Sizes third-party implementation&#xff1a;https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/maxxvit.py 背景 自AlexNet以来&#xff0c;ConvNets一直是计算机…

【基于R语言群体遗传学】-5-扩展到两个以上等位基因及多基因位点

我们现在继续对于群体遗传学进行统计建模&#xff0c;书接上回&#xff0c;我们讨论了孤雌生殖的物种违反哈代温伯格遗传比例的例子&#xff0c;那我们现在来看多于两个等位基因的情况的计算。 如果没有看过之前文章的同学&#xff0c;可以先去看一下之前的文章&#xff1a; …

开源租房项目

项目名称项目地址描述体验地址后端代码前端代码小程序端代码gitHubstart租房或房屋交易项目https://github.com/saysky/manland?tabreadme-ov-filePC端 管理端http://manland.liuyanzhao.com/有有无房适–房屋租赁管理平台https://github.com/LiuXIn011/rightHouse开源房屋管理…

非对称加密算法原理与应用1——秘钥的生成

作者:私语茶馆 1.前言 非对称算法有非常多的用途,实现license管控,数字签名,加密内容等等,由于涉及场景和标准非常多,因此实际使用过程中还是存在一定门槛,这里记录一下利用非对称算法RSA的应用关键点,并提供实现license管理的案例。预计拆分为以下几个章节: (1)秘…

【分布式数据仓库Hive】HivQL的使用

目录 一、Hive的基本操作 1. 使用Hive创建数据库test 2. 检索数据库&#xff08;模糊查看&#xff09;&#xff0c;检索形如’te*’的数据库 3. 查看数据库test详情 4. 删除数据库test 5. 创建一个学生数据库Stus&#xff0c;在其中创建一个内部表Student&#xff0c;表格…

【kafka】可视化工具cmak(原kafka-manager)安装问题解决

众所周知&#xff08;反正不管你知不知道&#xff09;&#xff0c;kafka-maneger更名了&#xff0c;现在叫cmak&#xff01;原因是什么呢&#xff1f;据不可靠小道信息说&#xff0c;原kafka-manager这个名字涉及到kafka商标使用问题&#xff0c;应该是被律师函警告了&#xff…