vue將頁面導出pdf,vue導出pdf ,使用html2canvas和jspdf組件

vue導出pdf

需求:需要前端下載把當前html下載成pdf文件–有十八頁超長,之前使用vue-html2pdf組件,但是這個組件有長度限制和比較新瀏覽器版本限制,所以改成使用html2canvas和jspdf組件
方法:
1、第一步:我們要添加兩個模塊

//第一個:將頁面html轉換成圖片
npm install --save html2canvas
//第二個:將圖片生成pdf
npm install jspdf --save

2、第二步:在.vue界面編寫,例如我的頁面叫BusinessAnalysis.vue,必須在你想要下載的父級加一個id,例如我下面代碼 id=“html2PdfId”

<template>
<div ref="ananysisPageRef" class="business-analysis-wrap" ><div  id="html2PdfId">//=====這里是你自己寫的想轉成pdf的代碼</div><a-buttontype="primary":loading="exportLoading"@click="handleExportAI2()">導出PDF</a-button>
</div>
</template>
<script>
import VueHtml2pdf from 'vue-html2pdf'
import html2canvas from 'html2canvas'
export default {
name: 'BusinessAnalysis',
data() {return {pdfOptions: {pageWidth: 594, // A2橫向寬度(mm)pageHeight: 420, // A2橫向高度(mm)imageQuality: 0.8,},exportLoading: false,pdfBase64: '',base64Images: [],}}methods: {handleExportAI2() {this.$message.loading({ content: '導出PDF文件中...', key: 'exportPagePdfLoading' })this.exportLoading = truethis.generatePDF() // 生產pdf base64 --物業經營分析2},async generatePDF() {const startTime = performance.now()try {await this.$nextTick()// 1. 定義要截圖的元素ID(按順序)// 2. 截圖所有元素并計算高度const elements = await this.captureComponents1()console.log('elements', elements)const img = await this.loadImage(elements[0])// this.restoreAfterCapture();// 3. 創建PDF并智能分頁const pdf = new JsPDF({orientation: 'l',unit: 'mm',format: [this.pdfOptions.pageWidth, this.pdfOptions.pageHeight],// format: 'a4',// compress: true})// 計算分頁參數:ml-citation{ref="6,8" data="citationList"}const imgRatio = img.width / img.heightconst scaledWidth = this.pdfOptions.pageWidthconst scaledHeight = scaledWidth / imgRatioconst totalPages = Math.ceil(scaledHeight / this.pdfOptions.pageHeight)// 分頁渲染:ml-citation{ref="5,8" data="citationList"}for (let i = 0; i < totalPages; i++) {if (i > 0) pdf.addPage()const canvas = document.createElement('canvas')const ctx = canvas.getContext('2d')// 計算截取區域:ml-citation{ref="6,8" data="citationList"}const sliceHeight = (img.height * this.pdfOptions.pageHeight) / scaledHeightconst startY = i * sliceHeightconst isLastPage = i === totalPages - 1const currentSliceHeight = isLastPage ? img.height - startY : sliceHeight// 設置畫布尺寸:ml-citation{ref="3,5" data="citationList"}canvas.width = img.widthcanvas.height = currentSliceHeight// 繪制圖片分段:ml-citation{ref="5,6" data="citationList"}ctx.drawImage(img,0,startY, // 源坐標img.width,currentSliceHeight, // 源尺寸0,0, // 目標坐標canvas.width,canvas.height // 目標尺寸)// 計算PDF中的顯示高度:ml-citation{ref="6,8" data="citationList"}const displayHeight = isLastPage? (currentSliceHeight * this.pdfOptions.pageWidth) / img.width: this.pdfOptions.pageHeightpdf.addImage(canvas, 'JPEG', 0, 0, this.pdfOptions.pageWidth, displayHeight, undefined, 'FAST')canvas.width = 1canvas.height = 1}this.exportLoading = falsethis.$message.success({ content: '導出成功!', key: 'exportPagePdfLoading', duration: 1 })pdf.save('物業經營小項目分享.pdf')} catch (error) {console.error('生成PDF失敗:', error)alert('生成PDF失敗: ' + error.message)} finally {this.isGenerating = false}},loadImage(base64) {return new Promise((resolve, reject) => {const img = new Image()img.onload = () => resolve(img)img.onerror = rejectimg.src = base64})},async captureComponents1() {// 確保DOM更新完成(針對Vue的動態渲染)await this.$nextTick()const elements = [document.getElementById('html2PdfId')]const base64Images = []// 順序截圖(避免并行導致內存溢出)for (const element of elements) {// 分塊截圖try {const canvas = await html2canvas(element, {useCORS: true, // 允許跨域資源logging: false, // 關閉日志backgroundColor: '#FFFFFF', // 設置純白背景scale: 2, // 提高分辨率(2倍)allowTaint: true, // 禁止污染畫布removeContainer: true, // 自動移除臨時容器windowWidth: element.scrollWidth,windowHeight: element.scrollHeight,// ignoreElements: (el) => {//   // 過濾不需要渲染的元素//   if (//     el.contains(element) ||//     element.contains(el) ||//     el.tagName === 'STYLE' ||//     el.tagName === 'LINK' ||//     // el.tagName === 'IMG' ||//     el.getAttribute('data-html2canvas') != null // header里面的樣式不能篩掉//   ) {//     // console.log(el);//     return false//   }//   // console.log(e.tagName);//   return true// },// dpi: 300})const dataUrl = canvas.toDataURL('image/png', 1.0)base64Images.push(dataUrl)} catch (error) {console.error('截圖失敗:', element, error)base64Images.push('') // 空值占位}}return base64Images},}
}
</script>

上面基本上是完整的代碼,花了九頭二虎之力,就是還是會出現截斷的情況,我沒辦法解決,如果有大佬,求大佬指導
在這里插入圖片描述
可以下載22頁呢,就是下載的時候先截圖成圖片,再轉為pdf很慢,如果有大佬能解決很慢的問題,求指導

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912158.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912158.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912158.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

024 企業客戶管理系統技術解析:基于 Spring Boot 的全流程管理平臺

企業客戶管理系統技術解析&#xff1a;基于Spring Boot的全流程管理平臺 在企業數字化轉型的浪潮中&#xff0c;高效的客戶管理系統成為提升企業競爭力的關鍵工具。本文將深入解析基于Java和Spring Boot框架構建的企業客戶管理系統&#xff0c;該系統涵蓋員工管理、客戶信息管…

JavaScript性能優化代碼示例

JavaScript性能優化實戰大綱 性能優化的核心目標 減少加載時間、提升渲染效率、降低內存占用、優化交互響應 代碼層面的優化實踐 避免全局變量污染&#xff0c;使用局部變量和模塊化開發 減少DOM操作頻率&#xff0c;批量處理DOM更新 使用事件委托替代大量事件監聽器 優化循…

樹的重心(雙dfs,換根)

思路&#xff1a; 基于樹形 DP 的兩次遍歷&#xff08;第一次dfs計算以某個初始根&#xff08;這里選了 1&#xff09;為根時各子樹的深度和與節點數&#xff0c;第二次zy進行換根操作&#xff0c;更新每個節點作為根時的深度和&#xff09; 換根原理&#xff1a; 更換主根&…

官方App Store,直鏈下載macOS ,無需Apple ID,macOS10.10以上.

前言 想必很多人都有過維修老舊Mac的體驗,也有過想要重裝macos的體驗. 尤其是前者,想要重裝或者升級系統,由于官方已經無法更新,必須下載iSo鏡像 這時就會遇到死循環:想要更新macOS ,必須先使用更高版本的App Store,但要使用更高版本的App Store,必須先更新macOS !!! 如果想…

芋道生成前端界面代碼詳解

一、搜索框 1、整體架構 <ContentWrap> ... </ContentWrap><ContentWrap> 是頁面布局容器&#xff08;可能是自定義組件&#xff09;&#xff0c;包裹住頁面的內容區域。 2、el-form 表單&#xff08;搜索區域&#xff09; 2.1參數 <el-formclass&quo…

小程序入門:推廣技巧與運行數據查看解析

在當今數字化時代&#xff0c;小程序的應用愈發廣泛&#xff0c;無論是企業還是個人開發者&#xff0c;都希望自己的小程序能夠獲得更多用戶關注并順利運行。本文將詳細介紹小程序發布的流程、推廣策略以及如何查看運行數據&#xff0c;助力開發者更好地運營小程序。 一、小程…

sql server 將nvarchar長度設置成max有什么隱患

在學習 SQL Server 的過程中&#xff0c;很多開發者會選擇將 NVARCHAR 字段的長度設置為 MAX&#xff0c;以便于存儲大量文本數據。雖然這樣的設計在某些情況下可能會帶來便利&#xff0c;但卻潛藏著諸多隱患。本文將通過步驟性指導&#xff0c;幫助你理解這些隱患及其解決方式…

電商數據爬取實戰:如何挖掘隱藏的商業價值 ||電商API接口的應用價值

當你在深夜瀏覽電商平臺&#xff0c;目光被那些標注著“月銷10萬”的商品所吸引時&#xff0c;你是否曾思考過——這些驚人的數字背后隱藏著怎樣的商業秘密&#xff1f;今天&#xff0c;就讓我們化身為電商數據獵手&#xff0c;揮舞起爬蟲這把鋒利的手術刀&#xff0c;精心解剖…

??MQTT??通訊:??物聯網

??MQTT??通訊&#xff1a; ??物聯網&#xff08;IoT&#xff09;??&#xff1a;傳感器數據上報&#xff08;溫度、濕度&#xff09;、智能家居設備控制。 ??弱網絡環境??&#xff1a;移動網絡、衛星通信&#xff08;如遠程農業監測&#xff09;。 ??云端集成??…

swagger訪問不了的解決方案 http://localhost:8080/swagger-ui/index.html

確保增加 swagger 依賴 pom.xml <!-- Swagger --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.5.0</version></dependency> 在瀏覽器打開…

在 .NET Core WebAPI 項目中,執行文件(.exe)方式運行并指定端口

? 方法一&#xff1a;使用命令行指定端口 .NET Core WebAPI 項目默認使用 Kestrel Web 服務器&#xff0c;你可以通過環境變量或命令行參數來覆蓋默認監聽地址和端口。 示例命令&#xff1a; MyApi.exe --urls "http://localhost:5001"或者綁定所有主機地址&…

前綴樹進階-經典案例詳解

前綴樹進階-經典案例詳解 一、前綴樹基礎內容回顧二、單詞搜索建議系統2.1 問題描述2.2 解題思路2.3 Java代碼實現2.4 復雜度分析 三、單詞編碼3.1 問題描述3.2 解題思路3.3 Java代碼實現3.4 復雜度分析 四、最長單詞4.1 問題描述4.2 解題思路4.3 Java代碼實現4.4 復雜度分析 我…

Redis集群實現方式

? 一、什么是 Redis 集群&#xff08;Redis Cluster&#xff09; Redis 集群是 Redis 官方在 3.0 版本引入的分布式部署方案&#xff0c;它的目標是解決以下幾個問題&#xff1a; 單個 Redis 實例容量有限&#xff08;最多只能使用一個服務器的內存&#xff09; 單點故障&am…

《中國電信運營商骨干網:歷史、現狀與未來演進》系列 第五篇:新玩家入局——中國廣電CBNNET如何構建全國一張網?

專欄引言 在中國電信、聯通、移動三足鼎立的骨干網格局中&#xff0c;一位身負特殊使命的“國家隊新兵”正加速入場。它就是中國廣電。根據2023年發布的《廣電網絡融合發展戰略》&#xff0c;其核心任務是構建一張“新型廣電網絡”。手握700MHz“黃金頻段”和5G牌照&#xff0c…

QT 國際化 翻譯 總結

目錄 生成TS文件 單純Qt Creator工程 生成ts文件方式一&#xff1a;creator方式 生成ts文件方式二&#xff1a;命令行方式 vs2019QT工程 CMake工程 生成qm文件 代碼 需要先根據ui產生ts文件&#xff0c;再根據ts文件產生qm文件&#xff0c;然后代碼加載 生成TS文件 單…

Java 中實現 Excel 導入一些疑難雜癥

在 Java 中實現 Excel 導入功能時&#xff0c;除了已討論的字段映射、類型轉換和內存管理外&#xff0c;還需注意以下關鍵問題&#xff0c;結合常見踩坑點和最佳實踐總結如下&#xff1a; ?? 一、文件與格式校驗 文件類型與版本兼容性 明確區分 .xls&#xff08;HSSF&#x…

修改Docker-compose使Uptime-Kuma支持IPV6

之前部署了一個Uptime-Kuma用來監控服務的運行&#xff0c;最近&#xff0c;在監控IPV6網絡的時候出現了一點問題&#xff0c;Docker不支持IPV6網絡&#xff1a; 解決方案&#xff1a; 修改/etc/docker/daemon.json文件 {"experimental": true,"fixed-cidr-v6&…

分布式存儲架構的優勢

分布式存儲架構通過將數據分散存儲在多個物理節點上&#xff0c;在性能、可靠性及成本效益方面展現顯著優勢&#xff0c;具體核心優勢如下&#xff1a; 一、?彈性擴展能力? 水平無縫擴容? 通過添加節點即可線性擴展存儲容量與性能&#xff0c;支持EB級數據規模&#xff0…

【4目全景】基于海思3403平臺開發4目360°全景拼接相機方案

此文主要介紹基于海思3403平臺通過實時視頻采集&拼接&融合&顯示實現實時全景空間漫游體驗&#xff0c;該模組將4路視頻拼接成一幅360全景圖&#xff0c;涉及到計算機視覺、計算機圖形學、數字視頻處理等技術。 基本開發步驟主要包括以下幾個方面&#xff1a;4路視頻…

element-plus 按鈕 展開/隱藏

文章目錄 1、小記2、頁面3、typescript事件4、測試數據5、樣式 1、小記 element-plus中el-table 的 expand,箭頭控制子項顯示&#xff0c;有點丑。 想實現類似bootstrap &#xff0c;用按鈕 展開/隱藏子項的功能 2、頁面 <!-- 表內容 --><el-table:data"tabl…