Html轉PDF,前端JS實現Html頁面導出PDF(html2canvas+jspdf)

Html轉PDF,前端JS實現Html頁面導出PDF(html2canvas+jspdf)

文章目錄

    • Html轉PDF,前端JS實現Html頁面導出PDF(html2canvas+jspdf)
      • 一、背景介紹
      • 二、疑問
      • 三、所使用技術
        • html2canvas+jspdf
      • 四、展示開始
        • 1、效果展示
        • 2、代碼部分
        • 3、參數說明
          • 3.1、html2canvas常用參數
          • 3.2、jsPDF常用參數
      • 五、常見問題

一、背景介紹

? 當我們在不想改變后端代碼的同時想是純html頁面導出PDF,那么(html2canvas+jspdf)就是無疑最好的選擇,導出時它不占用我們服務器的資源,而是由用戶本地自行執行js文件下載PDF,不占用我們系統的帶寬,所以這無非是最好的選擇方式。

二、疑問

1、為什么要使用html2canvas,單jspdf也能實現pdf下載?

? HTML2Canvas 和 jsPDF 是 JavaScript 庫,用于在瀏覽器中生成 PDF 文件。

? HTML2Canvas 用于將 HTML 元素渲染成圖像,可以將整個頁面或特定區域以圖像形式進行捕獲。這對于將復雜的 HTML 結構轉換為 PDF 格式非常有用,因為它可以捕獲 HTML 中的樣式、布局和圖像等細節。 jsPDF 是一個 PDF 生成庫,它允許你通過 JavaScript 代碼創建和編輯 PDF 文檔。與 HTML2Canvas 結合使用,你可以將 HTML 元素渲染成圖像,然后將圖像插入到 jsPDF 創建的 PDF 文檔中。 雖然單獨使用 jsPDF 也可以實現 PDF 下載,但是在某些情況下,使用 HTML2Canvas 可能更方便。例如,當你需要將整個頁面轉換為 PDF 或以圖像形式捕獲特定區域時,HTML2Canvas 提供了更靈活的選項。然后,你可以將 HTML2Canvas 生成的圖像插入到 jsPDF 中,進一步編輯和操作 PDF。 綜上所述,使用 HTML2Canvas 結合 jsPDF 可以更容易地將 HTML 轉換為 PDF,并提供更多靈活性和控制力。

三、所使用技術

html2canvas+jspdf

js引入:引入線上js直接使用

<!--pdf下載 -->
<script src="https://html2canvas.hertzen.com/dist/html2canvas.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script>
<!--jquery 方便后續使用jquery原生函數,可不引入-->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

四、展示開始

1、效果展示

html頁面

在這里插入圖片描述

下載成PDF

在這里插入圖片描述

2、代碼部分

js引入:

<!--pdf下載 -->
<script src="https://html2canvas.hertzen.com/dist/html2canvas.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script>
<!--jquery 方便后續使用jquery原生函數,可不引入-->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

整體流程:

  1. 先將頁面通過html2canvas轉換成圖片
  2. (jsPDF)將轉換成的圖片導出成PDF的形式
<!--pdf下載 -->
<script src="assets/js/jspdf/html2canvas.js"></script>
<script src="assets/js/jspdf/jspdf.umd.min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>$('#downloadPDF').click(function() {console.log('開始下載PDF');htmlToPdf();});function htmlToPdf() {// 獲取HTML元素const element = document.getElementById("layout-wrapper");const options = {dpi: 192,  //dpi屬性的值為192,表示圖像的分辨率scale: 2, //scale屬性的值為2,表示圖像的縮放比例。backgroundColor: "#F1F6FE"  //backgroundColor屬性的值為"#F1F6FE",表示圖像的背景顏色。};// 將元素轉換為canvas對象html2canvas(element, options).then((canvas) => {var contentWidth = canvas.width;   //獲取Canvas(上面元素id 'layout-wrapper')對象的寬度var contentHeight = canvas.height; //獲取Canvas(上面元素id 'layout-wrapper')對象的高度// 創建jsPDF對象	jsPDF = jspdf.jsPDF;  //導入jsPDF庫,用于創建PDF文件const pdf = new jsPDF('1', 'pt', [contentWidth, contentHeight]); //創建一個新的PDF對象,參數包括頁面格式('1'表示A4紙張)、單位('pt')和頁面尺寸([contentWidth, contentHeight])var pageData = canvas.toDataURL('image/jpeg', 1.0);  //將Canvas對象轉換為JPEG格式的數據,并將其存儲在pageData變量中。1.0表示圖片質量pdf.addImage(pageData, 'JPEG', 0, 0, contentWidth, contentHeight);  //將JPEG格式的圖片添加到PDF文件中,圖片的左上角坐標為(0, 0),寬度為contentWidth,高度為contentHeightpdf.save("test.pdf");});}
</script>

