需求背景
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();