< 返回版块

GOODBOY008 发表于 2026-04-06 22:01

Tags:zpl,zebra,epl,label-printer,shipping-label,labelary,label-generator,label-rendering,zpl-parser

labelize:用 Rust 写的 ZPL/EPL 标签渲染引擎

GitHub: https://github.com/GOODBOY008/labelize 协议:MIT | 语言:Rust

背景:为什么要造这个轮子

做物流系统的同学应该都接触过 ZPL(Zebra Programming Language)——这是 Zebra 打印机使用的标签描述语言。日常开发中经常有一个需求:不连接打印机,把 ZPL 渲染成图片预览

现有的方案要么依赖外部服务(Labelary API,数据安全存疑),要么需要付费授权(动辄几百上千美元),要么效果拉胯。于是我用 Rust 写了 labelize,一个开源的 ZPL/EPL 标签渲染引擎。

它能做什么

一句话:把 ZPL/EPL 标签代码渲染成 PNG 或 PDF,不需要打印机,不需要付费

支持的能力:

  • ZPL 和 EPL 两种标签格式解析与渲染
  • 10 种条码类型(Code 128、QR Code、DataMatrix、PDF417 等)
  • 输出 PNG / PDF
  • 三种使用方式:Rust SDK、CLI 工具、HTTP 微服务

性能表现

和业界常用的 Labelary API 做了对比:

指标 labelize Labelary API
平均渲染耗时 ~5ms ~388ms
离线可用
需要付费 免费版有限制

渲染质量方面,用 79 个真实标签做了像素级对比测试:

  • 完美匹配:4 个
  • 差异 <1%:24 个
  • 差异 <5%:40 个
  • 差异 <15%:11 个
  • 高差异:0 个

详细对比报告见 diff_report.txt

快速上手

安装 CLI

brew tap GOODBOY008/homebrew-labelize && brew install labelize

命令行转换

# ZPL 转 PNG
labelize convert label.zpl

# ZPL 转 PDF
labelize convert label.zpl -t pdf

启动 HTTP 服务

labelize serve --port 8080

# 调用 API
curl -X POST http://localhost:8080/convert \
  -H "Content-Type: application/zpl" \
  -d '^XA^FO50,50^A0N,40,40^FDHello World^FS^XZ' \
  -o label.png

作为 Rust 库使用

use std::io::Cursor;
use labelize::{ZplParser, Renderer, DrawerOptions};

let zpl = b"^XA^FO50,50^A0N,40,40^FDHello^FS^XZ";
let mut parser = ZplParser::new();
let labels = parser.parse(zpl).unwrap();

let renderer = Renderer::new();
let mut buf = Cursor::new(Vec::new());
renderer.draw_label_as_png(&labels[0], &mut buf, DrawerOptions::default()).unwrap();

std::fs::write("output.png", buf.into_inner()).unwrap();

和其他方案的对比

特性 labelize Labelary Zebra 打印机
离线 / 自托管
无需硬件
开源
EPL 支持
PDF 输出
可嵌入库
REST API
费用 免费 免费 / 付费 硬件成本

也调研了市面上其他开源方案(BinaryKits.Zpl、zebrafy、blackstripes 等),渲染效果都不太理想,有兴趣可以看 README 里的详细对比。

适用场景

  • 物流标签预览:发送到打印机前先看看效果
  • 仓储管理:批量转换标签模板为 PDF 存档
  • 电商集成:作为微服务动态生成物流标签图片
  • CI/CD:在自动化流程中验证标签内容是否正确
  • 标签设计工具:集成到应用中提供实时预览

技术实现简述

核心流程:ZPL/EPL 文本 → 词法分析 → 指令解析 → 虚拟画布渲染 → PNG/PDF 输出。

Rust 在这个场景下的优势很明显:零成本抽象让渲染路径没有额外开销,内存安全避免了图像处理中常见的 buffer 问题,编译产物是单个二进制文件,部署非常简单。

当前状态与规划

项目还在活跃开发中,目前已支持大部分常用的 ZPL/EPL 指令。欢迎提 Issue 和 PR,尤其是:

  • 更多 ZPL 指令的支持
  • 渲染精度的优化
  • 更多条码类型

如果你也在做物流/仓储相关的系统,或者对 Rust 图像渲染感兴趣,欢迎试用和反馈。

⭐ 如果觉得有用,给个 Star 支持一下:https://github.com/GOODBOY008/labelize


Ext Link: https://github.com/GOODBOY008/labelize

评论区

写评论

还没有评论

1 共 0 条评论, 1 页