浏览器打印导出PDF是导出表格最省事且样式最完整的方法,支持CSS分页、@media print、表头重复及页眉页脚,无需代码;操作为按Ctrl+P/Cmd+P,选Save as PDF,勾选Background graphics,边距设为None,并确保JS渲染内容加载完成后再打印。

直接用浏览器打印功能导出表格 PDF 最省事、样式保留最完整,绝大多数场景下不用写一行代码。
浏览器打印导出 PDF(推荐首选)
这是唯一能原生支持 CSS 分页、@media print、表头重复(<thead>)、页眉页脚的方案,且不触发跨域、不污染 canvas、不依赖任何库。
- 打开含表格的页面后按
Ctrl+P(Windows/Linux)或Cmd+P(macOS) - 在「目标」或「打印机」下拉菜单中选
Save as PDF(不是Microsoft Print to PDF) - 务必勾选
Background graphics,否则background-color和border会丢失 - Margin 设为
None或Minimum,避免表格被截断;Chrome 需点「更多设置」展开后调整 - 若表格含 JS 渲染内容(如 Vue/React 表格),请等数据完全加载后再触发打印,否则导出空白
jsPDF + html2canvas 截图导出(适合按钮触发场景)
本质是把 DOM 渲染成 Canvas 图片再塞进 PDF,不是真正解析 HTML/CSS,所以分页、伪元素、transform、position: fixed 全都不支持。
使用 Puppeteer + Chrome 将 HTML 渲染为中文 PDF,自动处理图表等待、Tab 展开、动画、测高、白边消除、防分页,适用于看板、报表、网页和交互图表转 PDF。
-
html2canvas必须先于jspdf.umd.min.js加载,否则报jsPDF is not defined - 不要对
document.body截图——滚动条位置、固定定位元素会错位;应限定区域,例如document.getElementById('export-area') - 必须加
scale: 2参数,否则文字模糊;useCORS: true可尝试加载同域图片,但跨域图仍会失败 - 长表格会被压缩进单页或截断;如需分页,得手动切 DOM 高度、多次调用
addPage(),无自动逻辑 - 中文显示方块?
jsPDF默认不嵌入中文字体,必须用addFont()加载 TTF 并setFont(),否则白费力气
wkhtmltopdf 命令行批量生成(服务端稳定首选)
它用 WebKit 引擎真实渲染 HTML,支持 @media print、page-break-before、页眉页脚、中文字体,适合定时任务或后台导出。
立即学习“前端免费学习笔记(深入)”;
- Linux 服务器执行时报
QXcbConnection: Could not connect to display?加--no-xserver或用xvfb-run wkhtmltopdf ... - 中文乱码?确认系统已安装中文字体,并用
fc-list :lang=zh检查是否被识别;或显式传--font-family "Noto Sans CJK SC" - HTML 里用了
./style.css这类相对路径?加--enable-local-file-access(仅限可信环境),或提前转为绝对路径 - 内容被压缩在 A4 第一页?加
--zoom 1.0或改--page-width 210mm --page-height 297mm,避免默认缩放 - 命令示例:
wkhtmltopdf --margin-top 20 --margin-bottom 20 --page-size A4 index.html report.pdf
真正麻烦的从来不是“怎么导出”,而是“导出后表格跨页时表头不重复”“中文字符缺字”“动态图表没渲染完就截图”——这些细节不提前验证,上线后用户一导就崩。


