在這里插入圖片描述

3、參數說明
3.1、html2canvas常用參數

html2canvas 函數接受一些常用的參數,用于配置轉換后的 canvas 元素的行為和樣式。以下是一些常用的參數:

  • element: 必需參數,表示需要轉換為 canvas 的 HTML 元素。
  • widthheight: 可選參數,分別表示轉換后的 canvas 元素的寬度和高度。如果不設置這些參數,則 canvas 元素會自動調整大小以適應所包含的 HTML 元素。
  • scale: 可選參數,表示 canvas 元素的比例。默認值為 1,表示 canvas 元素會保持原始大小。
  • border: 可選參數,表示 canvas 元素的邊框寬度。默認值為 0,表示沒有邊框。
  • backgroundColor: 可選參數,表示 canvas 元素的背景顏色。默認值為 “#ffffff”,表示白色。
  • foregroundColor: 可選參數,表示 canvas 元素的前景色顏色。默認值為 “#000000”,表示黑色。
  • imageQuality: 可選參數,表示轉換后的圖像的質量。默認值為 1,表示高質量。
  • jsPDF: 可選參數,表示需要使用的 jsPDF 對象。如果不設置這個參數,則不會將 canvas 轉換為 PDF 文件。

以下是一個使用 html2canvas 函數的示例,其中包含了上述參數:

html2canvas(document.getElementById("my-element"), {width: 800,height: 600,scale: 2,border: 1,backgroundColor: "#cccccc",foregroundColor: "#000000",imageQuality: 0.9,jsPDF: pdf
}).then(function(canvas) {// 處理轉換后的 canvas 元素
});
3.2、jsPDF常用參數

jsPDF 是一個用于創建 PDF 文件的 JavaScript 庫。以下是 jsPDF 常用的參數:

  1. jsPDF('1', 'pt', [width, height]): 創建一個新的 PDF 對象,其中 '1' 表示 A4 紙張(l:豎向,p:橫向),'pt' 表示單位為 point,widthheight 分別表示頁面寬度和高度。
  2. pdf.setFont(font, size): 設置 PDF 文件的字體和大小。其中 font 表示字體名稱,如 'Helvetica''Times'size 表示字體大小。
  3. pdf.setLineWidth(width): 設置 PDF 文件的線寬。其中 width 表示線寬的像素值。
  4. pdf.drawLine(x1, y1, x2, y2): 在 PDF 文件中繪制一條直線。其中 x1y1x2y2 分別表示直線的起點和終點坐標。
  5. pdf.drawRect(x, y, width, height): 在 PDF 文件中繪制一個矩形。其中 xy 分別表示矩形左上角的坐標,widthheight 分別表示矩形的寬度和高度。
  6. pdf.drawText(text, x, y): 在 PDF 文件中繪制一段文本。其中 text 表示要繪制的文本,xy 分別表示文本的左上角坐標。
  7. pdf.save('filename.pdf'): 將 PDF 文件保存為指定的文件名。其中 'filename.pdf' 表示要保存的 PDF 文件的文件名。
  8. pdf.addImage(imageData, type, x, y, width, height): 在 PDF 文件中添加一個圖像。其中 imageData 表示圖像的數據,type 表示圖像的類型,如 'JPEG''PNG'xy 分別表示圖像左上角的坐標,widthheight 分別表示圖像的寬度和高度。
  9. pdf.rotate(angle, x, y): 旋轉 PDF 文件中的圖像或文本。其中 angle 表示旋轉的角度,xy 分別表示旋轉中心的位置。
  10. pdf.translate(x, y): 將 PDF 文件中的文本或圖像移動到指定位置。其中 xy 分別表示要移動的坐標。

五、常見問題

1、圖片跨域

解決方案:

  • 設置配置項 allowTaint: false

    canvas 的 CanvasRenderingContext2D 屬于瀏覽器的對象,如果渲染過跨域資源,瀏覽器就認定 canvas 已經被污染了 Taint:污點

  • 設置配置項 useCORS: false

    表示允許跨域資源共享,注意不能與 allowTaint 同時配置為 true

  • img 標簽中添加 crossOrigin = "anonymous"

    anonymous:如果使用這個值的話就會在請求 header 中帶上 Origin 屬性,但請求不會帶上 cookie 和客戶端 ssl 證書等其他的一些認證信息

  • 圖片服務器配置 Access-Control-Allow-Origin: *

    重要的配置項,是跨域問題的根本源泉,需要后端配合

