zplCloud Blog
在任意标签打印机上打印 ZPL:TSC、Honeywell、SATO、Brother、Toshiba 等
你的标签是 ZPL,但并非每台打印机都是 Zebra。本文介绍如何在使用 TSPL、DPL、SBPL、EPL2、CPCL、ESC/POS、Brother 光栅、PCL、Easy Plug、TPCL 或 JScript 的打印机上打印完全相同的标签——输出为 PNG、PDF,或发往端口 9100 的原始作业。
一张标签,十一种打印机语言
ZPL 是使用最广泛的标签语言,而它是为 Zebra 打印机设计的。只要仓库里全是 Zebra,这就没有问题。可现实往往是:一台 TSC 打印机因为报价更便宜被买了进来,邻国的工厂用的是 SATO,包装区每张桌子上都放着一台 Brother QL,自动贴标产线装的是 Avery Dennison 或 Novexx 的打印头,退货标签则用办公室的激光打印机打印。然而标签只有一份:由 ERP、网店或 zplCloud 设计器生成的 ZPL。
本指南介绍如何把这一份 ZPL 标签打印到所有这些打印机上——逐点完全一致——以及需要注意哪些事项。
让不支持 ZPL 的打印机打印 ZPL 的三种方法
1. 仿真。 许多厂商提供 ZPL 仿真:Honeywell ZSim、SATO SZPL、Godex GZPL、Citizen Cross-Emulation,以及 TSC 和 cab 的 ZPL 模式。简单的标签用它没有问题。但对于其他所有标签,仿真不过是别人对 ZPL 的重新实现:字体度量、条码宽度、^FB 字段中的文本换行、^GFA 图形和存储字体的表现都会略有差异,最终你不得不在每个型号上测试每个模板。
2. 转换命令。 转换器把 ^FO…^A0…^FD 改写为另一种语言的文本和条码命令。这只对有对应命令的指令有效,而且打印机随后使用的是它自己的字体和它自己的条码生成器。结果相似,但并不相同。
3. 发送图像。 标签按目标打印机的分辨率渲染一次,然后通过该打印机自身的图形命令以单色位图发送。每种打印机语言都有这样的命令。打印机不再解释任何内容——它只负责打印点。字体、Unicode、徽标和条码都与预览完全一致。
zplCloud 采用第三种方法,并提供两种形式:对所有带驱动程序的设备,输出为图像文件;对网络上的所有设备,输出为该打印机语言的原始作业。
方式 1:PNG、JPG 或 PDF
对于办公打印机、电子邮件附件和归档,标签直接变成一个文件:
- ZPL 转 PDF 可以每张标签渲染为一页,也可以把标签按原始尺寸排列在带裁切线的 A4 或 Letter 纸张上——这是用办公室激光打印机打印退货标签最快的方式。
- ZPL 转 PNG 和 ZPL 转 JPG 以 203、300 或 600 dpi 渲染单张标签,例如供通过驱动程序打印的网店系统使用。
无论用什么打印这个文件,打印出来的都是同一张图像。这种方式的局限在于中间的驱动程序:它会缩放、会添加边距,而且需要一台电脑。
方式 2:以位图形式使用打印机自身的语言
网络上的标签打印机不需要驱动程序。打印机工具及对应的 API 端点会生成可直接发送到 TCP 端口 9100 的完整作业:
1. 渲染。 zplCloud 引擎按目标打印头的分辨率绘制每个 ^XA…^XZ 标签——不做抗锯齿,与热敏打印头的打印方式一致。一个点宽的线条始终正好是一个点宽。
2. 降为 1 位。 每个点非黑即白。
3. 封装。 位图被放入目标语言的图形命令中,并附上作业打印所需的少量命令。
4. 发送。 文件原样发送到打印机的 9100 端口。
| 打印机 | 语言 | 工具 | 图像命令 | 压缩 |
|---|---|---|---|---|
| TSC、Printronix T 系列 | TSPL | ZPL 转 TSPL | BITMAP | PCX(DOWNLOAD + PUTPCX) |
| Honeywell、Datamax-O'Neil | DPL | ZPL 转 DPL | <STX>I + 图像字段 | 始终为 PCX |
| SATO | SBPL | ZPL 转 SBPL | ESC GB / ESC GH | PCX(ESC GP) |
| Zebra EPL 打印机 | EPL2 | ZPL 转 EPL2 | GW | - |
| Zebra 和 Honeywell 移动打印机 | CPCL | ZPL 转 CPCL | CG / EG 条带 | PCX(PCX) |
| Epson TM、Star、Bixolon | ESC/POS | ZPL 转 ESC/POS | GS v 0 | - |
| Brother QL、TD-4、P-touch | Brother 光栅 | ZPL 转 Brother 光栅 | 光栅行 | TIFF PackBits |
| HP LaserJet 及 PCL 激光打印机 | PCL 5 | ZPL 转 PCL | ESC*b#W | TIFF PackBits |
| Avery Dennison、Novexx | Easy Plug | ZPL 转 Easy Plug | #YIB | RLE(#YIR) |
| Toshiba Tec | TPCL | ZPL 转 TPCL | {SG;…} | TOPIX |
| cab | JScript | ZPL 转 JScript | 图像上传 + I 字段 | PCX |
每个作业都遵循厂商的编程手册。每种语言都经过测试:把生成的作业解码回位图,结果必须与渲染出的标签逐点一致——测试也包括 Toshiba TOPIX 文档和 Novexx RLE 文档中的示例。
一张图像需要多少数据?
图像比 ZPL 大。以下是一张典型货运标签的真实数据:100 × 150 mm、203 dpi(812 × 1,218 点),包含文本、DataMatrix、QR 码、GS1-128 条码,以及一行日文、俄文和阿拉伯文文本:
| 作业 | 未压缩 | 压缩后 |
|---|---|---|
| ZPL 源码(作为对比) | 859 字节 | - |
| TSPL | 121 KB | 52 KB(PCX) |
| EPL2 | 121 KB | - |
| SBPL | 122 KB | 52 KB(PCX) |
| DPL | - | 52 KB(PCX) |
| CPCL | 81 KB(跳过空白行) | 52 KB(PCX) |
| JScript | 124 KB(BMP) | 52 KB(PCX) |
| Brother 光栅,TD-4420DN | 128 KB | 45 KB(TIFF) |
| PCL,300 dpi | 64 KB(跳过空白行) | 44 KB(TIFF) |
| Easy Plug | 121 KB | 16 KB(RLE) |
| TPCL | 121 KB | 9.5 KB(TOPIX) |
有三点值得注意:
- 未压缩时约为每点 1 位。 无论哪种语言,812 × 1,218 点都是 121 KB。
- 参考相邻行的压缩更胜一筹。 PCX 和 PackBits 只在单行内压缩。Toshiba 的 TOPIX 只发送与上一行相比发生变化的字节,Easy Plug 的 RLE 则会重复相同的行——而标签中这两种情况都很多。
- 在有线网络上几乎无关紧要。 在 100 Mbit 以太网上传输 121 KB 约需 10 ms。压缩的价值体现在 Wi-Fi 和蓝牙、成千上万张标签的批量打印,以及接收缓冲区较小的打印机上。
网站工具会显示每个作业的大小;开启压缩后,还会显示节省了多少。
分步操作
在网站上,无需账户:
1. 打开对应你打印机的工具,例如 ZPL 转 TSPL。
2. 粘贴 ZPL,或打开 .zpl 文件。
3. 选择打印机的分辨率(203、300 或 600 dpi;Brother 则选择型号)。
4. 按需开启压缩,然后转换。
5. 检查预览——它显示的正是将要发送的点——然后下载作业。
6. 发送到打印机:
# Linux / macOS
nc -q 1 192.168.1.50 9100 < label.tspl
# Windows PowerShell
$c = [Net.Sockets.TcpClient]::new('192.168.1.50', 9100)
$b = [IO.File]::ReadAllBytes("$PWD\label.tspl")
$c.GetStream().Write($b, 0, $b.Length); $c.Close()
通过 API,集成到你自己的软件中:每个工具都是 api.zplcloud.com 上的一个端点 POST /v1/tools/zpl-to-<language>。响应就是原始作业:
jq -Rs '{zpl: ., dpi: 203, compress: true}' label.zpl \
| curl -X POST https://api.zplcloud.com/v1/tools/zpl-to-tpcl \
-H "X-API-Key: $ZPLCLOUD_API_KEY" -H "Content-Type: application/json" \
--data-binary @- -o label.tpcl
nc -q 1 192.168.1.60 9100 < label.tpcl
包含多张标签的文件会生成一个含多张标签的作业;响应头 X-ZplCloud-Label-Count 会告诉你标签的数量。所有字段以及每种语言的具体命令,请参阅 API 参考。
日常打印:zplCloud CLI、监视文件夹和远程打印机
nc 用来测试没有问题。在日常打印中,免费的 zplCloud CLI 会处理好这类作业最关键的一点:它们包含二进制图像数据,必须逐字节原样到达打印机 - 不做文本编码,也不在末尾添加换行符。CLI 可以通过网络、通过 USB、从监视文件夹,以及经由其代理向其他网络中的打印机做到这一点。
发送已生成的作业 - 无需账户:
zplcloud send --target 192.168.1.50 --file label.tspl
zplcloud send --usb --file label.bin # USB 连接的 Brother QL
CLI 能识别各工具使用的文件扩展名(.tspl、.epl、.dpl、.sbpl、.cpcl、.escpos、.bin、.pcl、.ezp、.tpcl、.jscript),并原样发送;对于其他任何文件,--raw 可以实现同样的效果。
一步完成转换和发送 - CLI 会替你调用 API:
zplcloud send --target 192.168.1.50 --file label.zpl --language tspl --dpi 300 --compress
监视文件夹:ERP 照常写入 ZPL。 代理(zplcloud proxy)监视一个文件夹,并在打印前把每个 ZPL 文件转换为打印机的语言。生成标签的软件完全不需要改动 - 它仍然写入 ZPL 文件,而 TSC 打印机收到的是 TSPL:
{
"name": "tsc-shipping",
"enabled": true,
"folder": "/labels/tsc",
"pattern": "*.zpl",
"targetHost": "192.168.1.50",
"convert": { "language": "tspl", "dpi": 300, "compress": true }
}
远程打印机:从云端到另一个网络中的打印机。 代理与 zplCloud 保持一条出站连接,因此无需开放端口,就能访问另一个仓库、门店或客户处的打印机。你的软件只需调用一个端点 - 传入已生成的作业,或者传入 ZPL 和语言:
curl -X POST https://api.zplcloud.com/v1/remote-printers/4/raw \
-H "X-API-Key: $ZPLCLOUD_API_KEY" -H "Content-Type: application/json" \
-d '{"zpl": "^XA^FO50,50^A0N,40,40^FDHello TSC^FS^XZ", "language": "tspl", "dpi": 203}'
代理通过 TCP 9100 或 USB 转发作业,并回报作业是否已送达。
| 作业发往何处 | 命令或端点 |
|---|---|
| 本地网络中的打印机 | zplcloud send --target <ip> --file label.tspl |
| USB 打印机 | zplcloud send --usb --file label.bin |
| 来自 ERP、网店或物流承运商软件的 ZPL 文件 | 使用 "convert": { "language": "tspl" } 的监视文件夹 |
| 另一个网络中的打印机 | POST /v1/remote-printers/{id}/raw 或 zplcloud send --remote-printer <id> |
| 通过 API 使用监视文件夹 | POST /v1/print/folder,带 language 或 base64 |
CLI 和代理需要 1.2.26 版或更高版本;旧版本会把每个文件当作文本读取,从而破坏图像数据。通过 TCP 连接的打印机,自 1.2.22 版起的代理即已支持。
需要注意的事项
- 分辨率必须匹配。 按 203 dpi 渲染的标签在 300 dpi 打印机上打印出来,会小约三分之一。工具只提供真实打印头具有的分辨率,因此尺寸保持 1:1——请选择你的打印机的分辨率。
- 介质设置保留在打印机中。 作业有意不覆盖打印机中已保存的间隙、传感器或黑标设置。像处理其他任何作业一样,把打印机按标签尺寸设置一次即可。
- 条码的扫描效果与原版相同。 位图条码的宽度与 ZPL 生成时完全相同,因为条本来就是由整数个点组成的。但这只在分辨率正确时成立——这也是要选择打印机 dpi 的又一个理由。
- 每个型号先打印一张测试标签。 不同固件版本在细节上存在差异:如何读取 PCX 图像、Easy Plug 打印机上的图像原点、Toshiba 的碳带设置。工具会在每个作业旁显示这些说明。
- Brother 需要指定型号。 打印头宽度、边距和介质数据来自 Brother 的命令参考;标签会居中放在能容纳它的最窄介质上。P-touch 标签带打印机沿标签带的横向打印。
- 如果打印机原生支持 ZPL,就发送 ZPL。 ZPL 更小,打印机也能使用自己的字体。位图方式适用于不支持 ZPL 的打印机,或者“几乎一致”还不够好的标签。
什么情况下仿真就够用?
如果标签只有几行拉丁文字和一个 Code 128,并且打印机带有 ZPL 仿真,不妨先试试仿真。一旦涉及 Unicode 文本、TrueType 字体、徽标、^FB 文本块或混合打印机群,位图就是更稳妥的选择:一次渲染,一个结果,适用于每台打印机。
常见问题
打印机需要特殊固件吗?
不需要。作业只使用每种语言的标准图形命令,该系列的每台打印机都能识别。
条码还能扫描吗?
能。条码由 zplCloud 引擎按精确的点宽绘制,并逐点打印。如果想确认,可以用检查条码进行检验。
文本在打印机上还是文本吗?
不是。打印机收到的是一张图像。这正是目的所在——打印机上的任何字体都无法改变版式——但这也意味着打印机无法自行填充计数器或字段。请改为每条数据记录渲染一张标签;对于包含多张标签的文件,API 一次调用即可完成。
我们的软件只能写入 ZPL 文件。它还能在 TSC 或 Brother 打印机上打印吗?
能。把它指向 zplCloud 代理的一个监视文件夹,并设置 "convert": { "language": "tspl" }(或 brother、dpl …)。代理会在打印前转换每个文件,软件完全不会察觉打印机不是 Zebra。
180 dpi 打印机怎么办?
只要有这类机型,就提供支持:Epson TM-T88 系列的 180 dpi ESC/POS,以及 180 和 360 dpi 的 Brother P-touch 型号。
免费吗?
网站工具免费且无需账户,匿名使用有合理使用限制。通过 API 使用时,每张标签计为一次渲染;请参阅价格。
用你自己的标签试试: 在工具中选择你的打印机,粘贴 ZPL,然后把结果发送到端口 9100。如果你管理着混合打印机群,zplCloud 平台会把设计集中保存在一处——而打印机工具确保每台打印机都拿到同一张标签。