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 的原始作业。

4 分钟阅读 zplCloud Team

一张标签,十一种打印机语言

一张 ZPL 货运标签只渲染一次为位图,再以各自的打印机语言发送到 TSC、Honeywell、SATO、Brother、Toshiba Tec、cab 和 Avery Dennison 打印机

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 转 PNGZPL 转 JPG 以 203、300 或 600 dpi 渲染单张标签,例如供通过驱动程序打印的网店系统使用。

无论用什么打印这个文件,打印出来的都是同一张图像。这种方式的局限在于中间的驱动程序:它会缩放、会添加边距,而且需要一台电脑。


方式 2:以位图形式使用打印机自身的语言

网络上的标签打印机不需要驱动程序。打印机工具及对应的 API 端点会生成可直接发送到 TCP 端口 9100 的完整作业:

1. 渲染。 zplCloud 引擎按目标打印头的分辨率绘制每个 ^XA…^XZ 标签——不做抗锯齿,与热敏打印头的打印方式一致。一个点宽的线条始终正好是一个点宽。

2. 降为 1 位。 每个点非黑即白。

3. 封装。 位图被放入目标语言的图形命令中,并附上作业打印所需的少量命令。

4. 发送。 文件原样发送到打印机的 9100 端口。

打印机语言工具图像命令压缩
TSC、Printronix T 系列TSPLZPL 转 TSPLBITMAPPCX(DOWNLOAD + PUTPCX
Honeywell、Datamax-O'NeilDPLZPL 转 DPL<STX>I + 图像字段始终为 PCX
SATOSBPLZPL 转 SBPLESC GB / ESC GHPCX(ESC GP
Zebra EPL 打印机EPL2ZPL 转 EPL2GW-
Zebra 和 Honeywell 移动打印机CPCLZPL 转 CPCLCG / EG 条带PCX(PCX
Epson TM、Star、BixolonESC/POSZPL 转 ESC/POSGS v 0-
Brother QL、TD-4、P-touchBrother 光栅ZPL 转 Brother 光栅光栅行TIFF PackBits
HP LaserJet 及 PCL 激光打印机PCL 5ZPL 转 PCLESC*b#WTIFF PackBits
Avery Dennison、NovexxEasy PlugZPL 转 Easy Plug#YIBRLE(#YIR
Toshiba TecTPCLZPL 转 TPCL{SG;…}TOPIX
cabJScriptZPL 转 JScript图像上传 + I 字段PCX

每个作业都遵循厂商的编程手册。每种语言都经过测试:把生成的作业解码回位图,结果必须与渲染出的标签逐点一致——测试也包括 Toshiba TOPIX 文档和 Novexx RLE 文档中的示例。


一张图像需要多少数据?

图像比 ZPL 大。以下是一张典型货运标签的真实数据:100 × 150 mm、203 dpi(812 × 1,218 点),包含文本、DataMatrix、QR 码、GS1-128 条码,以及一行日文、俄文和阿拉伯文文本:

作业未压缩压缩后
ZPL 源码(作为对比)859 字节-
TSPL121 KB52 KB(PCX)
EPL2121 KB-
SBPL122 KB52 KB(PCX)
DPL-52 KB(PCX)
CPCL81 KB(跳过空白行)52 KB(PCX)
JScript124 KB(BMP)52 KB(PCX)
Brother 光栅,TD-4420DN128 KB45 KB(TIFF)
PCL,300 dpi64 KB(跳过空白行)44 KB(TIFF)
Easy Plug121 KB16 KB(RLE)
TPCL121 KB9.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}/rawzplcloud send --remote-printer <id>
通过 API 使用监视文件夹POST /v1/print/folder,带 languagebase64

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" }(或 brotherdpl …)。代理会在打印前转换每个文件,软件完全不会察觉打印机不是 Zebra。

180 dpi 打印机怎么办?

只要有这类机型,就提供支持:Epson TM-T88 系列的 180 dpi ESC/POS,以及 180 和 360 dpi 的 Brother P-touch 型号。

免费吗?

网站工具免费且无需账户,匿名使用有合理使用限制。通过 API 使用时,每张标签计为一次渲染;请参阅价格


用你自己的标签试试:工具中选择你的打印机,粘贴 ZPL,然后把结果发送到端口 9100。如果你管理着混合打印机群,zplCloud 平台会把设计集中保存在一处——而打印机工具确保每台打印机都拿到同一张标签。

更多文章