01 / 快速开始
打印第一张标签
开始前,先在 Windows 中安装打印机官方驱动并打印一张系统测试页。EZ Print Bridge 使用 Windows 打印队列,只有系统能正常识别的打印机才会出现在软件中。
- 1安装并启动软件
运行安装包。首次启动自动进入 14 天试用,无需预装 .NET 或持续联网。
- 2选择打印机
在顶部打印机列表选择设备,点击旁边的设置按钮确认纸张规格、方向、打印速度和浓度。
- 3设置标签尺寸
在左侧输入实际宽度和高度,单位为毫米。软件尺寸与驱动中的纸张尺寸应保持一致。
- 4添加标签内容
点击或拖入文本、Code 128 条码、二维码、图片、边框或分隔线,在右侧修改内容和样式。
- 5保存并试打
将模板保存到固定的本机目录,然后点击“打印静态样张”检查实际尺寸与位置。
先用普通文本和校准外框完成纸张对齐,再加入条码、二维码和业务变量。这样更容易判断偏差来自驱动、耗材还是模板。
02 / 标签设计器
设计和保存标签或报表模板
画布与物理尺寸
宽高均以毫米设置。是否打印校准外框可单独控制;X/Y 打印偏移用于校准整张标签的位置。
元素与图层
元素可移动、缩放、复制和删除,点击空白处可取消选择。边框内部点击会穿透选择下层元素,二维码使用透明背景。支持撤销与重做,图层列表可拖拽排序。
模板文件
保存格式为 .ezl 或 .json。保存会直接更新当前文件,也可另存为新文件。图片会嵌入模板,单张图片上限 20 MB。
草稿恢复
编辑过程中会自动保存草稿。正常保存模板后,固定保存路径可直接用于 API 的 templatePath。
03 / 变量模板
让一份模板承载不同数据
选择一个文本、条码或二维码元素,点击“插入变量”。变量名只能包含字母、数字和下划线,不能以数字开头,例如 product_name。插入后内容中会出现 {{product_name}}。
| 变量类型 | 值从哪里来 | 手动打印 | API 打印 |
|---|---|---|---|
| 静态变量 | 模板默认值 | 始终使用默认值 | 使用默认值,API 不可覆盖 |
| API 变量 | 默认值或请求 data | 未传入时使用默认值 | 由 data 按名称覆盖 |
| 序列变量 | 起始值、步进、补零位数 | 序列样张中逐张递增 | 固定使用起始值,不允许覆盖 |
只要模板包含 API 变量,API 打印中的序列变量就固定为起始值。如果订单号、批次号需要每次请求变化,请把它定义为 API 变量并明确传入。
04 / 打印与校准
把预览和实物对齐
- 静态样张:使用模板默认值打印一张,适合检查版式、条码和二维码。
- 序列样张:指定张数后作为一个多页任务发送,序列变量按起始值、步进和补零规则生成。
- 偏移校准:内容整体偏左或偏上时调整 X/Y 偏移;不要移动每一个元素来补偿硬件误差。
- 清晰度:条码效果还取决于打印头 DPI、标签材质、碳带、速度、浓度和驱动设置。
05 / API 准备
启动本地打印服务
保持 EZ Print Bridge 运行,在顶部点击“启动 API”。状态栏显示以下地址后即可调用:
http://127.0.0.1:9191/api/healthInvoke-RestMethod -Uri 'http://127.0.0.1:9191/api/health'
{ "status": "ok", "service": "EZ Print Bridge", "url": "http://127.0.0.1:9191" }安装时可选择创建开机启动项。软件会使用 --start-api --minimized 最小化启动并开启 API。启动和打印都需要试用有效或设备已激活。
服务只监听 127.0.0.1,没有 API Token,也不会直接接受局域网其他电脑的连接。浏览器页面跨域调用还会受到 CORS 限制;推荐由同机 ERP 客户端、Windows 服务、Node.js 或后端程序调用。不要通过反向代理暴露到公网。
06 / API 参考
接口总览
基础地址为 http://127.0.0.1:9191,请求和响应使用 UTF-8 JSON。
/api/print
校验请求后立即进入单消费者打印队列。成功提交不代表打印已经完成,请使用返回的 jobId 查询最终状态。
请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
requestId | string | 否 | 幂等 ID,最长 128 字符,不能含空白或控制字符。也可放在 Idempotency-Key 请求头中。 |
templatePath | string | 是 | 本机已存在的 .ezl 或 .json 绝对路径。不接受相对路径和 UNC 网络路径。 |
printerName | string | 否 | Windows 打印队列名称。省略时使用软件当前选中的打印机;两处都没有则任务失败。 |
copies | integer | 否 | 打印份数,范围 1 到 999,默认 1。 |
data | object | 否 | API 变量键值。名称不区分大小写;只能覆盖模板中的 API 变量。 |
data 支持字符串、数字、布尔值和 null;它们会转换为文本。对象或数组会转换为 JSON 文本。未提供的 API 变量使用模板默认值。
{
"requestId": "order-20260716-001",
"templatePath": "D:\\Labels\\Product_Label.ezl",
"printerName": "Zebra ZD421",
"copies": 10,
"data": {
"product_name": "冷萃咖啡",
"batch": "B20260716",
"price": 18.5
}
}
成功响应
首次创建任务,duplicate 为 false。
相同幂等 ID 和相同内容重复提交,返回原任务且不重打。
{
"jobId": "7f3c512e-50ca-4af8-a021-ff340f15a120",
"status": "Queued",
"duplicate": false
}
响应还会包含 Location: /api/jobs/{jobId}。如果请求头和正文同时提供幂等 ID,两者必须完全一致。相同 ID 对应不同请求内容时返回 409 Conflict。
07 / 任务查询
确认任务是否真正完成
/api/jobs/{id}{
"id": "7f3c512e-50ca-4af8-a021-ff340f15a120",
"status": "Completed",
"message": "API 任务已完成:10 张,打印机 Zebra ZD421",
"createdAt": "2026-07-16T08:15:30.120+00:00",
"updatedAt": "2026-07-16T08:15:31.006+00:00",
"templatePath": "D:\\Labels\\Product_Label.ezl",
"printerName": "Zebra ZD421",
"copies": 10,
"requestId": "order-20260716-001"
}
| 状态 | 含义 | 调用方处理 |
|---|---|---|
Queued | 等待进入打印流程 | 稍后继续查询 |
Processing | 正在解析模板并发送打印 | 稍后继续查询 |
Completed | 任务已发送到 Windows 打印队列 | 记录成功结果 |
Failed | 模板、变量、打印机或授权出错 | 读取 message 并人工处理 |
GET /api/jobs 返回最近 50 条任务数组。最多 500 条摘要持久化到 %APPDATA%\EZPrintBridge\api-jobs.json,不会保存完整 data。程序异常退出时未完成的任务会标记为 Failed,不会自动重打。
08 / 调用示例
从你的程序提交打印
$body = @{
requestId = 'order-20260716-001'
templatePath = 'D:\Labels\Product_Label.ezl'
printerName = 'Zebra ZD421'
copies = 2
data = @{ product_name = '冷萃咖啡'; batch = 'B20260716' }
} | ConvertTo-Json -Depth 5
$job = Invoke-RestMethod `
-Uri 'http://127.0.0.1:9191/api/print' `
-Method Post -ContentType 'application/json; charset=utf-8' -Body $body
Invoke-RestMethod -Uri "http://127.0.0.1:9191/api/jobs/$($job.jobId)"
const response = await fetch('http://127.0.0.1:9191/api/print', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Idempotency-Key': 'order-20260716-001'
},
body: JSON.stringify({
templatePath: 'D:\\Labels\\Product_Label.ezl',
printerName: 'Zebra ZD421',
copies: 2,
data: { product_name: '冷萃咖啡', batch: 'B20260716' }
})
});
if (!response.ok) throw new Error(await response.text());
const job = await response.json();
console.log(job.jobId);
每个业务动作生成稳定且唯一的 requestId,网络超时后使用同一 ID 重试。拿到 jobId 后每 500 ms 到 1 s 查询一次,直到状态为 Completed 或 Failed,并设置合理的总超时时间。
09 / 错误与排查
状态码和常见问题
| HTTP 状态 | 出现时机 | 处理方式 |
|---|---|---|
| 400 Bad Request | JSON 无效、路径不合规、份数超范围、幂等 ID 无效 | 根据响应 message 修正请求 |
| 403 Forbidden | 试用到期、未激活或系统时间异常 | 在软件中检查授权;响应 code 为 LicenseRequired |
| 404 Not Found | 接口不存在或任务 ID 不存在 | 核对路径和 jobId |
| 409 Conflict | 同一 requestId 已用于不同打印内容 | 不要重用业务 ID,或保持重试内容完全一致 |
| 500 Internal Server Error | 服务处理请求时发生未预期错误 | 查看响应信息和软件状态,必要时重启 API |
请求返回 202,但没有打印
202 只表示任务已入队。查询任务详情,重点看 status 和 message。常见原因是模板被移动、打印机名称不匹配、静态/序列变量被错误覆盖或打印机离线。
提示 templatePath 无效
使用当前电脑上的完整绝对路径,例如 D:\Labels\Product.ezl。文件必须已经保存并存在,不支持相对路径、共享目录和 \\server\share 形式的 UNC 路径。
浏览器 fetch 调用失败
当前 API 没有提供跨域响应头,也仅监听本机回环地址。请在同机后端、Node.js、桌面程序或 Windows 服务中调用,不要让公网页面的浏览器直接访问。
重复打印了同一订单
没有提供 requestId 时,每次请求都会创建新任务。为每个订单打印动作设置稳定的幂等 ID,超时重试时保持 ID 和请求内容不变。
准备开始
先做一份可复用的标签模板
完成样张校准后,再把模板绝对路径和 API 变量接入业务系统。