如何在TCPDF中正确生成GS1-128(以前的EAN-128)条形码

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

enter image description here

代码字符串是:

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

如果我们直接将字符串传递给TCPDF函数,就像这样:
$label->write1DBarcode($codeString, 'C128A', $x, $y, $w, $h);

我们得到了正确的输出(扫描仪无法读取),但与原始条形码相比,条纹更密集,长度似乎更短,密度更小(他们说这是EAN-128): enter image description here

我们在这里找到了(EAN-128 with FNC1),在$codeString之前添加chr(241)应该有所帮助,但如果我们添加它,生成的图像将被剥离所有人类可读代码:

enter image description here

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

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


第一个条形码中没有生成括号,但是我查看了TCPDF源代码,找不到任何原因。 - Ignacio Vazquez-Abrams
1个回答

9
这里有一些问题需要解决。首先,您误读了原始条形码文本中包含的固定长度应用标识符(AI)字段 (3103)2775,表示净重量。您编写的代码包含无效的 (3013)2675。没有 AI(3013),不幸的是,这将与合法的 AI(30)前缀匹配,该 AI 表示变长字段的项目计数。因此,解码器将继续读取剩余数据直到代码末尾进入 AI(30),因为没有后续字段终止字符(FNC1)。那是很多项目 - 实际上超过八位数字,因此读者可能会出现故障!this answer 的“提取”部分提供了 GS1 数据如何在 Code 128 条形码中进行编码以生成有效的 GS1-128 符号的背景信息。假设您想要编码 GS1 数据 (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传递给write1DBarcodetype参数,这限制了符号的模式A(数字,大写字母和控制字符)。这将非常低效,并且很可能导致符号太宽(或者当重新调整大小时太密集),无法用于大多数用于物流应用的标准设备进行扫描。

Code 128支持一种C模式,可以对数字进行双倍密度压缩,因此你应该使用此模式,可能通过传递type=C128Ctype=C128(自动)来实现,假设TCPDF的自动编码是好的并且你将创建的未来符号可能需要包含字母。

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

如果条码下的人类可读文本未能正确显示,则可能需要对TCPDF提出错误报告或功能请求。

感谢您的详细解释,我们已经修复了3103代码的拼写错误和'C128',去掉了括号,并添加了臭名昭著的char(241),但没有成功。您知道是否需要在每个AI前面放置FNC1标志字符吗? - user1398498
1
FNC1分隔符仅用于终止非终端,可变长度的AIs。(严格来说,规范列出了不需要FNC1终止的精确固定长度字段。任何新分配的AIs无论是可变长度还是不可变长度,都需要FNC1终止以为实现者提供稳定的目标。)我已更新答案以使其更清晰。 - Terry Burton
你的TCPDF最新输出是什么样子? - Terry Burton
由于我们压力很大,我们已经转换到使用脚本生成条形码,客户说现在似乎工作正常,所以现在仅用TCPDF生成标签。不幸的是,TCPDF在其文档中没有提供如何生成正确的GS1-128码的任何说明。 - user1398498

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接