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
评论区
写评论还没有评论