企业系统上线后,打印问题总会成为吐槽重灾区:发货单在 A4 纸上歪歪扭扭、快递面单内容超出边界、仓库标签打出来扫不了码。开发觉得委屈"浏览器打印不就这样",业务觉得崩溃"一天几百张单打错几十张"。打印这件看似边缘的小事,在仓储物流环节是实打实的生产力。
核心矛盾是:打印的难点不在"打出来",而在"格式精确、批量高效、设备多样",渲染发生在哪一端、用什么方式输出,决定了精度、效率和可维护性的平衡点。 业界有三条主流路线:浏览器打印、服务端生成 PDF、标签指令直发,精度和适用场景逐级分化。
原理: 最朴素的方式:用 HTML+CSS 排版单据页面,调浏览器的打印功能(window.print)输出。CSS 用 @media print 控制打印样式,隐藏页面元素只留单据内容。
优点:
缺点:
适用场景: 打印量小(每天几十张以内)、格式要求不苛刻的内部单据:审批单、内部流转单。正经的发货面单和标签不要走这条路。
原理: 在服务端用模板引擎生成 PDF:数据填充到预定义的 PDF 模板(iText、wkhtmltopdf、Puppeteer 无头浏览器、各家报表引擎),生成标准化 PDF 文件供下载打印,或直接推送到打印机。批量场景下把成百上千张单合并成一个 PDF 任务异步生成。
优点:
缺点:
适用场景: 打印量大、格式固定、需要存档的单据:发票、合同、发货单、对账单。企业系统单据打印的主力方案。
原理: 绕过操作系统的打印体系,直接向标签打印机发送指令:ZPL(斑马)、TSPL(TSC)、EPL 等打印机原生语言,文本指令描述"在哪个坐标画什么内容",通过网口或串口直发设备。打印内容是精确到点的指令,不经过任何渲染层。
优点:
缺点:
适用场景: 仓储物流的标签类打印:面单、库位码、物料标签、合格证。日均几百张以上的标签场景,这是唯一靠谱的路线。
打印对象 | 推荐方案 |
|---|---|
内部单据、量小、格式随意 | 浏览器打印 |
发票合同发货单、量大要归档 | 服务端生成 PDF |
面单标签、量大、要条码精度 | 标签指令直发 |
仓储系统的常见组合 | 单据走 PDF + 标签走指令直发 + 打印队列统一调度 |
实战中仓储系统的标配是双轨:业务单据走服务端 PDF(要存档、格式复杂),标签面单走指令直发(要速度、要精度),统一接一个打印队列做任务调度与失败重打。
第一件:先摸清打印现场。 谁在什么场景打印、用什么设备、日均多少张、打错的代价是什么。发货高峰期打不出面单的代价和内部审批单打歪的代价,完全不是一个量级,方案跟着场景走。
第二件:打印要做成服务而非页面功能。 打印任务队列、失败重打、设备状态监控、模板版本管理,打印是仓储的命脉环节,要按生产系统的标准做可用性,而不是页面上挂个按钮。
第三件:条码质量要专项验收。 打印出来的条码必须过扫码枪实测:等级、对比度、静区(留白)都要验。太多项目栽在"看着能打出来",结果条码等级不达标,下游分拣设备扫不了。
打印方案的核心不是"能不能打",而是"在什么量级、什么精度要求下稳定地打"。浏览器打印解决有无,服务端 PDF 解决标准与批量,指令直发解决速度与精度。打印量在涨、设备在加的企业,早点把打印从"页面功能"升级成"打印服务",仓储效率会感谢这个决定。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。