前端-如何將前端頁面輸出為PDF并打包的壓縮包中

需要引入的依賴:

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…