前端生成pdf之html2canvas+jsPDF,以及解決圖片不顯示bug

在現代網頁開發中,有時需要將網頁上的內容轉換為 PDF 檔案供使用者下載或列印。其中一個常見的方法是使用 HTML2Canvas 和 jsPDF 這兩個 JavaScript 庫來實現這一功能。本文將詳細介紹如何在前端透過這些技術生成 PDF,並解決可能出現的圖片無法顯示問題(即所謂的「bug」)。

1. 安裝與引入庫

首先需要在專案的 `package.json` 中新增對以下套件的依賴:

npm install html2canvas jspdf --save

接著,在您的腳本中引入這些模組:

// 引入 HTML2Canvas
const HTML2Canvas = require('html2canvas');

// 引入 jsPDF
var pdf = require('jspdf').default; // ES6 語法

或者如果您使用的是 CommonJS 語法:

const html2canvas = require('html2canvas');
var jsPDF = require('jspdf');

2. 設定要轉換的部分

為了確保您想要包含在 PDF 中的部分被正確捕獲,請考慮以下幾點:

  • CSS 媒體查詢:根據不同的螢幕尺寸調整樣式可能會影響元素如何在 PDF 中呈現。
  • 絕對定位元素:確保任何使用絕對定位的元件都放置在相對於其父容器可預測的位置上。
  • 透明度效果:某些背景透明的圖像可能在轉換過程中丟失資訊。
  • 事件處理程式:避免在創建 PDF 時觸發事件的函數,因為它們可能幹擾渲染過程。

3. 呼叫 HTML2Canvas 以建立畫布

HTML2Canvas 提供了一個方法來將 HTML 元素轉換為 Canvas 物件。這裡是如何使用的範例:

function convertToPdf() {
const element = document.getElementById('elementId'); // 指定要轉換的 HTML 元素
if (!element) return; // 如果沒有找到指定的元素則退出

HTML2Canvas(element, {useCORS: true}).then(canvas => {
// canvas 現在是一個從選定的 HTML 元素生成的 Canvas 實體
// 你可以在此處進行額外的操作,例如縮放比例或修改外觀

// 一旦完成所有必要的操作,準備開始轉換為 PDF
createPdfFromCanvas(canvas);
});
}

在上述程式碼中,我們使用了 `useCORS` 參數來解決跨原始資源共享的問題,這可能是導致圖片不顯示的原因之一。如果您的網站使用 CDN 等外部資源,請務必檢查 CORS 政策是否允許資料存取。

4. 使用 jsPDF 將畫布轉換爲PDF

有了 Canvas 實體後,就可以利用 jsPDF 的 API 將其轉換為 PDF 格式了。以下是基本步驟:

function createPdfFromCanvas(canvas) {
const width = canvas.width;
const height = canvas.height;
const context = canvas.getContext('2d');
let imgData = context.getImageData(0, 0, width, height);

const contentWidth = Math.round((imgData.width * imgData.height) / width);
const doc = new jsPDF({
unit: 'px',
format: [width, height],
});

doc.addImage(imgData, 'JPEG', 0, 0, width, height); // 將畫布影像添加到 PDF 中

// 在某些情況下,你可能還需要添加一些元數據或其他特定的配置
// 此處省略這些進階的設置,以便保持示例簡潔

// 最後,輸出 PDF 檔案
doc.save(`output.pdf`);
}

5. 解決圖片不顯示問題

圖片未顯示可能是由多種原因引起的,如:

  • CORS限制:確保您的伺服器支援 CORS 並且已設置適當的 HTTP 標頭。
  • 圖片的來源:確認圖片來源是有效的且可以訪問。
  • JavaScript錯誤:檢查是否有異常發生,特別是在處理圖片相關的功能時。
  • 瀏覽器兼容性:確保所用的技術(如 HTML2Canvas 和 jsPDF)在目標瀏覽器中有良好的支持。

總結來說,前端生成 PDF 是基於 JavaScript 的任務,因此瞭解 Web 應用程式的基礎架構非常重要。在執行上述步驟之前,建議先仔細檢查環境設定和網路連線狀況,以避免潛在的錯誤和延遲。此外,由於這個領域涉及到許多動態因素,因此在部署前進行充分的測試也是必不可少的。

为您推荐