需求背景
1、網頁存檔與文檔管理
需要將網頁內容長期保存或歸檔為PDF,確保內容不被篡改或丟失,適用于法律文檔、合同、技術文檔等場景。PDF格式便于存儲和檢索。
2、電子報告生成
動態生成的HTML內容(如數據分析報告、儀表盤)需導出為PDF供下載或打印。PDF保留排版和樣式,確保跨平臺一致性。
3、電子郵件與營銷材料
將HTML格式的新聞稿、促銷內容轉換為PDF附件發送,避免收件人因郵件客戶端差異導致樣式錯亂。
4、學術與出版用途
論文、技術文檔需從HTML轉為PDF以滿足出版要求。PDF支持高精度打印,且兼容學術平臺的提交格式。
5、合同與表單簽署
在線填寫的HTML表單(如申請表格、訂單)需轉為PDF供客戶簽署或存檔。PDF支持數字簽名和加密。
方案一、wkhtmltopdf + python
https://wkhtmltopdf.org/
wkhtmltopdf 是一個開源命令行工具,通過 WebKit 渲染引擎將 HTML 內容轉換為 PDF 文件。支持 CSS、JavaScript 和復雜的頁面布局,常用于生成報告、發票、電子文檔等場景。
不推薦,實測效果不佳,2020已停止維護。
到官網下載對應操作系統的安裝包,這里是 Ubuntu24,安裝指令如下:
sudo apt-get install xfonts-75dpi
sudo dpkg -i wkhtmltox_0.12.6.1-2.jammy_amd64.deb
安裝完成之后就可以使用命令轉PDF了,例如把谷歌首頁轉PDF,也可以轉本地html文件。
# 使用示例
wkhtmltopdf http://google.com google.pdf
方案二、Puppeteer
https://github.com/puppeteer/puppeteer
Puppeteer是一個由Google Chrome團隊開發的Node.js庫,提供高級API通過DevTools協議控制無頭(Headless)或非無頭的Chromium或Chrome瀏覽器。它常用于自動化測試、網頁抓取、生成PDF或截圖等場景。
推薦方案,效果最佳,高度還原瀏覽器打印效果
pnpm install puppeteer-core# which google-chrome
/usr/bin/google-chrome
該方案需要安裝谷歌瀏覽器,可以通過 which
指令查看已安裝的 google-chrome
路徑,使用示例如下:
// main.js
const puppeteer = require('puppeteer-core');
const fs = require('fs');
const path = require('path');// 自動檢測 Chrome 安裝路徑(支持 Linux/Windows)
const CHROME_PATHS = ['/usr/bin/google-chrome', // Debian/Ubuntu 默認路徑'/opt/google/chrome/chrome', // 二進制實際位置'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'
];(async () => {try {// 自動查找可用瀏覽器路徑const executablePath = CHROME_PATHS.find(p => fs.existsSync(p));if (!executablePath) throw new Error('未找到 Chrome 瀏覽器');const browser = await puppeteer.launch({headless: 'new', // 啟用新一代無頭模式executablePath,args: ['--no-sandbox','--disable-setuid-sandbox','--disable-dev-shm-usage','--font-render-hinting=medium' // 提升中文字體渲染質量]});const page = await browser.newPage();