2、截圖鋸齒

解決方案:根據設備像素比進行縮放

// 設置放大倍數
const scale = window.devicePixelRatio;

4、對 css3 支持不好

html2canvas 暫不支持的 CSS 樣式屬性:

background-blend-mode、background-clip: text、box-decoration-break、repeating-linear-gradient()、font-variant-ligatures、mix-blend-mode、writing-mode、writing-mode、border-image、box-shadow、filter、zoom、transform

解決方案:

對于一些必要的樣式,可以選擇使用圖片做兜底實現

box-shadow 可以參考 這個pr,修改源碼解決,但是,實際效果也不是太理想……

5、svg 標簽

問題原因:vue-lottie 動畫庫渲染的標簽是 svg(也可能是你自己寫的 svg 標簽)

html2canvas 對于 svg 標簽的支持也不盡人意,解決辦法同樣是用圖片做兜底

在項目中,我們是用 svg 做動畫,截圖的時候把動畫換成一張靜態圖,這樣只要設置要靜態圖的樣式,截圖效果還是可以接受的

想……

5、svg 標簽

問題原因:vue-lottie 動畫庫渲染的標簽是 svg(也可能是你自己寫的 svg 標簽)

html2canvas 對于 svg 標簽的支持也不盡人意,解決辦法同樣是用圖片做兜底

在項目中,我們是用 svg 做動畫,截圖的時候把動畫換成一張靜態圖,這樣只要設置要靜態圖的樣式,截圖效果還是可以接受的

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

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

相關文章

C語言----文件操作(一)

一&#xff1a;C語言中文件的概念 對于文件想必大家都很熟悉&#xff0c;無論在windows上還是Linux中&#xff0c;我們用文件去存儲資料&#xff0c;記錄筆記&#xff0c;常見的如txt文件&#xff0c;word文檔&#xff0c;log文件等。那么&#xff0c;在C語言中文件是什么樣的存…

threadpool github線程池學習

參考項目 https://github.com/progschj/ThreadPool 源碼分析 // 常規頭文件保護宏, 避免重復 include #ifndef THREAD_POOL_H #define THREAD_POOL_H// 線程池, 存儲線程對象; #include <vector>// 任務隊列, 雙向都可操作隊列, queue 不能刪除首個元素 #include <…

微信小程序制作-背單詞的小程序制作

微信小程序–背單詞的 好久沒有發過文章了&#xff0c;但是不代表著我不去學習了嘍&#xff0c;以下是我最近做的東西&#xff0c;前端的UI由朋友設計的&#xff0c;目前這個是前端使用的是微信小程序后端是Python的一個輕量型框架&#xff0c;FastApi&#xff0c;嗯&#xff…

MyBatis 四大核心組件之 Executor 源碼解析

&#x1f680; 作者主頁&#xff1a; 有來技術 &#x1f525; 開源項目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 倉庫主頁&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 歡迎點贊…

List 接口

1 List 接口 java.util 中的集合類包含 Java 中某些最常用的類。最常用的集合類是 List 和 Map。 List是一種常用的集合類型&#xff0c;它可以存儲任意類型的對象&#xff0c;也可以結合泛型來存儲具體的類型對象&#xff0c;本質上就是一個容器。 1.1 List 類型介紹 有序性…

06-React組件 Redux React-Redux

React組件化&#xff08;以Ant-Design為例&#xff09; 組件化編程&#xff0c;只需要去安裝好對應的組件&#xff0c;然后通過各式各樣的組件引入&#xff0c;實現快速開發 我們這里學習的是 Ant-design &#xff08;應該是這樣&#xff09;&#xff0c;它有很多的組件供我們…

計算機網絡測試題第二部分

前言:如果沒有做在線測試請自主獨立完成&#xff0c;本篇文章只作為學習計算機網絡的參考&#xff0c;題庫中的題存在一定錯誤和不完整&#xff0c;請學習時&#xff0c;查找多方書籍論證&#xff0c;獨立思考&#xff0c;如果存在疑慮可以評論區討論。查看時&#xff0c;請分清…

pytorch debug 常用工具

