打标签这件事,网页到底该画图还是发指令
仓库要打 50×30 的物料标签,产线要打 40×30 的工序卡。前端把一切都画好了,产品问:能不能别经过浏览器那一套,直接让打印机自己画?
能,但那叫发打印指令,不叫打网页。
两种做法,先分清
| 渲染成图/PDF | 直接发 ZPL / TSPL | |
|---|---|---|
| 谁画 | 浏览器内核渲染,再交给系统 | 打印机自己的固件解析 |
| 清晰度 | 取决于渲染 DPI 和缩放 | 原生分辨率,最锐利 |
| 兼容性 | 什么牌子的机器都能打 | 只认这个方言的机器 |
| 排版能力 | HTML/CSS 全部能力 | 只能画线、字、条码、二维码 |
| 谁来写 | 前端 | 一般要会打印机指令 |
结论先给:能渲染就别发指令;打印量大、机器单一、要极限清晰度,才考虑 ZPL。
渲染这条路,网页怎么打标签
标签机在系统里就是一台普通打印机,纸张是自定义尺寸。前端只负责把 HTML 拼成标签的尺寸,剩下的交给本机客户端:
import webPrintPdf from 'web-print-pdf'
const html = `
<div style="width:50mm;height:30mm;font-family:monospace;font-size:9px;padding:1mm;box-sizing:border-box">
<div>${sku}</div>
<div>${lot}</div>
<img src="${barcodeSvg}" style="width:46mm;height:12mm" />
</div>`
await webPrintPdf.printHtml(
html,
{ width: '50mm', height: '30mm', margin: { top: '0', bottom: '0', left: '0', right: '0' } },
{ printerName: 'Zebra ZD421', paperFormat: '50 x 30 mm', scaleMode: 'noscale' },
{ action: 'print' }
)
三个参数别省:
width/height用mm,和标签纸一致paperFormat填驱动里的纸张名,不是随便写noscale——标签被缩放,条码模块宽度就变了,扫枪直接罢工
条码用矢量,别用位图
这是标签糊掉的头号原因。一张 100×100 的 PNG 放大到 46mm 宽,模块边缘全是灰,203dpi 上一打就糊。
用 SVG 或者高倍 canvas 导出。QR 也一样,容错级别别乱调,丝印标签用 M 就够。
什么时候真该上 ZPL
满足这三条再考虑:
- 机器全是 Zebra 这类认 ZPL 的,不是杂牌混用
- 一天几千张,渲染那几百毫秒开始碍事
- 标签内容简单,就是字 + 条码,不需要复杂排版
ZPL 长这样:
^XA
^PW400
^LL240
^FO20,20^A0N,28,28^FDSKU-1029^FS
^FO20,60^BY2^BCN,80,Y,N,N^FD1029A^FS
^XZ
发给打印机的方式一般是:共享端口直写、或经由支持裸指令的打印中间件。注意:不是所有本机打印方案都支持透传裸指令,选型时要先问清楚,别写完才发现只能渲染。
常见坑
| 现象 | 原因 |
|---|---|
| 标签内容整体偏下 | 驱动里标签高度含了间距,页面高度按纯内容算 |
| 每张多走一截 | 撕纸位/间隙传感器设置错 |
| 条码扫不出 | 位图放大 + 缩放,或打印浓度太浅 |
| 换卷纸后全歪 | 新卷标签尺寸和驱动里的纸张不一致 |
| 中文变方块 | 打印机固件字库没有中文,渲染路线不会有这问题 |
最后
标签是「小尺寸 + 高精度」的场景,最容易在清晰度上翻车。
先走渲染,把尺寸和 noscale 调对;真到几千张一天、机器又统一,再谈 ZPL。 顺序反了,你会在打印机手册里泡一个星期。
本文探讨网页端标签打印的两种技术路径:HTML/CSS渲染与ZPL/TSPL指令直打。重点分析适用场景——渲染适合通用性、灵活性需求,ZPL适用于Zebra等专用打印机、高吞吐量及高精度条码场景。强调矢量输出(SVG/canvas)、纸张尺寸匹配、DPI一致性等关键技术要点,并指出常见实施陷阱,如位图模糊、指令透传支持缺失等。

50

被折叠的 条评论
为什么被折叠?



