浏览器打印功能是最简单可靠的html→pdf方式,需勾选background graphics、设置landscape模式并关闭页眉页脚;wkhtmltopdf适合服务端批量转换,注意添加--no-stop-slow-scripts等参数;weasyprint更适配python生态,纯python实现且中文友好;window.print()仅唤起打印对话框,无法编程控制pdf输出。

浏览器打印功能是最简单可靠的 HTML → PDF 方式
绝大多数现代网页,只要没用到严重依赖 JS 渲染的单页应用(如 React/Vue 路由未预加载),用浏览器原生「打印为 PDF」就能保留样式、图片、分页和中文显示——它调用的是系统级 PDF 生成器,稳定且零配置。
- Chrome / Edge / Firefox:打开页面后按
Ctrl+P(Windows)或Cmd+P(macOS),打印机选Save as PDF,点「保存」即可 - 关键设置别跳过:
Background graphics必须勾选,否则 CSSbackground-color和背景图全丢 - 若页面有横向表格或宽图,记得在「更多设置」里切到
Landscape(横向)模式,否则内容被截断 - 页眉页脚默认会带网址和页码,不想要?点「更多设置」→ 关掉
Headers and footers
wkhtmltopdf 是服务端批量转换的主力工具
当你需要自动化导出、定时生成报告、或集成进 Python/Node.js 后端时,wkhtmltopdf 仍是目前最成熟的选择——它本质是封装了 QtWebEngine 的命令行工具,渲染效果接近 Chrome。
- 安装后直接运行:
wkhtmltopdf https://example.com report.pdf,也支持本地 HTML 文件:wkhtmltopdf index.html output.pdf - 常见坑:
--no-stop-slow-scripts必加,否则含长循环或卡顿 JS 的页面会超时失败;--javascript-delay 2000可等 JS 渲染完再截图 - 中文乱码?不是字体问题就是没指定:
--encoding utf-8 --outline-depth 3,并确保系统已安装 Noto Sans CJK 或思源黑体 - 注意:它不支持现代 CSS @layer / :has() 等新特性,复杂布局建议降级兼容写法
Python 用 weasyprint 比 pdfkit 更省心
如果你在写 Python 脚本生成报表、邮件附件或内部文档,weasyprint 是比 pdfkit(封装 wkhtmltopdf)更轻量、更可控的选择——纯 Python 实现,无外部二进制依赖,CSS 支持度更高,对中文排版更友好。
- 安装:
pip install weasyprint,一行代码就能转:WeasyPrint('input.html').write_pdf('output.pdf') - 它默认不执行 JS,所以动态内容要先用 requests + BeautifulSoup 静态化,或改用 playwright 预渲染再喂给 weasyprint
- 支持
@page规则控制页边距、页码,比如在 HTML 里写@page { margin: 2cm; }就生效 - 性能上比 wkhtmltopdf 略慢,但稳定性高;100 页以内的文档基本无压力
前端用 window.print() 不等于导出 PDF
很多人以为在网页里加个 window.print() 就能“导出 PDF”,其实这只是唤起浏览器打印对话框——最终是否生成 PDF、格式是否正确,完全取决于用户操作和系统设置,无法编程控制输出路径、文件名或静默保存。
立即学习“前端免费学习笔记(深入)”;
- 真要前端一键下载 PDF,得用
jsPDF+html2canvas组合,但这是把整个页面截图成 Canvas 再塞进 PDF,文字不可选、放大失真、分页难控 - 链接失效、表格错位、固定定位元素偏移……都是常见现象,尤其在 Safari 和旧版 Edge 上
- 除非是极简卡片类页面,否则不推荐走纯前端截图路线;业务关键文档务必走服务端生成










