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项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的