← Tutti gli articoli

2026-10-21

Creare etichette specifiche per gli ordini su un'API di stampa etichette

Creare etichette specifiche per gli ordini su un'API di stampa etichette
pdf labels barcodes label merge browser based graphical layout editor google sheets addin microsoft excel addon electronic shelf labels esl barcode3 labels label editor

在标签打印 API 之上构建订单专属标签

Maya 是一名自由职业开发者,手头有一份为期三周的合同和一个非常具体的问题。她的客户经营着一家小型电商店铺,每天发货 80 到 400 单。每个离开仓库的包裹都需要一张标签,上面有订单号、SKU、可扫描的条形码和客户地址。如今,有人导出 CSV,打开标签设计工具,重新输入字段,然后点击打印。20 单时这只是件琐事。300 单时它就成了全职工作,而且错误会直接送到客户手中。

所以 Maya 正在构建一个履约仪表盘,最后缺失的一块就是输出。她的本能是自己写渲染器:生成条形码、排版 PDF、找一个能接受打印机原生语言的驱动。两天后,她得到了一个看起来没问题的 PDF,和一个大概十次里只能扫出七次的条形码。就在那一刻,真正的问题出现了。不是“我能不能用代码渲染一张标签?”,而是“我应该基于哪个用于订单专属标签的标签打印 API 来构建,以及我该如何组织集成,让客户无需提交工单就能更改设计?”

这就是她本该一开始就采用的行动手册。

为什么订单专属标签对开发者来说是另一种生物

产品标签是一个模板。订单标签是一条记录。这一区别改变了你构建方式的一切。

  • 每张标签都是唯一的。 数据因订单、因行项目、因客户、因承运商而异。没有“把同一张标签打印 500 次”这种可优化的路径。
  • 数据源不是电子表格。 它存在于你的订单管理系统、你的仓库软件,或你已经在仪表盘中调用的某个 API 里。
  • 设计变更层出不穷。 市场部想移动 logo,客户想要不同的条形码尺寸,新的承运商需要自己的版式。如果版式存在于你的应用代码里,每一次这样的变更都是一次部署。
  • 错误代价高昂。 一个扫不出来的条形码,或一个错了一行的地址,就是一个被退回的包裹和一张支持工单。

传统标签设计软件假定有一个人坐在它面前。这在人成为瓶颈或错误来源之前是可行的。开发者真正需要的,是一个设计一次的模板,加上一种在打印时以编程方式将订单数据注入其中的方法——条形码即时生成、条件格式化、不同的输出目标。对于只想要专业外观标签的最终用户来说,这同一套机制正是保证每张标签都一致且符合品牌形象的保障,无需任何人具备设计技能。

如果你的订单数据已经存在于电子表格而非数据库中,查找表和数据文件的机制在如何从 Excel 数据文件和查找表创建标签中有详细说明。本文假定采用 API 优先的流程。

一份实用行动手册:从订单数据到打印标签

以下是操作顺序。它适用于任何严肃的标签平台;下面的具体步骤描述的是使用 Next Generation Label Printing System(RSJ LPSNG)时的样子,这是隐藏了大部分底层管道的托管方案。

第 1 步:在标签工作室中一次性设计模板

打开 Web UI,像设计师那样构建标签:logo、字体排版、固定法律文本、承运商标记。对于每一个可变部分,创建一个具名占位符,而不是输入字面值——order_number、sku、barcode、ship_to、weight。

这些名称很重要。它们是图稿与你的代码之间的契约。一旦它们存在,设计可以更改十次,而你的应用一行代码都不用改。

第 2 步:以 JSON 形式提交带订单数据的打印任务

Web 服务 API 接受打印任务。你发送订单数据,引用模板,并说明你想要什么返回:PDF、PNG 或直接打印。

