vue項目使用html2canvas和jspdf將頁面導出成PDF文件

一、需求:

頁面上某一部分內容需要生成pdf并下載

二、技術方案:

使用html2canvas和jsPDF插件
?

三、js代碼

// 頁面導出為pdf格式
import html2Canvas from "html2canvas";
import jsPDF from "jspdf";
import { uploadImg } from '@/api/public';const htmlToPdf = {getPdf(title, id) {html2Canvas(document.querySelector(id), {allowTaint: false,taintTest: false,logging: false,useCORS: true,dpi: window.devicePixelRatio * 4, //將分辨率提高到特定的DPI 提高四倍scale: 4, //按比例增加分辨率}).then((canvas) => {var pdf = new jsPDF("p", "mm", "a4"); //A4紙,縱向var ctx = canvas.getContext("2d"),a4w = 190,a4h = 272, //A4大小,210mm x 297mm,四邊各保留10mm的邊距,顯示區域190x277imgHeight = Math.floor((a4h * canvas.width) / a4w), //按A4顯示比例換算一頁圖像的像素高度renderedHeight = 0;while (renderedHeight < canvas.height) {var page = document.createElement("canvas");page.width = canvas.width;page.height = Math.min(imgHeight, canvas.height - renderedHeight); //可能內容不足一頁//用getImageData剪裁指定區域,并畫到前面創建的canvas對象中page.getContext("2d").putImageData(ctx.getImageData(0,renderedHeight,canvas.width,Math.min(imgHeight, canvas.height - renderedHeight)),0,0);pdf.addImage(page.toDataURL("image/jpeg", 1.0),"JPEG",10,10,a4w,Math.min(a4h, (a4w * page.height) / page.width)); //添加圖像到頁面,保留10mm邊距renderedHeight += imgHeight;if (renderedHeight < canvas.height) {pdf.addPage(); //如果后面還有內容,添加一個空頁}// delete page;}console.log(pdf)// pdf.save(title + ".pdf"); // PDF.save() 此方法可以將pdf直接保存本地let pdfData = pdf.output('datauristring') // 獲取base64Pdflet files = dataURLtoFile(pdfData, '封面.pdf') // 將base64文件轉化為流,上傳ossuploadFiles(files)});},
};function dataURLtoFile(dataurl, filename) {let arr = dataurl.split(',')let mime = arr[0].match(/:(.*?);/)[1]let bstr = atob(arr[1])let n = bstr.lengthlet u8arr = new Uint8Array(n)while (n--) {u8arr[n] = bstr.charCodeAt(n)}return new File([u8arr], filename, { type: mime })
}function uploadFiles(files) {let data = new FormData()data.append('file', files)uploadImg(data).then(res => {console.log(res)if (res.data.code == 0) {// formData.value.qrcode = res.data.data.res.url}})
}export default htmlToPdf;

四、使用步驟:

1. 使用之前需要先按照2個npm包

npm install html2canvas -S --registry=https://registry.npmmirror.com/
npm install jspdf -S --registry=https://registry.npmmirror.com/

2. 在頁面引用

import htmlToPdf from "@/utils/htmlToPDF";

3. 調用方法

const printReport = () => {
? ? htmlToPdf.getPdf('測試pdf',"#db-test-report");
}

4. 記得給指定容器加id

五:注意事項:

1. 如果要打印的內容是iframe里面的,因為無法直接拿到dom元素,需要跟iframe通訊,拿到dom元素,放到當前頁面;如果樣式沒帶過來,特殊處理一下

const iframe = document.getElementById("myIframe");
// 向iframe發送消息
iframe.contentWindow.postMessage("getElement", tooltipUrl.value);// 收到iframe的回復才能生成pdf
window.addEventListener("message", function (e) {console.log("iframe回復的消息");console.log(e);if (e.origin === iframeOrigin.value && e.data.type === "element") {// 處理獲取到的元素var container = document.getElementById("pdf-iframe");container.innerHTML = e.data.html;hasIframePdf = truegetPdf("xxx下載", "#pdf-xxx-xxx");}
});

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

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

相關文章

大模型LLM表格報表分析:markitdown文件轉markdown,大模型markdown統計分析

整體流程&#xff1a;用markitdown工具文件轉markdown&#xff0c;然后大模型markdown統計分析 markitdown https://github.com/microsoft/markitdown 在線體驗&#xff1a;https://huggingface.co/spaces/AlirezaF138/Markitdown 安裝&#xff1a; pip install markitdown…

Linux 第二講 --- 基礎指令(二)

前言 這是基礎指令的第二部分&#xff0c;但是該部分的講解會大量使用到基礎指令&#xff08;一&#xff09;的內容&#xff0c;為了大家的觀感&#xff0c;如果對Linux的一些基本指令不了解的話&#xff0c;可以先看基礎指令&#xff08;一&#xff09;&#xff0c;同樣的本文…

python格式化字符串漏洞

什么是python格式化字符串漏洞 python中&#xff0c;存在幾種格式化字符串的方式&#xff0c;然而當我們使用的方式不正確的時候&#xff0c;即格式化的字符串能夠被我們控制時&#xff0c;就會導致一些嚴重的問題&#xff0c;比如獲取敏感信息 python常見的格式化字符串 百…

LLaMA-Factory雙卡4090微調DeepSeek-R1-Distill-Qwen-14B醫學領域

unsloth單卡4090微調DeepSeek-R1-Distill-Qwen-14B醫學領域后&#xff0c;跑通一下多卡微調。 1&#xff0c;準備2卡RTX 4090 2&#xff0c;準備數據集 醫學領域 pip install -U huggingface_hub export HF_ENDPOINThttps://hf-mirror.com huggingface-cli download --resum…

React Hooks: useRef,useCallback,useMemo用法詳解

1. useRef&#xff08;保存引用值&#xff09; useRef 通常用于保存“不會參與 UI 渲染&#xff0c;但生命周期要長”的對象引用&#xff0c;比如獲取 DOM、保存定時器 ID、WebSocket等。 新建useRef.js組件&#xff0c;寫入代碼&#xff1a; import React, { useRef, useSt…

Spring AI 結構化輸出詳解

一、Spring AI 結構化輸出的定義與核心概念 Spring AI 提供了一種強大的功能&#xff0c;允許開發者將大型語言模型&#xff08;LLM&#xff09;的輸出從字符串轉換為結構化格式&#xff0c;如 JSON、XML 或 Java 對象。這種結構化輸出能力對于依賴可靠解析輸出值的下游應用程…

THM Billing

1. 信息收集 (1) Nmap 掃描 bashnmap -T4 -sC -sV -p- 10.10.189.216 輸出關鍵信息&#xff1a; PORT STATE SERVICE VERSION22/tcp open ssh OpenSSH 8.4p1 Debian 5deb11u380/tcp open http Apache 2.4.56 (Debian) # MagnusBilling 應用3306/tcp open …

布局決定終局:基于開源AI大模型、AI智能名片與S2B2C商城小程序的戰略反推思維

摘要&#xff1a;在商業競爭日益激烈的當下&#xff0c;布局與終局預判成為企業成功的關鍵要素。本文探討了布局與終局預判的智慧性&#xff0c;強調其雖無法做到百分之百準確&#xff0c;但能顯著提升思考能力。終局思維作為重要戰略工具&#xff0c;并非一步到位的戰略部署&a…

貪心算法 day08(加油站+單調遞增的數字+壞了的計算機)

目錄 1.加油站 2.單調遞增的數字 3.壞了的計算器 1.加油站 鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; gas[index] - cost[index]&#xff0c;ret 表示的是在i位置開始循環時剩余的油量 a到達的最大路徑假設是f那么我們可以得出 a b …

【技術派部署篇】云服務器部署技術派

1 環境搭建 1.1 JDK安裝 # ubuntu sudo apt update # 更新apt apt install openjdk-8-jdk # 安裝JDK安裝完畢之后&#xff0c;執行 java -version 命令進行驗證&#xff1a; 1.2 Maven安裝 cd ~ mkdir soft cd soft wget https://dlcdn.apache.org/maven/maven-3/3.8.8/bina…

Linux:35.其他IPC和IPC原理+信號量入門

通過命名管道隊共享內存的數據發送進行保護的bug&#xff1a; 命名管道掛掉后&#xff0c;進程也掛掉了。 6.systemV消息隊列 原理:進程間IPC:原理->看到同一份資源->維護成為一個隊列。 過程&#xff1a; 進程A,進程B進行通信。 讓操作系統提供一個隊列結構&#xff0c;…

【數據結構】紅黑樹超詳解 ---一篇通關紅黑樹原理(含源碼解析+動態構建紅黑樹)

一.什么是紅黑樹 紅黑樹是一種自平衡的二叉查找樹&#xff0c;是計算機科學中用到的一種數據結構。1972年出現&#xff0c;最初被稱為平衡二叉B樹。1978年更名為“紅黑樹”。是一種特殊的二叉查找樹&#xff0c;紅黑樹的每一個節點上都有存儲表示節點的顏色。每一個節點可以是…

2024年第十五屆藍橋杯CC++大學A組--成績統計

2024年第十五屆藍橋杯C&C大學A組--成績統計 題目&#xff1a; 動態規劃&#xff0c; 對于該題&#xff0c;考慮動態規劃解法&#xff0c;先取前k個人的成績計算其方差&#xff0c;并將成績記錄在數組中&#xff0c;記錄當前均值&#xff0c;設小藍已檢查前i-1個人的成績&…

vue2使用ezuikit-js播放螢石視頻

需求&#xff1a;需要在大屏上播放螢石視頻&#xff0c;用到官方的ezuikit-js插件實現&#xff0c;并實現視頻播放切換功能。有個問題至今沒有解決&#xff0c;就是螢石視頻的寬高是固定的&#xff0c;不會根據大屏縮放進行自適應。我這邊做了簡單的刷新自適應。 1.下載ezuikit…

愛普生TG-5510CA和TG-5510CB晶振成為服務器中的理想之選

在數字化時代&#xff0c;服務器作為數據存儲、處理與傳輸的核心樞紐&#xff0c;其性能的優劣直接影響著整個信息系統的運行效率與穩定性。從企業內部的數據中心到云計算服務提供商的大規模集群&#xff0c;服務器需要應對海量數據的高速處理與頻繁交互。而在服務器復雜精密的…

使用opentelemetry 可觀測監控springboot應用的指標、鏈路實踐,使用zipkin展示鏈路追蹤數據,使用grafana展示指標

1.安裝docker&#xff0c;docker-compose &#xff08;1&#xff09;安裝依賴包 yum install -y yum-utils device-mapper-persistent-data lvm22.2、部署dockertar xvf docker-20.10.19.tgz cp docker/* /usr/bin/vim /usr/lib/systemd/system/docker.service[Unit] Descript…

5. 藍橋公園

題目描述 小明喜歡觀景&#xff0c;于是今天他來到了藍橋公園。 已知公園有 N 個景點&#xff0c;景點和景點之間一共有 M 條道路。小明有 Q 個觀景計劃&#xff0c;每個計劃包含一個起點 stst 和一個終點 eded&#xff0c;表示他想從 stst 去到 eded。但是小明的體力有限&am…

虛幻基礎:碰撞幀運算

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄 碰撞碰撞盒線段檢測 幀運算&#xff1a;每個程序流就是一幀的計算結果速度過快時(10000)&#xff0c;導致每幀移動過大(83)&#xff0c;從而導致碰撞盒錯過而沒有碰撞速度快的碰撞要用線段檢測 碰撞 碰撞盒 線段檢…

Qt 入門 3 之對話框 QDialog

Qt 入門 3 之對話框 QDialog 本文從以下幾點分開講述&#xff1a; - 對話框的基本原理介紹 - 兩種不同類型的對話框 - 一個由多個窗口組成并且窗口間可以相互切換的程序 1.模態和非模態對話框 QDialog 類是所有對話框窗口類的基類。對話框窗口是一個經常用來完成短小任務或者…

數據結構——哈希技術及鏈地址法

目錄 一、哈希的定義 二、哈希沖突定義 三、構造哈希函數的方法 四、四種解決哈希沖突的方法 4.1 開放地址法 4.2 鏈地址法 4.3 再散列函數法 4.4 公共區溢出法 五、鏈地址法結構體設計 六、基本操作的實現 6.1 哈希函數 6.2 初始化 6.3 插入值 6.4 刪除值 6.5 查…