react+html2canvas+jspdf將頁面導出pdf

主要使用html2canvas+jspdf
1.將前端頁面導出為pdf
2.處理導出后圖表的截斷問題

export default function AIReport() {const handleExport = async () => {try {// 需要導出的內容idconst element = document.querySelector('#AI-REPORT-CONTAINER');if (!element) {message.error('未找到要導出的內容');return;}message.loading({ content: '正在導出PDF...', key: 'export' });// 使用html2canvas生成整個報告的畫布const canvas = await html2canvas(element as HTMLElement, {scale: 2, // 提高清晰度useCORS: true,allowTaint: true,backgroundColor: '#ffffff',logging: false,});// 創建PDF對象const pdf = new jsPDF({orientation: 'p', // 縱向unit: 'pt', // 使用點作為單位format: 'a4', // A4紙張});// 獲取A4頁面尺寸const a4Width = pdf.internal.pageSize.getWidth();const a4Height = pdf.internal.pageSize.getHeight();// 計算等比例下A4高度對應的canvas高度const a4HeightInCanvas = Math.floor((canvas.width / a4Width) * a4Height);// 獲取canvas的總高度let leftHeight = canvas.height;// PDF頁面偏移量let position = 0;// 創建臨時canvas用于分頁const tempCanvas = document.createElement('canvas');const ctx = tempCanvas.getContext('2d');// 遞歸處理每一頁const processNextPage = () => {if (leftHeight <= 0) {// 完成所有頁面處理,保存并下載PDFconst pdfOutput = pdf.output('blob');const url = URL.createObjectURL(pdfOutput);const link = document.createElement('a');link.href = url;link.download = `AI基金報告_${data?.title || '未命名'}_${data?.date || ''}.pdf`;document.body.appendChild(link);link.click();document.body.removeChild(link);URL.revokeObjectURL(url);message.success({ content: 'PDF導出成功', key: 'export' });return;}// 計算當前頁的高度let currentPageHeight;if (leftHeight > a4HeightInCanvas) {// 需要尋找合適的分頁點let cutPoint = position + a4HeightInCanvas;let isFound = false;// 向上搜索連續的空白行作為分頁點let checkCount = 0;for (let y = position + a4HeightInCanvas; y >= position; y--) {let isBlankLine = true;// 檢查這一行的像素是否全為白色for (let x = 0; x < canvas.width; x += 10) {// 每10個像素采樣一次提高性能const pixelData = canvas?.getContext('2d')?.getImageData(x, y, 1, 1).data;// 檢查像素是否接近白色(允許一些誤差)if (pixelData?.[0] < 250 ||pixelData?.[1] < 250 ||pixelData?.[2] < 250) {isBlankLine = false;break;}}if (isBlankLine) {checkCount++;// 找到連續10行空白,確定為分頁點if (checkCount >= 10) {cutPoint = y;isFound = true;break;}} else {checkCount = 0;}}// 如果沒找到合適的分頁點,就使用默認值currentPageHeight = isFound? Math.round(cutPoint - position): Math.min(leftHeight, a4HeightInCanvas);// 確保高度不為0if (currentPageHeight <= 0) {currentPageHeight = a4HeightInCanvas;}} else {// 最后一頁,直接使用剩余高度currentPageHeight = leftHeight;}// 設置臨時canvas的尺寸tempCanvas.width = canvas.width;tempCanvas.height = currentPageHeight;// 將原canvas對應部分繪制到臨時canvasctx?.drawImage(canvas,0,position,canvas.width,currentPageHeight,0,0,canvas.width,currentPageHeight,);// 從第二頁開始添加新頁面if (position > 0) {pdf.addPage();}// 將當前頁添加到PDFpdf.addImage(tempCanvas.toDataURL('image/jpeg', 1.0),'JPEG',0,0,a4Width,(a4Width / tempCanvas.width) * currentPageHeight,);// 更新剩余高度和位置leftHeight -= currentPageHeight;position += currentPageHeight;// 處理下一頁setTimeout(processNextPage, 100);};// 開始處理頁面processNextPage();} catch {message.error({ content: '導出PDF失敗,請稍后重試', key: 'export' });}};return (<Spin spinning={loading} wrapperClassName={styles.spinWrapper}><div className={styles.exportBtn}><Button type="primary" onClick={handleExport}>導出PDF</Button></div><div className={styles.container} id="AI-REPORT-CONTAINER">這里為需要導出的頁面內容,table,echart等</div></Spin>);
}

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

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

相關文章

FFmpeg:多媒體處理的終極利器

FFmpeg詳細介紹 1. 定義與基本概述 FFmpeg是一套開源的跨平臺多媒體處理工具集,最初由法國程序員Fabrice Bellard于2000年開發,其名稱源自“Fast Forward MPEG”,體現了其高效處理MPEG格式的能力。它不僅是命令行工具,還包含多個庫和開發套件,支持視頻轉碼、剪輯、合并、…

【應用開發十】pwm

1 應用層操作PWM 與LED設備一樣&#xff0c;操作PWD也是通過sysfs方式 1&#xff09; 所在目錄&#xff1a;/sys/class/pwm&#xff0c;該目錄下的文件為pwmchipX&#xff0c;為PWM控器&#xff0c;I.MX6ULL有八個pwm控制器 1.1 pwm 控制器 PWM控制器里內容&#xff08;即pw…

LeetCode算 法 實 戰 - - - 雙 指 針 與 移 除 元 素、快 慢 指 針 與 刪 除 有 序 數 組 中 的 重 復 項

LeetCode算 法 實 戰 - - - 雙 指 針 與 移 除 元 素、快 慢 指 針 與 刪 除 有 序 數 組 中 的 重 復 項 第 一 題 - - - 移 除 元 素方 法 一 - - - 雙 重 循 環方 法 二 - - - 雙 指 針方 法 三 - - - 相 向 雙 指 針&#xff08;面 對 面 移 動&#xff09; 第 二 題 - - -…

設計模式系列(03):設計原則(二):DIP、ISP、LoD

本文為設計模式系列第3篇,聚焦依賴倒置、接口隔離、迪米特法則三大設計原則,系統梳理定義、實際業務場景、優缺點、最佳實踐與常見誤區,適合系統學習與團隊協作。 目錄 1. 引言2. 依賴倒置原則(DIP)3. 接口隔離原則(ISP)4. 迪米特法則(LoD)5. 常見誤區與反例6. 最佳實…

計算機圖形學中MVP變換的理論推導

計算機圖形學中MVP變換的理論推導 課程地址&#xff1a;Computing the Pixel Coordinates of a 3D Point 知識鋪墊&#xff1a;矩陣的真實內涵 矩陣的每一列/行&#xff08;左乘和右乘的區別&#xff09;代表了新坐標系的基向量在原基向量構成的坐標系中的坐標&#xff0c;這…

先說愛的人為什么先離開

2025年5月19日&#xff0c;15~23℃&#xff0c;賊好的一天&#xff0c;無事發生 待辦&#xff1a; 2024年稅務申報 《高等數學2》取消考試資格學生名單 《物理[2]》取消考試資格名單 5月24日、25日監考報名 《高等數學2》備課 《物理[2]》備課 職稱申報材料 教學技能大賽PPT 遇…

面試中的線程題

原文鏈接&#xff1a;線程題大全 Java 并發庫同步輔助類 CountDownLatch 工作機制&#xff1a;初始化一個計數器&#xff0c;此計數器的值表示需要等待的事件數量。 提供了兩個主要方法&#xff1a; await()&#xff1a;當一個線程調用此方法時&#xff0c;它將阻塞&#…

Linux夢開始的地方

1.概率 經過C語言&#xff0c;數據結構&#xff0c;C的學習我們現在要開始學習Linux的學習了。我們學習Linux是從四部分來進行的&#xff1a; 1.Linux初識&#xff0c;Linux環境&#xff0c;Linux指令&#xff0c;Linux開發環境。 2.Linux系統。 3.Linux網絡 4.MySQL Lin…

“二維前綴和”算法原理及模板

在學習本篇內容前建議先學習一下“一維前綴和” 一維前綴和 算法https://blog.csdn.net/czt230610/article/details/148012923?fromshareblogdetail&sharetypeblogdetail&sharerId148012923&sharereferPC&sharesourceczt230610&sharefromfrom_link接下來…

軟件設計師CISC與RISC考點分析——求三連

一、考點分值占比與趨勢分析&#xff08;CISC與RISC&#xff09; 綜合知識分值統計表 年份考題數量分值分值占比考察重點2018111.33%指令特征對比2019111.33%控制器實現方式2020222.67%寄存器數量/流水線技術2021111.33%尋址方式對比2022222.67%指令復雜度/譯碼方式2023111.3…

順 序 表:數 據 存 儲 的 “ 有 序 陣 地 ”

順 序 表&#xff1a;數 據 存 儲 的 “ 有 序 陣 地 ” 線 性 表順 序 表 - - - 順 序 存 儲 結 構順 序 表 的 操 作 實 現代 碼 全 貌 與 功 能 介 紹順 序 表 的 功 能 說 明代 碼 效 果 展 示代 碼 詳 解SeqList.hSeqList.ctest.c 總 結 &#x1f4bb;作 者 簡 介&#xf…

網絡安全深度解析:21種常見網站漏洞及防御指南

一、高危漏洞TOP 10 1. SQL注入(SQLi) 原理:通過構造惡意SQL語句突破系統過濾機制 典型場景: - 聯合查詢注入: union select 1,version(),3--+ - 布爾盲注:and (select substr(user(),1,1)=r) - 時間盲注:;if(now()=sysdate(),sleep(5),0)/ 防御方案: - 嚴格參數化查…

代碼上傳gitte倉庫

把代碼push上去就行

創建型:單例模式

目錄 1、核心思想 2、實現方式 2.1 餓漢式 2.2 懶漢式 2.3 枚舉&#xff08;Enum&#xff09; 3、關鍵注意事項 3.1 線程安全 3.2 反射攻擊 3.3 序列化與反序列化 3.4 克隆保護 4、適用場景 1、核心思想 目的&#xff1a;確保一個類僅有一個實例 功能&#xff1a;…

副業小程序YUERGS,從開發到變現

文章目錄 我為什么寫這個小程序網站轉小程序有什么坑有什么推廣渠道個人開發者如何變現簡單介紹YUERGS小程序給獨立開發者一點小建議 我為什么寫這個小程序 關注我的粉絲應該知道&#xff0c;我在碩士階段就已經掌握了小程序開發技能&#xff0c;并寫了一個名為“約球online”…

React路由(React學習筆記_09)

React路由 1,路由基礎 現代的前端應用大多都是SPA(單頁應用程序)&#xff0c;也就是只有一個HTML頁面的應用程序。因為它的用戶體驗更好、對服務器的壓力更小&#xff0c;所以更受歡迎。為了有效的使用單個頁面來管理原來多個頁面的功能&#xff0c;前端路由應運而生。 1, 安裝…

2009-2025計算機408統考真題及解析

整理2009-2025 年計算機408統考真題及解析PDF 目錄樹&#xff1a; └── 2025考研計算機408統考真題及答案&#xff08;回憶版&#xff09;.pdf ├── 2009-2024計算機408真題解析 │ ├── 2009年計算機408統考真題解析.pdf │ ├── 2010年計算機408統考真題解析.pdf …

Mysql、Oracle、Sql Server、達夢之間sql的差異

1&#xff1a;分頁查詢 Sql Server&#xff1a; <bind name"startRow" value"(page - 1) * limit 1"/> <bind name"endRow" value"page * limit"/> SELECT *FROM (SELECT ROW_NUMBER() OVER (<if test"sortZd!…

SQL Server 常用函數

一、字符串處理函數 1. CONCAT&#xff1a;拼接字符串 語法&#xff1a;CONCAT(string1, string2, ..., stringN) 實例&#xff1a; SELECT CONCAT(Hello, , World) AS Result; 輸出&#xff1a; Result ------------- Hello World 2. SUBSTRING&#xff1a;截取子字符串 …

【通用大模型】Serper API 詳解:搜索引擎數據獲取的核心工具

Serper API 詳解&#xff1a;搜索引擎數據獲取的核心工具 一、Serper API 的定義與核心功能二、技術架構與核心優勢2.1 技術實現原理2.2 對比傳統方案的突破性優勢 三、典型應用場景與代碼示例3.1 SEO 監控系統3.2 競品廣告分析 四、使用成本與配額策略五、開發者注意事項六、替…