需要引入的依赖:

import * as utils from '../../utils/utils'
import html2canvas from "html2canvas";
import JSZip from "jszip";
import JSPDF from "jspdf";
import FileSaver from "file-saver"import { Loading } from "element-ui";
importDetailPdf(title) {// 显示加载提示(告知用户正在生成导出 PDF)this.showLoading("正在处理数据,请等待...")let that = this// 需要导出为 PDF 的 DOM 容器(整页内容区域)var element = document.getElementById("pdfDom")// 将 DOM 渲染为画布(canvas)html2canvas(element, {logging: false // 关闭调试日志,减少控制台输出}).then(function (canvas) {// 创建 A4 纵向 PDF 文档:单位 mm,纸张 a4var pdf = new JSPDF("p", "mm", "a4") // A4纸,纵向// 画布上下文var ctx = canvas.getContext("2d")// A4 内容显示区域:210 x 297(mm),预留四周 20mm 边距 => 内容 170 x 257(mm)var a4w = 170;var a4h = 257 // A4大小,210mm x 297mm,四边各保留20mm的边距,显示区域170x257// 计算一页可容纳的图像像素高度(按 A4 内容区域等比换算)var imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度// 已经渲染(导出)的高度累计var renderedHeight = 0// 循环切割整张长画布,分页写入 PDFwhile (renderedHeight < canvas.height) {// 针对当前页创建一个临时画布,宽度与原始画布一致,高度为“单页可显示高度”或剩余高度var page = document.createElement("canvas")page.width = canvas.widthpage.height = Math.min(imgHeight, canvas.height - renderedHeight)// 可能内容不足一页// 从原始画布中截取当前页区域像素并绘制到临时画布page.getContext("2d").putImageData(ctx.getImageData(0, renderedHeight,               // 起始坐标canvas.width,                    // 截取宽度Math.min(imgHeight, canvas.height - renderedHeight) // 截取高度),0, 0)// 将当前页画布作为图片添加到 PDF:// 位置 (10,10) mm(四周 10mm 边距),宽度 a4w,高度按比例缩放(不超过 a4h)pdf.addImage(page.toDataURL("image/jpeg", 1.0), // 图片数据,JPEG,质量 1.0"JPEG",10, 10,                             // PDF 内左上角定位(mm)a4w,                                // 显示宽度(mm)Math.min(a4h, a4w * page.height / page.width) // 按比例计算的显示高度(mm))// 递增已渲染高度renderedHeight += imgHeight// 如果还有未导出的内容,则在 PDF 中新增一页if (renderedHeight < canvas.height) {pdf.addPage()}// 如果后面还有内容,添加一个空页// delete page; // 如需主动释放可在合适场景处理}// 未传入标题时,采用当前时间作为标题(注意:此处 this 作用域为 then 回调,不是 Vue 实例)if (title == undefined) {title = this.nowTimeDesc()}// 输出 PDF 为 dataURL 字符串let datauri = pdf.output('dataurlstring')// 截取 base64 数据体(去掉前缀 data:application/pdf;base64, => 28 字符)let base64 = datauri.substring(28)// 将 PDF 打包进 ziplet zip = new JSZip()let fileName = title + ".pdf"zip.file(fileName, base64, {base64: true})// 如果有其他需要一并下载的附件,这里继续打包后统一下载that.downloadOtherFile(zip, title)})},downloadOtherFile(zip, title) {this.showLoading("正在打包文档,请等待...")//查找所有的文档// zip.generateAsync({type:"blob"}).then(content => {//   FileSaver.saveAs(content,title + ".zip")// })// returnlet list = this.allProjectFileListif (utils.isEmpty(list) || list.length == 0) {//没有要下载的文档,直接打包并保存成文件zip.generateAsync({ type: "blob" }).then(content => {FileSaver.saveAs(content, title + ".zip")}).finally(() => {this.endLoading()})return}let promises = []list.forEach(item => {let promise = this.downloadProFile(item).then((res, file) => {filezip.file(this.parseFileType(item) + item.archiveName, res.data, { binary: true })})promises.push(promise)})Promise.all(promises).then(() => {zip.generateAsync({ type: "blob" }).then(content => {FileSaver.saveAs(content, title + ".zip")}).finally(() => {this.endLoading()})})},endLoading() {this.$nextTick(() => {if (this.loading) {this.loading.close()}})},

如果需要对页面中的内容进行判断,手动选择pdf中的内容则:

        对页面中的内容使用v-if来进行逻辑渲染,根据逻辑判断此时是否是导出pdf。

showProjectTeam() {if (!this.isExport) {return true}return this.projectTeam},

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

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

相关文章

LabVIEW 频谱分析应用

LabVIEW 频谱分析程序广泛应用于声学、振动、电力电子等领域&#xff0c;用于噪声频谱分析、设备故障诊断、电能质量评估等。通过模块化 VI 组合&#xff0c;可快速搭建 "信号模拟 - 采集&#xff08;或缓存&#xff09;- 频谱分析 - 结果展示" 完整流程&#xff0c;…

北斗导航 | 基于MCMC粒子滤波的接收机自主完好性监测(RAIM)算法(附matlab代码)

详细阐述基于MCMC粒子滤波的接收机自主完好性监测(RAIM)算法的原理、理论和实现方法,并提供完整的MATLAB代码示例。 1. 原理与理论 1.1 接收机自主完好性监测 (RAIM) 简介 RAIM是一种完全由GPS接收机内部实现的算法,用于在不依赖外部系统的情况下,监测GPS信号的完好性(…

【机器学习】4 Gaussian models

本章目录 4 Gaussian models 97 4.1 Introduction 97 4.1.1 Notation 97 4.1.2 Basics 97 4.1.3 MLE for an MVN 99 4.1.4 Maximum entropy derivation of the Gaussian * 101 4.2 Gaussian discriminant analysis 101 4.2.1 Quadratic discriminant analysis (QDA) 102 4.2.2…

Ruoyi-Vue 静态资源权限鉴权:非登录不可访问

一. 背景 移除/profile下静态资源访问权限后&#xff0c;富文本等组件中的图片加载失败!!! 使用ruoyi-vue3.8.9过程中发现上传的在ruoyi.profile下的文件未登录直接使用链接就可以访问下载&#xff0c;感觉这样不太安全&#xff0c;所以想对其进行鉴权限制&#xff0c;修改为只…

关于窗口关闭释放内存,主窗口下的子窗口关闭释放不用等到主窗口关闭>setAttribute(Qt::WA_DeleteOnClose);而且无需手动释放

‌QWidget重写closeEvent后&#xff0c;点击关闭时释放内存会调用析构函数‌&#xff0c;但需注意内存释放的时机和方式。 关闭事件与析构函数的关系 重写closeEvent时&#xff0c;若在事件处理中调用deleteLater()或手动删除对象&#xff0c;析构函数会被触发。但需注意&#…

C# 简单工厂模式(构建简单工厂)

构建简单工厂 现在很容易给出简单工厂类。只检测逗号是否存在&#xff0c;然后返回其中的一个类的实例。 public class NameFactory {public NameFactory(){}public Namer getName(string name){int iname.IndexOf(",");if(i>0)return new LastFirst(name);else{r…

uniappx与uniapp的区别

uniappx与uniapp的定位差异uniappx是DCloud推出的扩展版框架&#xff0c;基于uniapp进行功能增强&#xff0c;主要面向需要更复杂原生交互或跨平台深度定制的场景。uniapp则是标准版&#xff0c;适用于常规的跨平台应用开发&#xff0c;强调开发效率和代码复用。功能扩展性unia…

vue实现拖拉拽效果,类似于禅道首页可拖拽排布展示内容(插件-Grid Layout)

vue实现拖拉拽效果&#xff08;插件-Grid Layout&#xff09; 这个是类似与禅道那种首页有多个指标模块&#xff0c;允许用户自己拼装内容的那种感觉。 实现效果 插件资料 vue3版本 如果项目是vue3 的话使用的是 Grid Layout Plus。 官网&#xff1a;https://grid-layout-pl…

在Excel和WPS表格中打印时加上行号和列标

在电脑中查看excel和WPS表格的工作表时&#xff0c;能看到行号&#xff08;12345.....&#xff09;和列标&#xff08;ABCDE...&#xff09;&#xff0c;但是打印出来以后默认是没有行号和列标的&#xff0c;如果要让打印&#xff08;或者转为PDF&#xff09;出来以后仍能看到行…

设计模式:原型模式(Prototype Pattern)

文章目录一、原型模式的概念二、原型模式的结构三、原型注册机制四、完整示例代码一、原型模式的概念 原型模式是一种创建型设计模式&#xff0c; 使你能够复制已有对象&#xff0c; 而又无需使代码依赖它们所属的类。通过复制&#xff08;克隆&#xff09;已有的实例来创建新的…

Linux系统网络管理

一、网络参数配置1、图形化配置#开启 [rootlocalhost ~]# systemctl start NetworkManager #关闭 [rootlocalhost ~]# systemctl stop NetworkManager #关闭并开机不自启 [rootlocalhost ~]# systemctl disable --now NetworkManager #开启并开机自启 [rootlocalhost ~]# syste…

服务器初始化

服务器初始化文章目录服务器初始化1. 配置国内 Yum 源&#xff08;加速软件安装&#xff09;2. 更新系统与安装必备工具3. 网络连接验证4. 配置主机名5. 同步时间6. 配置防火墙 (两种方式)6.1 iptables整体思路详细步骤第 1 步&#xff1a;停止并禁用 Firewalld第 2 步&#xf…

基于YOLOv11训练无人机视角Visdrone2019数据集

【闲鱼服务】 基于YOLOv11训练无人机视角Visdrone2019数据集Visdrone2019数据集介绍数据集格式数据预处理yolov11模型训练数据分布情况可视化训练结果Visdrone2019数据集介绍 VisDrone 数据集 是由中国天津大学机器学习和数据挖掘实验室 AISKYEYE 团队创建的大规模基准。它包含…

基于Springboot 的智能化社区物业管理平台的设计与实现(代码+数据库+LW)

摘 要随着智慧社区的普及&#xff0c;传统的物业管理方式已经无法满足现代社区的需求。目前&#xff0c;很多社区管理中存在信息不畅通、工作效率低以及居民服务体验不佳等问题。为了解决这些问题&#xff0c;我们基于SpringBoot框架开发了一套智能化社区物业管理平台&#xf…

【深度学习新浪潮】SAM 2实战:Meta新一代视频分割模型的实时应用与Python实现

引言:从图像到视频的分割革命 上周AI领域最引人注目的计算机视觉进展,当属Meta在SAM(Segment Anything Model)基础上推出的SAM 2模型持续引发的技术热潮。尽管SAM 2最初发布于2024年,但最新更新的2.1版本(2024年9月发布)凭借其突破性的实时视频分割能力,在自动驾驶、影…

sqli-labs靶场安装与使用指导教程(3种方法:通用版、php7版、Docker版)

目录 一、SQLI-LABS靶场 1、核心特点 2、关卡难度 二、源码安装法 1、开启Web服务和数据库服务 2、靶场源码下载 &#xff08;1&#xff09;通用版本 &#xff08;2&#xff09;PHP7版本 3、部署sqli-labs靶场 &#xff08;1&#xff09;确认网站根目录位置 &#x…

从零开始配置前端环境及必要软件安装

从零开始配置前端环境及必要软件安装一、安装编辑器二、安装浏览器三、安装Git版本控制工具四、Node.js 和 npm 环境变量配置1. 安装 Node.js 和 npm2. 配置全局模块和缓存目录3. 设置环境变量4. 更换 npm 镜像源5. 测试配置五、hosts文件六、辅助应用markdown&#xff08;笔记…

神经网络模型搭建及手写数字识别案例

代码实现&#xff1a;import torch print(torch.__version__) from torch import nn from torch.utils.data import DataLoader from torchvision import datasets from torchvision.transforms import ToTensor training_data datasets.MNIST(rootdata,trainTrue,downloadTru…

CRMEB标准版PC扫码登录配置教程(PHP版)

需要在开放平台创建网站应用 微信开放平台地址&#xff1a;https://open.weixin.qq.com/ 1、注册网站应用 2、填写信息&#xff0c;网站地址填写前台访问的域名就行 3、复制开放平台AppId和开放平台AppSecret 4、粘贴到后台应用配置的PC站点配置里

AmazeVault 核心功能分析,认证、安全和关键的功能

系列文章目录 Amazevault 是一款专注于本地安全的桌面密码管理器 AmazeVault 核心功能分析&#xff0c;认证、安全和关键的功能 AmazeVault 快速开始&#xff0c;打造个人专属桌面密码管理器 文章目录系列文章目录前言一、认证系统核心组件图形解锁实现图形锁控件 (PatternLoc…