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

pftdvrlh  于 2023-04-04  发布在  PHP
关注(0)|答案(1)|浏览(144)

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

代码字符串为:

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

如果我们将字符串直接传递给TCPDF函数,像这样:

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

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

我们在这里发现(EAN-128 with FNC 1),在$codeString之前添加chr(241)应该会有所帮助,但如果我们添加它,结果图像将从人类可读代码中剥离:

由于我们没有条形码阅读器,我们无法自己检查错误。
我们在这里遗漏了什么?我们使用的是TCPDF版本6.2.12。

umuewwlo

umuewwlo1#

这里有很多问题我会解决的。
首先,您误读了原始条形码的文本,其中包含代表净重的固定长度应用标识符(AI)字段(3103)2775
你写了一个包含(3013)2675的代码,这是无效的。没有AI(3013),不幸的是,这将与合法的AI前缀匹配因此,解码器将继续读取剩余的数据,直到进入AI的代码结束为止(30),因为没有后续的字段结束符(FNC 1)。这是一个很大的项目-超过八位数的价值,事实上,所以读者可能会指出一个错误!
this answer的“提取”部分提供了GS1数据如何在Code 128条形码中编码以产生有效的GS1-128符号的背景。
让我们假设您打算对GS1数据(01)08437013308045(3103)2675(15)161201(10)150518进行编码。
需要在Code 128中编码的原始数据是{FNC1}0108437013308045310326751516120110150518
其推导如下:

  • 数据以FNC 1标志字符开始(表示存在GS1格式的数据)。
  • AI周围的括号已被省略。
  • 由于您的数据仅由固定长度的AI组成,因此没有必须使用FNC 1分隔符[*]终止可变长度字段的情况。

[*]请注意,GS1 General Specifications §3.2“按数字顺序排列的GS1应用程序标识符”中提供的AI列表指示了它们在后跟其他数据时是否需要用FNC 1字符终止。
如何将这些知识转化为TCPDF的代码?我从未使用过它,抱歉,但这可能会有所帮助:
你的$codeString变量需要像这样定义:

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

这是假设支持论坛上的链接答案正确地指出TCPDF使用ASCII序数241来表示FNC 1字符。(There is some doubt whether this is the case.)如果它工作,那么这是一个特定于库的选择,您不应该过多地阅读他们选择值241的事实。See here了解有关编码非数据字符(如FNC 1)的详细信息。
我还注意到,您将C128A传递给write1DBarcodetype参数,该参数将符号限制为模式A(数字、大写字母和控制字符)。这将是非常低效的,并且可能导致符号太宽(或在重新缩放时太密集),无法使用用于物流应用的大多数标准设备进行扫描。
Code 128支持模式C,它提供数字的双密度压缩,因此您应该使用它,可能通过传递type=C128Ctype=C128(auto)假设TCPDF的自动编码是任何好的,并且您将创建的未来符号可能需要包含字母。

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

至于条形码下面的可读文本,如果它不能正确显示正确编码的数据,那么您可能需要针对TCPDF提出错误报告或功能请求。

相关问题