从第一张标签到系统自动打印

EZ Print Bridge 使用文档

面向操作人员和开发者的完整指南。设计标签、A4 报表、单据或凭证模板后,无需插件或中间件,即可通过原生本地 HTTP API 接入 ERP、WMS、MES 或自研系统。

运行系统
Windows 10 / 11 x64
API 地址
http://127.0.0.1:9191
模板格式
.ezl / .json

01 / 快速开始

打印第一张标签

开始前,先在 Windows 中安装打印机官方驱动并打印一张系统测试页。EZ Print Bridge 使用 Windows 打印队列,只有系统能正常识别的打印机才会出现在软件中。

  1. 1
    安装并启动软件

    运行安装包。首次启动自动进入 14 天试用,无需预装 .NET 或持续联网。

  2. 2
    选择打印机

    在顶部打印机列表选择设备,点击旁边的设置按钮确认纸张规格、方向、打印速度和浓度。

  3. 3
    设置标签尺寸

    在左侧输入实际宽度和高度,单位为毫米。软件尺寸与驱动中的纸张尺寸应保持一致。

  4. 4
    添加标签内容

    点击或拖入文本、Code 128 条码、二维码、图片、边框或分隔线,在右侧修改内容和样式。

  5. 5
    保存并试打

    将模板保存到固定的本机目录,然后点击“打印静态样张”检查实际尺寸与位置。

建议先做什么

先用普通文本和校准外框完成纸张对齐,再加入条码、二维码和业务变量。这样更容易判断偏差来自驱动、耗材还是模板。

02 / 标签设计器

设计和保存标签或报表模板

A

画布与物理尺寸

宽高均以毫米设置。是否打印校准外框可单独控制;X/Y 打印偏移用于校准整张标签的位置。

B

元素与图层

元素可移动、缩放、复制和删除,点击空白处可取消选择。边框内部点击会穿透选择下层元素,二维码使用透明背景。支持撤销与重做,图层列表可拖拽排序。

C

模板文件

保存格式为 .ezl.json。保存会直接更新当前文件,也可另存为新文件。图片会嵌入模板,单张图片上限 20 MB。

D

草稿恢复

编辑过程中会自动保存草稿。正常保存模板后,固定保存路径可直接用于 API 的 templatePath

03 / 变量模板

让一份模板承载不同数据

选择一个文本、条码或二维码元素,点击“插入变量”。变量名只能包含字母、数字和下划线,不能以数字开头,例如 product_name。插入后内容中会出现 {{product_name}}

变量类型值从哪里来手动打印API 打印
静态变量模板默认值始终使用默认值使用默认值,API 不可覆盖
API 变量默认值或请求 data未传入时使用默认值data 按名称覆盖
序列变量起始值、步进、补零位数序列样张中逐张递增固定使用起始值,不允许覆盖
API 与序列变量不能混用来递增

只要模板包含 API 变量,API 打印中的序列变量就固定为起始值。如果订单号、批次号需要每次请求变化,请把它定义为 API 变量并明确传入。

04 / 打印与校准

把预览和实物对齐

  • 静态样张:使用模板默认值打印一张,适合检查版式、条码和二维码。
  • 序列样张:指定张数后作为一个多页任务发送,序列变量按起始值、步进和补零规则生成。
  • 偏移校准:内容整体偏左或偏上时调整 X/Y 偏移;不要移动每一个元素来补偿硬件误差。
  • 清晰度:条码效果还取决于打印头 DPI、标签材质、碳带、速度、浓度和驱动设置。

05 / API 准备

启动本地打印服务

保持 EZ Print Bridge 运行,在顶部点击“启动 API”。状态栏显示以下地址后即可调用:

GEThttp://127.0.0.1:9191/api/health
PowerShell · 健康检查
Invoke-RestMethod -Uri 'http://127.0.0.1:9191/api/health'
200 OK{ "status": "ok", "service": "EZ Print Bridge", "url": "http://127.0.0.1:9191" }
开机自动运行

安装时可选择创建开机启动项。软件会使用 --start-api --minimized 最小化启动并开启 API。启动和打印都需要试用有效或设备已激活。

