zplCloud Blog
SVG 转 TTF:用打印机字体替代沉重图形
^A@N,50,50,E:MYICONS.TTF——每张标签只需一个字形引用,取代 10 KB 的 ^GFA 数据块。
一张图形在每张标签上的代价
大多数标签带有 logo 或一组象形图。默认做法是把每个导出为栅格图像,作为 ^GFA 块嵌入 ZPL。它能工作,但同时在三个方面代价高昂。
负载。 ^GFA 是单色位图,每点一位,以十六进制传输。数学很简单:
字节 ≈ (宽_dots × 高_dots) / 8 × 2 (÷8 = 位→字节, ×2 = 十六进制编码)
一个 200 × 200 dots 的中等 logo——203 dpi 下约 25 × 25 mm——是 200 × 200 / 8 = 5 000 字节位图,数据流中约10 000 个字符的十六进制。每张标签都是如此。同样覆盖相同物理面积的 300 dpi logo 是 295 × 295 dots ≈ 21 800 字符。
质量。 位图固定在其生成时的分辨率。打印得更大,或把设计移到 300 或 600 dpi 打印机,就会被重采样——恰好在你代表品牌的元素上出现软边。
速度。 打印机在每张标签上接收、解码并栅格化图形。文本它直接画。
字体是打印机已经会画的字形库
SVG → TTF 编辑器接收你的 SVG 图标并构建一个 TrueType 字体。每个图标成为私有使用区码点上的字形(U+E000、U+E001、…)——正是为此保留的 Unicode 范围。
该字体被上传到打印机 flash 一次,例如作为 E:MYICONS.TTF,从设计器的 Zebra Fonts 选项卡。之后标签引用一个字形:
^XA
^FO50,50^A@N,50,50,E:MYICONS.TTF^FD^FS
^XZ
注意参数顺序:^A@ 接受方向、高度、宽度,然后是字体路径。^A@N,E:MYICONS.TTF - 方向后直接跟路径 - 不是有效的 ZPL;打印机会回退到默认字体,你会花一个下午想不通为什么图标成了字母。
字体驻留后,同一标签中后续字段可将 ^A@N,50,50,E:MYICONS.TTF 缩短为 ^A@N,50,50——打印机保持最后一次 ^A@ 字体选择。
数字,附声明的前提
^GFA 图像 | TTF 打印机字体 | |
|---|---|---|
| 前提 | 200 × 200 dot 图标,单色,十六进制编码 | 3 字形字体,~3 KB |
| 每张标签 | ≈ 10 000 B | ≈ 125 B(带一个字形的单字段) |
| 上传 | 随每张标签 | 一次,~3 KB 总计 |
| 10 000 张标签 | ≈ 100 MB | ≈ 1.25 MB + 3 KB |
| 100 000 张标签 | ≈ 1 GB | ≈ 12.5 MB + 3 KB |
对那个元素而言,传输字节减少 80×。在 115 200 波特串行链路或繁忙的 Weblink 隧道上,这种差别就是队列排空与队列增长之间的差别。
缩放是免费的:同样的字形在 ^A@N,20,20 或 ^A@N,120,120 中由打印机字体引擎从矢量轮廓渲染——在 203、300 和 600 dpi 下都清晰。
Flash 有限 - 上传前检查
打印机内存并不宽裕,尤其是较老的桌面机型。GK420 总共只有几 MB。推字体前,先了解大小:
- 少量字形的图标字体:个位 KB。从不是问题。
- 完整 Unicode 文本字体是另一回事——ZPLCloud Unicode 字体 11 MB,其 slim 变体 7 MB。它们放不进 GK420,是为有真正 flash 的打印机准备的。
- 在全面铺开前用
! U1 getvar "memory.flash_free"查询可用空间。
工作流
1. 把 SVG 拖进 SVG → TTF 编辑器。每个成为 PUA 码点上的字形;编辑器显示分配(U+E000 起)。
2. 构建字体并上传到你选择的打印机——一次操作,整支车队。
3. 在设计器中打开图标库,把图标拖到画布上。它作为字形元素落地,已绑定正确的码点和字体路径。无需手输十六进制码,无需维护 ^GF 块。
新图标或改动的 logo 是同样的三步:重建字体、推送、完成。标签设计不变——它们引用码点,而码点现在绘制新图形。
什么时候图形仍是正确答案
字体是单色轮廓。以下情况用 ^GFA:
- 照片、渐变或任何带灰度的内容(热敏打印机反正会抖动处理),
- 每张标签都变化的一次性图形——每批货一张地图、签名图像,
- 你收到的位图且无法干净矢量化的图形。
对于 logo、危险符号、运输象形图和重复出现的 UI 图标——标签上实际内容的大多数——字体路径更小、更清晰、更快。
能干净转换的 SVG
转换把 path 变成字形轮廓。两条规则省时间:
- 导出 SVG 前把描边转为轮廓。字形是填充形状;1 px 描边对字体引擎没有粗细。
- 把文本扁平化为 path。 SVG 内的文本元素依赖转换器没有理由拥有的字体。