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

本文主要是介绍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文件,然后保存到本地。

这篇关于jsPDF + html2canvas + Vue3 + ts项目内,分页导出当前页面为PDF、A 页面内导出 B 页面的内容为PDF,隐藏导出按钮等多余元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/961753

相关文章

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

html 滚动条滚动过快会留下边框线的解决方案

《html滚动条滚动过快会留下边框线的解决方案》:本文主要介绍了html滚动条滚动过快会留下边框线的解决方案,解决方法很简单,详细内容请阅读本文,希望能对你有所帮助... 滚动条滚动过快时,会留下边框线但其实大部分时候是这样的,没有多出边框线的滚动条滚动过快时留下边框线的问题通常与滚动条样式和滚动行

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.