我们正在尝试使用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。
1条答案
按热度按时间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
。其推导如下:
[*]请注意,GS1 General Specifications §3.2“按数字顺序排列的GS1应用程序标识符”中提供的AI列表指示了它们在后跟其他数据时是否需要用FNC 1字符终止。
如何将这些知识转化为TCPDF的代码?我从未使用过它,抱歉,但这可能会有所帮助:
你的
$codeString
变量需要像这样定义:这是假设支持论坛上的链接答案正确地指出TCPDF使用ASCII序数241来表示FNC 1字符。(There is some doubt whether this is the case.)如果它工作,那么这是一个特定于库的选择,您不应该过多地阅读他们选择值241的事实。See here了解有关编码非数据字符(如FNC 1)的详细信息。
我还注意到,您将
C128A
传递给write1DBarcode
的type
参数,该参数将符号限制为模式A(数字、大写字母和控制字符)。这将是非常低效的,并且可能导致符号太宽(或在重新缩放时太密集),无法使用用于物流应用的大多数标准设备进行扫描。Code 128支持模式C,它提供数字的双密度压缩,因此您应该使用它,可能通过传递
type=C128C
或type=C128
(auto)假设TCPDF的自动编码是任何好的,并且您将创建的未来符号可能需要包含字母。至于条形码下面的可读文本,如果它不能正确显示正确编码的数据,那么您可能需要针对TCPDF提出错误报告或功能请求。