jsPDF + html2canvas + Vue3 + ts项目内,分页导出当前页面为PDF、A 页面内导出 B 页面的内容为PDF,隐藏导出按钮等多余元素

jsPDF + html2canvas + Vue3 + ts + Arco Design项目,分页导出当前页面为PDF、A 页面内导出 B 页面的内容为PDF,隐藏导出按钮等多余元素…

1.下载所需依赖

 pnpm install --save html2canvaspnpm install --save jspdf
  1. 引入依赖
<script setup lang="ts">import html2canvas from 'html2canvas';import jsPDF from 'jspdf';
</script>
  1. 页面如下
    在这里插入图片描述

  2. 页面结构(示例代码

  • id=pdfContent,为整个导出区域
  • id=extraElement,为导出时需要隐藏的DOM元素(左上方返回及右上方按钮)
  • handelExportPdf,为右上角“导出PDF”点击导出的事件
// id=pdfContent,为打印区域<a-card id="pdfContent" class="general-card"><a-row justify="space-between" style="min-height: 32px">// id=extraElement,为打印时需要隐藏的DOM元素<div id="extraElement" class="back-btn" @click="router.go(-1)"><icon-undo /><span style="margin-left: 4px">返回</span></div><div class="middle-title">这是PDF文件的标题</div><a-button id="extraElement" type="primary" @click="handelExportPdf">导出PDF</a-button></a-row><a-divider /><div><a-row class="info" style="margin-bottom: 15px"><a-col><span class="label">姓名:</span><span class="value">张三</span></a-col><a-col><span class="label">性别:</span><span class="value"></span></a-col><a-col><span class="label">年龄:</span><span class="value">18</span></a-col></a-row></div></a-card>
  1. 分页。设置好每一页PDF的高度,然后canvas的高度一页一页剪掉再分别添加,相关代码在下面第九步写出
  2. 隐藏多余元素(左上方返回及右上方按钮)
const extraElementStyle = ref();	
// 隐藏元素
extraElementStyle.value = document.querySelectorAll('#extraElement');
extraElementStyle.value.forEach((item: any) => {if (item) {item.style.display = 'none';}
});

隐藏后点击导出,此时页面如下

在这里插入图片描述

  1. 下载PDF文件成功后,上一步隐藏的DOM元素要恢复原装
// 恢复隐藏的元素
extraElementStyle.value.forEach((item: any) => {if (item) {item.style.display = 'block';}
});
  1. 整体方法(相关解释在注释)
 //获取需要的DOM元素const element = ref();const extraElementStyle = ref();// 执行导出方法const handelExportPdf = () => {element.value = document.getElementById('pdfContent');// 隐藏或删除不需要的元素extraElementStyle.value = document.querySelectorAll('#extraElement');extraElementStyle.value.forEach((item: any) => {if (item) {item.style.display = 'none';}});// 为了保证显示质量,1.5倍PDF尺寸(数值越大,显示质量越好,但文件越大)const scale = 1.5;// 获取 HTML 元素的原始宽度,如果获取不到,则设置默认宽度为 700const originWidth = element.value.offsetWidth || 700;// 算生成 PDF 所需的宽度,这里将原始宽度增加了 20const width = originWidth + 20;// 计算生成 PDF 的最终宽度、高度const PDF_WIDTH = width * scale;const PDF_HEIGHT = width * 1.414 * scale;// 将元素转换为canvas对象html2canvas(element.value, {scale,}).then((canvas) => {// 获取 Canvas 对象的宽度、高度const contentWidth = canvas.width;const contentHeight = canvas.height;// 一页pdf显示页面生成的canvas高度// canvas图像在画布上的尺寸const pageHeight = (contentWidth / PDF_WIDTH) * PDF_HEIGHT;const imgWidth = PDF_WIDTH;const imgHeight = (PDF_WIDTH / contentWidth) * contentHeight;// 初始化剩余未插入 PDF 的 Canvas 高度为 Canvas 的总高度let leftHeight = contentHeight;// 初始化插入 PDF 的位置为 0let position = 0;// eslint-disable-next-line new-capconst pdf = new jsPDF('p', 'px', [PDF_WIDTH, PDF_HEIGHT]);// 判断剩余未插入 PDF 的高度是否小于一页 PDF 的高度,如果是,则代表剩余内容不足一页,直接将 Canvas 图像添加到 PDF 中if (leftHeight < pageHeight) {pdf.addImage(canvas, 'PNG', 0, 0, imgWidth, imgHeight);} else {// 多页while (leftHeight > 0) {// 将 Canvas 图像添加到 PDF 中,指定图像的位置和尺寸pdf.addImage(canvas, 'PNG', 0, position, imgWidth, imgHeight);// 更新剩余未插入 PDF 的高度leftHeight -= pageHeight;// 更新下一页插入 PDF 的位置position -= PDF_HEIGHT;// 如果还有剩余内容未插入 PDF,添加新的页面,避免添加空白页if (leftHeight > 0) {pdf.addPage();}}}// 保存PDF文件pdf.save('演练报告.pdf');// 恢复隐藏的元素extraElementStyle.value.forEach((item: any) => {if (item) {item.style.display = 'block';}});Message.success('导出成功');});};
  1. 导出文件如下
  • 浏览器内
    在这里插入图片描述
  • office内
    在这里插入图片描述
  1. 如果是想实现在A 页面内点击“导出”,随即导出 B 页面的内容为PDF:可以使用 Vue Router 将 A 页面和 B 页面分别定义为两个路由,并在 A 页面中使用路由导航跳转到 B 页面,在 B 页面中,页面加载完成后使其自动调用导出方法导出 PDF文件,然后保存到本地。

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

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

相关文章

OpenCV 库来捕获和处理视频输入和相似度测量(73)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV的周期性噪声去除滤波器(70) 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; ​ 目标 如今&#xff0c;拥有数字视频录制系统供您使用是很常见的。因此&#xff0c;您…

flutter页面异常监测

flutter页面异常监测 在Flutter中&#xff0c;通常用FlutterError监测Flutter框架抛出的异常&#xff0c;用runZonedGuarded监测应用中用户代码异常。 class AppGuarded { run(Widget app) { //1. 用FlutterError监测flutter框架抛出的异常 FlutterError.onError (FlutterErr…

FreeBSD RISCV 在QEME中实践-网络配置

在前一篇文章中&#xff0c;我们一起进行了FreeBSD RISCV 在QEME中实践 现在&#xff0c;让我们配置好网络吧&#xff01; 先上结论&#xff1a;用默认配置启动即可&#xff0c;网络就加载好了&#xff0c;只是不能ping罢了。因为不能ping&#xff0c;以为网络没通&#xff0…

opencv图片的平移-------c++

图片平移 cv::Mat opencvTool::translateImage(const cv::Mat& img, int dx, int dy) {// 获取图像尺寸int rows img.rows;int cols img.cols;// 定义仿射变换矩阵cv::Mat M (cv::Mat_<float>(2, 3) << 1, 0, dx, 0, 1, dy);// 进行仿射变换cv::Mat dst;cv…

[附源码+视频教程]暗黑纪元H5手游_架设搭建_畅玩三网全通西方3D世界_带GM

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 一. 演示视频 暗黑纪…

目标检测——水下垃圾数据集DeepTrash

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

[图解]不变式的构造和化简

1 00:00:02,420 --> 00:00:03,380 下面这个&#xff0c;我们来看 2 00:00:03,390 --> 00:00:09,940 X→select&#xff08;Y&#xff09;&#xff0c;用Y这个条件来筛选 3 00:00:09,950 --> 00:00:11,340 之后得到的集合 4 00:00:12,400 --> 00:00:14,390 forAl…

SD-WAN介绍,为何成为主推。

1、SD-WAN&#xff08;Software Defined Wide Area Network&#xff0c; 软件定义的广域网&#xff09; 将企业的分支、总部和多云之间互联起来&#xff0c;应用在不同混合链路&#xff08;MPLS&#xff0c;Internet&#xff0c;5G&#xff0c;LTE等&#xff09;之间选择最优的…

EmotionBench—— 基于 LLM 情绪的量化框架

介绍 大型语言模型&#xff08;LLM&#xff09;在近年来取得了显著的进展&#xff0c;这在计算机科学领域被视为一个重要的里程碑。像ChatGPT和Claude这样的综合性软件已经不再仅仅是用于句子校正、文本翻译和编程的工具&#xff0c;它们已经演进成为类似于人类的助手。因此&a…

Linux 操作系统IPC

目录 1、IPC简介 1.1、共享内存 1.1.1 创建/访问共享内存 1.1.2 映射 1.1.3 解除映射 1.1.4 删除/修改共享内存 1.2 信号量集 1.2.1 创建信号量集合 1.2.2 信号量的初始化 1.2.3 信号量的还原和消耗 1.3 消息队列 1.3.1 概念 1.3.3 添加消息队列 1.3.4 读取消息…

Linux 系统下的一些常用命令和用法

keywords: Linux 类 Unix 系统下的一些常用命令和用法。 实用命令 fuser 查看文件被谁占用。 fuser -u .linux.md.swpid 查看当前用户、组 id。 lsof 查看打开的文件列表。 An open file may be a regular file, a directory, a block special file, a character speci…

Spring Cloud Gateway的部署

不要将 Spring Cloud Gateway 部署到 Tomcat 可以将Spring Cloud Gateway打成jar包&#xff0c;并通过jar包部署&#xff0c;步骤&#xff1a; 1. 修改构建配置 确保你的pom.xml文件中的打包方式为jar。 <packaging>jar</packaging> 2 打包项目 mvn clean pack…

社区养老服务|基于Springboot+vue的社区养老服务平台设计与实现(源码+数据库+文档)

社区养老服务平台 目录 基于Java的社区养老服务平台设计与实现 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 服务信息管理 3服务申请管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#…

【Linux系统化学习】网络套接字(编写简单的UDP服务端和客户端)

目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的区别 源端口号和目的端口号 认识TCP和UDP协议 TCP协议 UDP协议 网络字节序 socket编程接口 socket常见API sockaddr结构 简单的UDP网络程序 UDP服务端 创建套接字 填充本地网络信息 绑定 收取消息 …

Amine-PEG-Amine,956496-54-1在生物成像、生物传感器等领域具有广泛的应用

【试剂详情】 英文名称 Amine-PEG-Amine&#xff0c;NH2-PEG-NH2 中文名称 氨基-聚乙二醇-氨基&#xff0c;氨基PEG氨基&#xff0c; 双端氨基聚乙二醇 CAS号 956496-54-1 外观性状 由分子量决定&#xff0c;液体或者固体 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&…

5.3作业

这个声明定义了一个名为 s 的数组&#xff0c;数组包含 10 个元素&#xff0c;每个元素都是一个函数指针。(1)C (2)D (3)C (4)DE (5)C8 11 14(1)int IsFull(sequeue *seqn) { return ((seqn->frnt ((seqn->rear 1) % N)) ? 1 : 0); } (2)int IsEmpty(sequ…

C++命令行系统(三)

1 概述 在嵌入式开发中&#xff0c;经常会利用命令行交互系统测试功能&#xff0c;本文描述使用C语言开发的一个命令行交互系统&#xff0c;支持命令注册(C或C格式)&#xff0c;命令分组&#xff0c;执行命令&#xff0c;显示命令提示。 4 实例 4.1 实例代码 extern "C…

千古一帝秦始皇的一生

在中国历史上&#xff0c;秦始皇绝对是最有资格被称之为‘千古一帝’的皇帝。 这不光是因为&#xff0c;他是中国的第一个皇帝&#xff0c;更是因为他奠定了中国两千多年的政治格局&#xff0c;让中国从此有了大一统的意识。 1、赵国生涯 公元前259年&#xff0c;秦始皇嬴政…

软考 系统架构设计师系列知识点之软件可靠性基础知识(10)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件可靠性基础知识&#xff08;9&#xff09; 所属章节&#xff1a; 第9章. 软件可靠性基础知识 第2节 软件可靠性建模 9.2.2 软件可靠性模型的建模方法 一个软件可靠性模型通常&#xff08;但不是绝对&#xff09;…

利用PS中Lab颜色模式进行简单调色?

【原图】 详细步骤如下&#xff1a; Step 1 : 打开PS&#xff0c;打开素材&#xff0c;点菜单栏&#xff0c;【图像】-【模式】-【Lab颜色】&#xff0c;效果如下图 Step2&#xff1a;ctrl(或command)m打开曲线工具&#xff0c;选择a通道&#xff0c;效果如下图。 Step3: 把标…