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

相关文章

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经