用于纸张打印的 CSS
基于 CSS 的打印布局正越来越多地用于直接从 HTML 生成 PDF、书籍、标签和报告,但开发者会遇到浏览器支持不一致,以及可靠分页、页眉/页脚和高级排版等功能缺失的问题。许多人分享了各种变通方法和工具——例如 Paged.js、WeasyPrint、PrinceXML 和无头 Chrome——以便在不依赖传统桌面排版软件的情况下,对页尺寸、表格断页、页码和脚注进行精确控制。总体看法是,CSS 打印对于许多真实工作流来说已经足够强大且灵活,但仍然不够稳健,也不够标准化,尚不足以完全取代专门的排版系统或 PDF 生态。
CSS 在打印中的采用
- 很多评论者把 HTML/CSS 作为生成可打印文档的主要方式:发票、电子书、RPG 书籍、标签、网络小说、报告、简历、证书、课程书和教材。
- 提到的优势包括:快速迭代、易于模板化、可与 CMS/API/Markdown/Asciidoc 集成、源文件体积小,以及“直接用浏览器”的工作流。
- 有人表示,在长篇排版中,与 InDesign 之类的工具相比能节省大量时间,只要能接受“够用就好”的排版质量。
浏览器与引擎问题
- 跨浏览器的打印支持被描述为糟糕且不一致;有几个人只面向 Chrome。
- Chrome:对许多人来说,是打印 CSS 整体上最好的,但多页表格和打印边距仍然有 bug。
- Firefox:有报告称打印时图片或整页会消失,还有人提到一个长期存在的 bug。也有人说自己没有遇到这些问题。
- Safari:据称会忽略页面边距。
- 标签/热敏打印机:在浏览器里尤其麻烦;人们会转而使用原生应用、Electron 或打印守护进程。
工具与工作流
- 常用工具:Paged.js、WeasyPrint、PrinceXML、Flyingsaucer、wkhtmltopdf、Puppeteer/Playwright + 无头 Chrome、website2pdf、paper-css、Gutenberg、Hartija,以及 Asciidoctor web-pdf。
- Paged.js 常因实现了分页媒体特性而受到称赞(脚注、页码、运行中的页眉/页脚)。
- 一些组织禁止某些运行时(例如 Python),从而限制了生成器的选择。
排版与质量担忧
- 与专业 DTP 工具相比,CSS 打印在高级排版方面被认为要弱得多:CMYK 颜色、精细字偶距、避免“河流”、悬挂标点、语言特定规则,尤其是复杂文字脚本(例如日语)。
- 变通办法(不换行空格、letter-spacing 的 span、手工调整)被认为很取巧,而且在大规模场景下不现实。
PDF 与 Web 格式
- 有人认为“直接生成 PDF 就好”,因为浏览器内打印太不可靠。
- 也有人喜欢先 HTML 优先、再通过专门引擎渲染为 PDF 的工作流。
- 对 PDF 本身的看法两极分化:有人把它视为出色的“数字纸张”;也有人不喜欢 Adobe 的控制、表单/JS 复杂性,以及在屏幕上的分页式 UX。文中还提到 PDF/A 是一个稳定、更加合理的子集。
实用技巧与坑
- 常见模式:
@media print、用于尺寸/边距的@page、物理单位(in/mm)、用break-*规则避免标题孤行和图表被拆分、用thead/tfoot重复表头,以及通过a::after { content: " (" attr(href) ")"; }显示链接 URL。 - 要在没有分页媒体引擎或 JS 驱动布局的情况下,可靠地移除浏览器页眉/页脚,并稳定添加页码或在标题之后开始编号,仍然很棘手。