仅限当前 Windows 电脑

服务只监听 127.0.0.1,没有 API Token,也不会直接接受局域网其他电脑的连接。浏览器页面跨域调用还会受到 CORS 限制;推荐由同机 ERP 客户端、Windows 服务、Node.js 或后端程序调用。不要通过反向代理暴露到公网。

06 / API 参考

接口总览

基础地址为 http://127.0.0.1:9191,请求和响应使用 UTF-8 JSON。

POST

/api/print

校验请求后立即进入单消费者打印队列。成功提交不代表打印已经完成,请使用返回的 jobId 查询最终状态。

请求字段

字段类型必填说明
requestIdstring幂等 ID,最长 128 字符,不能含空白或控制字符。也可放在 Idempotency-Key 请求头中。
templatePathstring本机已存在的 .ezl.json 绝对路径。不接受相对路径和 UNC 网络路径。
printerNamestringWindows 打印队列名称。省略时使用软件当前选中的打印机;两处都没有则任务失败。
copiesinteger打印份数,范围 1 到 999,默认 1。
dataobjectAPI 变量键值。名称不区分大小写;只能覆盖模板中的 API 变量。

data 支持字符串、数字、布尔值和 null;它们会转换为文本。对象或数组会转换为 JSON 文本。未提供的 API 变量使用模板默认值。

JSON · 完整请求
{
  "requestId": "order-20260716-001",
  "templatePath": "D:\\Labels\\Product_Label.ezl",
  "printerName": "Zebra ZD421",
  "copies": 10,
  "data": {
    "product_name": "冷萃咖啡",
    "batch": "B20260716",
    "price": 18.5
  }
}

成功响应

202 Accepted

首次创建任务,duplicate 为 false。

200 OK

相同幂等 ID 和相同内容重复提交,返回原任务且不重打。

响应体
{
  "jobId": "7f3c512e-50ca-4af8-a021-ff340f15a120",
  "status": "Queued",
  "duplicate": false
}

响应还会包含 Location: /api/jobs/{jobId}。如果请求头和正文同时提供幂等 ID,两者必须完全一致。相同 ID 对应不同请求内容时返回 409 Conflict

07 / 任务查询

确认任务是否真正完成

GET/api/jobs/{id}
200 OK · 任务详情
{
  "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 / 调用示例

从你的程序提交打印

PowerShell
$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)"
Node.js 18+
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 查询一次,直到状态为 CompletedFailed,并设置合理的总超时时间。

09 / 错误与排查

状态码和常见问题

HTTP 状态出现时机处理方式
400 Bad RequestJSON 无效、路径不合规、份数超范围、幂等 ID 无效根据响应 message 修正请求
403 Forbidden试用到期、未激活或系统时间异常在软件中检查授权;响应 codeLicenseRequired
404 Not Found接口不存在或任务 ID 不存在核对路径和 jobId
409 Conflict同一 requestId 已用于不同打印内容不要重用业务 ID,或保持重试内容完全一致
500 Internal Server Error服务处理请求时发生未预期错误查看响应信息和软件状态,必要时重启 API
请求返回 202,但没有打印

202 只表示任务已入队。查询任务详情,重点看 statusmessage。常见原因是模板被移动、打印机名称不匹配、静态/序列变量被错误覆盖或打印机离线。

提示 templatePath 无效

使用当前电脑上的完整绝对路径,例如 D:\Labels\Product.ezl。文件必须已经保存并存在,不支持相对路径、共享目录和 \\server\share 形式的 UNC 路径。

浏览器 fetch 调用失败

当前 API 没有提供跨域响应头,也仅监听本机回环地址。请在同机后端、Node.js、桌面程序或 Windows 服务中调用,不要让公网页面的浏览器直接访问。

重复打印了同一订单

没有提供 requestId 时,每次请求都会创建新任务。为每个订单打印动作设置稳定的幂等 ID,超时重试时保持 ID 和请求内容不变。

准备开始

先做一份可复用的标签模板

完成样张校准后,再把模板绝对路径和 API 变量接入业务系统。

下载并试用 14 天