预览时应使用Chrome/Edge打印预览(Ctrl+P→另存为PDF)模拟PDF输出,因其最贴近puppeteer/wkhtmltopdf;需加viewport meta、避免fixed/transform布局、用puppeteer显式设A4尺寸与页边距,并处理异步资源。
直接在浏览器里打开 index.html 看到的样式,和最终转成 PDF 的结果常常不一致——比如分页错乱、字体缺失、@media print 未生效、CSS Flex/Grid 布局塌陷。预览阶段就要用「接近 PDF 输出引擎」的方式看,而不是依赖普通浏览器渲染。
Ctrl+P → 选择“另存为 PDF”)最贴近 puppeteer 或 wkhtmltopdf 的输出逻辑,优先用它验证布局和分页,否则打印预览可能缩放异常position: fixed 或 transform 做关键布局,PDF 引擎对这些支持不稳定,预览时就能发现内容消失或错位puppeteer 是目前最可控的 HTML→PDF 方案,它复用 Chromium 内核,所以你在打印预览里看到的,基本就是 page.pdf() 输出的。
npm install puppeteer(会自动下载 Chromium,首次运行较慢)await page.pdf({
format: 'A4',
printBackground: true,
margin: { top: '20px', right: '20px', bottom: '20px', left: '20px' },
preferCSSPageSize: false // 必须设为 false,否则忽略 format 和 margin
});await page.waitForNetworkIdle({ timeout: 5000 });,否则 PDF 里留白或占位符wkhtmltopdf 轻量但老旧,不支持现代 CSS(如 grid、aspect-ratio),且在 macOS M 系列或新 Linux 发行版上常因 Qt 版本问题崩溃。错误信息类似:QXcbConnection: Could not connect to display。
--no-xserver-clipboards --enable-local-file-access 参数解决常见权限和路径问题@font-face 显式加载,不能依赖 font-family: "Helvetica" 这类通用名playwright(API 类似 puppeteer,但更新快、多浏览器支持更好)或服务化方案如 pdfshift(适合无服务端环境)PDF 引擎只认部分 CSS,且对 @media print 解析比浏览器更严格。不要把屏幕样式和打印样式混写在一个选择器里。
page-break-before: always 或 break-before: page(后者是新标准,puppeteer 已支持)@media print { .nav, .btn { display: none; } },别用 visibility: hidden,它仍占空间table { break-inside: avoid; } 和 tr { break-inside: avoid; } 可缓