{
  "template": "order-label-4x6",
  "output": { "format": "pdf" },
  "data": {
    "order_number": "SO-2026-104412",
    "sku": "TSHIRT-BLK-L",
    "barcode": "SO-2026-104412-TSHIRT-BLK-L",
    "ship_to": "M. Weber\nBahnhofstr. 12\n78462 Konstanz\nDE"
  }
}

从你的服务来看,这是每个订单一次调用——或者每个拣货波次一次批量调用:

// Illustrative request shape. The exact endpoint and payload fields for your
// instance are in the Web Service Interface reference.
const res = await fetch(`${process.env.LPSNG_BASE_URL}/job`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Bearer ${await token()}`,
  },
  body: JSON.stringify(job),
});

if (!res.ok) throw new Error(`label job failed: ${res.status}`);
const { pdfUrl } = await res.json();

模板通过名称引用,所以 Maya 的仪表盘中永远不包含版式代码。当客户要求更大的条形码时,有人编辑模板,无需任何重新部署。

第 3 步:把杂乱的格式化推入字段脚本

真实的订单数据很丑陋。日期以 ISO 字符串到达,姓名大小写混杂,地址需要按国家特定的顺序排列。与其在你的应用中规范化一切,不如给需要它的字段附加一个 Python 脚本块——Field Script API 允许脚本在打印前读取和修改字段值。

# Illustrative. A field script has access to the field value and the job data;
# the exact signature is documented in the Python API reference.

ship_to = "\n".join(filter(None, [
    data["customer"]["name"],
    data["customer"]["street"],
    f'{data["customer"]["zip"]} {data["customer"]["city"]}',
    data["customer"]["country"],
]))

return ship_to.strip()

条件逻辑就该放在这里:一个只对加急订单渲染的 PRIORITY 徽章,一个只对国际货运出现的第二个条形码,一个按承运商规范重新格式化的日期。它让转换紧挨着它所影响的字段,而不是散落在你的代码库各处。

第 4 步:使用简化的 OAuth2 流程进行认证

RSJ LPSNG 使用 OAuth2——但采用的是简化的注册协议,而非完整的那套流程。外部系统通过单个 URL 连接,当集成方是仓库终端或基站而非浏览器时,这正是你想要的。

注册做一次,把凭据存入你的密钥管理器,让你的服务按需刷新。当平台提供了更短的路径时,没有理由手写一个授权码流程。

第 5 步:按用例选择输出

API 将单张标签渲染为 PDF 或 PNG,并且可以直接打印。实践中你会混合使用它们:

  • PDF 用于装箱单以及任何归档或通过电子邮件发送的内容。
  • PNG 用于仪表盘内的预览,让操作员在确认打印批次之前看到标签。
  • 直接打印 用于正常的仓库路径,标签直接送到热敏打印机,中间没有文件。

第 6 步:覆盖货架,而不仅仅是包裹

如果你的客户还经营实体店,同一份订单数据可以驱动电子货架标签。厂商中立的 JSON 接口(ESLSEND)更新 ESL 显示屏,还有一个独立的 Web 服务用于在没有浏览器的设备上将标签绑定到商品。绑定工作流在如何通过 API 将 ESL 标签连接到商品中有专门讲解。

{
  "//": "Illustrative shape. The vendor-neutral ESLSEND JSON is specified in the ESL Interface reference.",
  "tags": [
    { "tag": "ESL-0142", "sku": "TSHIRT-BLK-L", "price": "29.90", "currency": "EUR" }
  ]
}

第 7 步:保留一个本地逃生通道

有些站点在打包台没有可靠的网络,或者客户拒绝运行服务器。LPSNG Player 是一个独立的命令行打印引擎:输入包加数据,输出 PDF/PNG/JSON/打印/ESL。

# Package + data in, PDF/PNG/JSON/print/ESL out.
# See the LPSNG Player reference for the current flag names.
lpsng-player order-label.package order-104412.json --output pdf

这就是同一个模板和同一份数据契约,运行在笔记本电脑或单板计算机上。

构建订单专属标签时要避免什么

  • 不要在应用中硬编码版式。 一旦标签几何存在于你的源码中,一次设计微调就变成一次发布。保留占位符加模板,让标签工作室拥有像素。
  • 不要跳过条形码验证。 检查平台是否支持你实际需要的一维和二维格式,并在真实距离用真实扫描仪测试可扫描性。方法见如何在打印标签前验证条形码。
  • 不要自己构建 OAuth2 流程,如果平台提供了简化的注册协议。它会耗费你数天时间,并增加一个你现在要自己承担的安全面。
  • 不要假设所有打印机行为相同。 在你承诺上线日期之前,确认你的硬件型号是否支持直接打印。在不支持的地方,有文档化的变通方案——云打印是其中之一——但它们是变通方案,不是主要路径。
  • 不要忘记失败处理。 当 API 不可达或订单记录缺少必填字段时会发生什么?用退避重试、将任务排队,并向操作员显示明确的错误,而不是静默打印一张空白标签。

RSJ LPSNG 作为托管方案如何契合

RSJ LPSNG 是一个标签设计与打印平台,带有 Web 服务 API、Python 字段脚本和 ESL 支持。对于 Maya 的项目,这意味着她拥有仪表盘和数据映射,而平台拥有渲染、条形码生成、PDF 输出和打印机通信。

对订单专属标签而言重要的部分:

  • 标签工作室 用于模板设计,让非开发者也能调整版式。
  • Web 服务 API 用于打印任务和将单张标签渲染为 PDF 或 PNG,以及直接打印。
  • Field Script API 用于逐字段的 Python 转换和条件逻辑。
  • 带简化注册的 OAuth2,让连接外部系统成为一次性步骤。
  • 集成选项,包括 Google Sheets 插件、Excel 界面,以及可嵌入另一个 Web 应用的可复用侧边栏。

部署也很灵活。有用于多用户访问的托管云版本,有在单板计算机(如 Raspberry Pi)上运行整个系统的嵌入式版本,还有面向多用户、多区域、多设备环境的企业功能。这种范围对自由职业者很重要:同一个集成可以从云版本开始,然后迁移到客户现场的嵌入式盒子,而无需重写客户端代码。

常见问题

问:我可以用 API 打印来自我的订单管理系统的数据标签吗? 答:可以。Web 服务 API 接受带数据负载的打印任务,所以你可以发送订单详情(订单号、SKU、地址)并动态渲染标签。你设计一次模板,然后按订单提交数据。

问:如何处理需要每个订单唯一的条形码? 答:使用 API 通过在数据负载中包含条形码值来即时生成条形码。标签模板可以有一个条形码字段来接收该值。支持的一维和二维格式有文档记录。

问:API 使用什么认证方法,设置起来有多复杂? 答:RSJ LPSNG 使用带简化注册协议的 OAuth2,通过单个 URL 连接外部系统。这降低了典型的 OAuth2 复杂性,使开发者更容易集成。

问:我可以在没有实体打印机的情况下测试标签渲染吗? 答:可以。API 可以将标签渲染为 PDF 或 PNG,所以你可以在发送到打印机之前预览和验证输出。LPSNG Player 也支持输出为 PDF/PNG 用于测试。

构建仪表盘,而不是渲染器

Maya 故事中的教训不是渲染标签不可能。而是渲染标签是一个已解决的问题,花在条形码库和打印机驱动上的每一个小时,都是没有花在她客户真正付费购买的履约逻辑上的一个小时。设计一次模板,保持占位符名称稳定,通过 API 注入订单数据,让平台处理输出——PDF 用于归档,PNG 用于预览,直接打印用于仓库现场。

如果你正面对同样的集成决策,从 Next Generation Label Printing System Web 服务接口开始,用一个真实的占位符名称构建一个模板,然后端到端推送一个测试订单。那一个订单告诉你的契合度信息,比任何功能对比都多。

相关文章

EU label: AI-generated content