自動辨識圖像格式可視化 import numpy as np import matplotlib.pyplot as plt from PIL import Imagedef convert_to_numpy(image_input):"""自動檢測輸入圖像類型&#xff0c;并將其轉換為NumPy數組。"""if isinstance(image_input, np.ndarr…

7-3 Left-pad

根據新浪微博上的消息&#xff0c;有一位開發者不滿NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的開源代碼&#xff0c;其中包括一個叫left-pad的模塊&#xff0c;就是這個模塊把javascript里面的React/Babel干癱瘓了。這是個什么樣的模塊&a…

物聯網IC

物聯網IC 電子元器件百科 文章目錄 物聯網IC前言一、物聯網IC是什么二、物聯網IC的類別三、物聯網IC的應用實例四、物聯網IC的作用原理總結前言 物聯網IC的功能和特性可以根據不同的物聯網應用需求來選擇和配置,以滿足物聯網設備在連接、通信、感知和控制方面的需求。 一、物…

猜數字游戲Ⅱ

你和朋友一起玩猜數字游戲&#xff0c;你寫出一個秘密數字&#xff0c;請朋友猜這個數字是多少。朋友每猜測一次&#xff0c;你就會給他一個包含下述信息的提示&#xff1a; 猜測數字中有多少位屬于數字和確切位置都猜對了&#xff08;稱為 "Bulls"&#xff0c;公牛&…

VOL-vue 框架 文件上傳控件關于大文件上傳等待的修改

我的項目在測試voltable列表組件中對阿里云OSS做附件上傳時&#xff0c;幾十M的文件可能就會需要一段時間來上傳&#xff0c;才能有OSS的狀態和鏈接返回。 但是控件VolUpload.vue并沒有去在這方面做任何交互體驗上的控制&#xff0c;而且VolUpload.vue本身寫的幾個上傳函數都是…

SpringBoo在項目停止(服務停止/關閉退出)之后執行的方法

SpringBoo在項目停止/服務停止/關閉退出之后執行的方法 1.實現DisposableBean接口2.使用PreDestroy注解 SpringApplication會向JVM注冊一個關閉鉤子(hook)&#xff0c;以確保ApplicationContext在退出時正常關閉。 可以使用所有標準的Spring生命周期回調&#xff08;例如Dispos…

內測分發是什么?十年的前端開發者帶你了解

內測分發是軟件開發過程中的一個階段&#xff0c;特別指軟件還未完全完成或準備對外廣泛發布前&#xff0c;向一定范圍的用戶群體提供該軟件版本的測試機會&#xff0c;以便收集反饋和修復潛在的問題。在講解內測分發之前&#xff0c;我們需要明確幾個相關概念&#xff1a; 軟件…

區塊鏈媒體宣發:揭示優勢與趨勢,引領信息傳播新時代

在數字化潮流中&#xff0c;區塊鏈技術正以驚人的速度改變著傳媒行業的格局。從區塊鏈媒體宣發中獲得的種種優勢和未來的趨勢&#xff0c;不僅為企業帶來了新的推廣途徑&#xff0c;也在信息傳播領域掀起了一場革命。本文將深入探討區塊鏈媒體宣發的優勢以及未來的發展趨勢。 1…

排序算法---選擇排序

1.實現流程&#xff1a; 1. 把第一個沒有排序過的元素設置為最小值&#xff1b; 2. 遍歷每個沒有排序過的元素&#xff1b; 3. 如果元素 < 現在的最小值&#xff1b; 4. 將此元素設置成為新的最小值&#xff1b; 5. 將最小值和第一個沒有排序過的位置交換 選擇排序執行流程…

初識Ceph --組件、存儲類型、存儲原理

目錄 ceph組件存儲類型塊存儲文件存儲對象存儲 存儲過程 ceph Ceph&#xff08;分布式存儲系統&#xff09;是一個開源的分布式存儲系統&#xff0c;設計用于提供高性能、高可靠性和可擴展性的存儲服務&#xff0c;可以避免單點故障&#xff0c;支持塊存儲、對象存儲以及文件系…

【小白專用】Apache2.4+PHP8.3+MYSQL的配置

1.下載PHP和Apache 1、PHP下載 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.使用Apache作為服務器的話&#xff0c;一定要下載Thread Safe的&#xff0c;否則沒有php8apache2_4.dll這個文件&#xff0c; 如果使用IIS的請下載 NON Tread safe的 2.如果…

USB連接器

USB連接器 電子元器件百科 文章目錄 USB連接器前言一、USB連接器是什么二、USB連接器的類別三、USB連接器的應用實例四、USB連接器的作用原理總結前言 USB連接器的使用廣泛,幾乎所有現代電子設備都具備USB接口,使得設備之間的數據傳輸和充電變得簡單和便捷。 一、USB連接器是…

element-ui按鈕el-button,點擊之后恢復之前的顏色

在開發過程中, 使用el-button 按鈕點擊之后, 沒有恢復到之前的顏色, 還是保持點擊之后的顏色,需要解決這個問題, <template><div><el-button size"mini" type"primary" plain click"onClick($event)">按鈕</el-button>…