2

我们正在尝试使用 TCPDF 库为产品标签生成正确的 EAN-128 代码,但我们的客户说条形码扫描仪无法读取生成的条形码。原始(旧)条形码和字符串:

在此处输入图像描述

代码字符串是:

$codeString = "(01)08437013308045(3013)2675(15)161201(10)150518"

如果我们将字符串直接传递给 TCPDF 函数,如下所示:

$label->write1DBarcode($codeString, 'C128A', $x, $y, $w, $h);

我们得到了正确的输出(扫描仪不会读取),但是与看起来更短且密度更低的原始条码相比,条码更密集(他们说它是 EAN-128): 在此处输入图像描述

我们在这里发现(带有 FNC1 的 EAN-128chr(241)在 之前添加$codeString应该会有所帮助,但是如果我们添加它,生成的图像会从人类可读代码中的所有内容中删除:

在此处输入图像描述

由于我们没有条形码阅读器,我们无法自己检查错误。

我们在这里缺少什么?我们使用的是 TCPDF 版本 6.2.12。

4

1 回答 1

8

这里有很多问题我会解决。

首先,您误读了包含(3103)2775表示净重的固定长度应用标识符 (AI) 字段的原始条形码的文本。

您编写了一个包含(3013)2675无效的代码。没有 AI (3013),不幸的是,这将与表示项目计数的合法 AI (30) 前缀匹配,该项目计数是一个可变长度字段。因此,解码器将继续读取剩余的数据,直到代码结束进入 AI (30),因为没有后续字段终止符 (FNC1)。那是很多项目——实际上价值超过八位数,所以读者可能会指出错误!

此答案的“提取”部分提供了有关 GS1 数据如何在 Code 128 条形码中编码以生成有效 GS1-128 符号的背景。

假设您要对 GS1 data 进行编码(01)08437013308045(3103)2675(15)161201(10)150518

您需要在 Code 128 中编码的原始数据是{FNC1}0108437013308045310326751516120110150518.

推导如下:

  • 数据以 FNC1 标志字符开始(表示存在 GS1 格式的数据)。
  • AI 周围的括号已被省略。
  • 由于您的数据仅包含固定长度的 AI,因此我们无需使用 FNC1 分隔符[*]终止可变长度字段。

[*] 请注意,GS1 通用规范第3.2 节“按数字顺序排列的 GS1 应用标识符”中提供的 AI 列表表明它们是否需要在后跟附加数据时以 FNC1 字符终止。

这些知识如何转化为 TCPDF 的代码?抱歉,我从未使用过它,但这可能会有所帮助:

您的$codeString变量需要定义如下:

$codeString = chr(241).'0108437013308045310326751516120110150518';

这假设支持论坛上的链接答案正确地说明了 TCPDF 使用 ASCII 序数 241 来指示 FNC1 字符。(这是否是这种情况存在一些疑问。)如果它有效,那么这是一个特定于库的选择,您不应该过多了解他们选择值 241 的事实。有关编码非数据字符的详细信息,请参见此处如 FNC1。

我还注意到您传递C128A给将符号限制为模式 A(数字、大写字母和控制字符)的type参数write1DBarcode。这将非常低效,并且可能导致符号太宽(或重新缩放时太密集) ) 使用用于物流应用的大多数标准设备进行扫描。

Code 128 支持提供数字双密度压缩的模式 C,因此您应该使用它,可能通过传递type=C128Ctype=C128(自动)假设 TCPDF 的自动编码是任何好的并且您将创建的未来符号可能需要包含字母。

$label->write1DBarcode($codeString, 'C128', $x, $y, $w, $h);

就条形码下方的人类可读文本而言,如果正确编码的数据无法正确显示,那么您可能需要针对 TCPDF 提出错误报告或功能请求。

于 2015-12-02T15:07:00.203 回答