当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在TCPDF中正确生成GS1-128(以前的EAN-128)条形码》经验,为你挑选了1个好方法。

我们正在尝试使用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与FNC1)chr(241)$codeString应该有帮助之前添加,但是如果我们添加它,结果图像将从人类可读代码中的所有内容中删除:

在此输入图像描述

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

我们在这里缺少什么?我们正在使用TCPDF版本6.2.12.



1> Terry Burton..:

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

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

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

本答案的"提取"部分提供了有关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.

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

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

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

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

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有