PDF417二维条码的编码设计与研究
【摘要】本文介绍了PDF417二维条码结构中数据码字编码、错误纠正码字编码和条码矩阵生成三大模块的编码设计原理,通过举例详细介绍了含有汉字的数据编码及模式切换,分析了生成错误纠正码字需要注意的问题及产生过程,并对PDF417条码绘制原理进行了简单介绍。
【关键词】二维条码;PDF417;编码设计
1.引言
二维条码具有信息密度大、纠错能力强、识别速度快,成本低廉等特点,自推出后迅速在国际上得到认可,被广泛应用于各类证件、邮政、物流管理等行业。目前国际上使用的二维码有两种:一种是行排码,如Code 16K、Code 49、PDF417等;另一种是矩阵码,如QR Code、Data Matrix、Maxi Code、Code one、CompactMatrix、龙贝码等。其中PDF417是一种使用较广、较成熟的二维条码,我国在1997年制定了PDF417二维条码的国家标准:GB/T 17172-1997《四一七条码》。研究PDF417条码技术并将其进行推广,具有很大的价值和现实意义。
2.PDF417条码简介
PDF417二维条码是由留美华人王寅敬(音)博士发明的。PDF取自英文Portable Data File三个单词的首字母,意为“便携数据文件”,无需建立后台数据库,可以直接阅读条码得到相应的信息。
PDF417条码为多行结构,符号的顶部和底部为空白区,上下空白区间为多行结构,每一行数据符号字符数相同,行与行左右对齐直接衔接。其最小行数为3,最大行数为90,见图1所示。每行的构成从左到右依次为左空白区、起始符、左行指示符号字符、数据符号字符、右行指示符号字符、终止符、右空白区。
图1 PDF417条码符号的结构
图2 符号字符
PDF417条码除了可以表示字母、数字、ASCII字符外,还能表示任意以二进制数存储的数据,输入的数据经过编码成为码字,其码字集包含了929个码字,取值范围为0~928。每一个码字对应一个符号字符,符号字符由4个条和4个空构成,它以不同的条、空形式表示了所有929个四一七条码的码字。每一个符号字符自左向右从条开始,除了起始符和终止符外每
一个条或空包含1~6个模块。将组成条码的最窄条或空称为一个模块,在一个符号字符中,4个条和4个空的总模块数为17,所以称四一七条码或PDF417码。但起始符和终止符是唯一的,条、空序列分别为81111113和711311121。PDF417条码符号字符如图2所示。
PDF417条码符号字符集由三个簇构成,簇号分别为0、3、6,每一个簇包含以不同的条、空形式表示的所有929个四一七条码的码字。在每一簇中,每一符号字符对应唯一的码字,因此四一七条码的符号字符集包含了3×929个符号字符。四一七码按行的不同使用不同簇的符号字符,同一簇每3行重复一次。第一行使用第0簇的符号字符,第二行使用第3簇的符号字符,第三行使用第6簇的符号字符,第四行再使用第0簇,以此类推。行号由上向下递增,最上一行行号为1。
3.PDF417条码的编码
PDF417条码的编码包括数据码字编码、错误纠正码字编码和条码矩阵生成三大模块。
3.1 数据码字编码
3.1.1 模式结构
PDF417条码有三种数据压缩模式:文本压缩模式(TC)、字节压缩模式(BC)和数字压缩模式(NC)。通过使用模式锁定/转移码字,可以在一个PDF417条码符号中使用多种模式表示数据。其中模式锁定码字用于将当前模式切换为指定的目标模式,该模式切换在下一个切换前一直有效。模式转移码字用于将文本压缩模式(TC)暂时切换为字节压缩模式(BC),这种切换只对切换后的第一个码字有效,随后的码字又返回到文本压缩模式(TC)的当前子模式。模式切换结构见图3所示。
图3 模式切换
(1)文本压缩模式(TC)
文本压缩模式分为四种子模式:大写字母型子模式(Alpha)、小写字母型子模式(Lower Case)、混合型子模式(Mixed)和标点型子模式(Punctuation)。每种子模式选择了文件中出现频率较高的一组字符作为字符集。子模式中每一字符对应一个数值(0~29)。这样两个文本字符即可编码成一个417码字,该码字=30×H+L,其中H、L分别为第一个和第二个文本字符。
任何模式到文本模式(TC)的锁定都是到大写字母型子模式(Alpha)的锁定。在文本压缩模式中,每一个码字用两个基为30的值表示(范围为0~29)。如果在一个字符串的尾部有奇数个基为30的值,需要用值为29的虚拟字符ps填充最后一个码字。
文本模式的大写字母子模式在每一符号的起始时有效。
(2)字节压缩模式(BC)
字节压缩模式通过基256到基900的转换,将字节序列转换为码字序列。对于字节压缩模式,有两个模式锁定(901,924)。如果压缩的字节数是6的倍数,则用924模式锁定,按照从左到右的顺序,通过基256至基900的转换,6个字节可转换成5个码字表示,例如6个字节A1,A2,A3,A4,A5,A6可表示为一个码字序列924,B1,B2,B3,B4,B5,转换方法为:
A1×2565+A2×2564+A3×2563+A4×2562+A5×2561+A6=B1×9004+B2×9003+B3×002+B4×9001+B5
如果压缩的字节数不是6的倍数时,则用901模式锁定,前每6个数据字节依旧按照上述方法转换成5个码字,被6整除后所剩余的1~5个字节应每个字节对应一个码字逐字节用码字表示。
(3)数字压缩模式(NC)
数字压缩模式是指从基10至基900的转换,它大约可以实现用一个码子来表示3个十进制的数字。虽然数字压缩模式并不限制需要压缩的字数长度,但是一般推荐当连续数字位大于等于13时再使用,否则采用文本压缩模式。数字压缩模式编码可分为:将数字序列从左向右每44位分为一组,最后一组包含的数位少于44位;
对每组数字,在其数字序列前加一位前导符“1”,然后再进行10至900的基数转换。例:“000213298174006”,由于该数字序列小于44位,所以只能分为一组,在其前面加入前导符1,然后进行基10至基900的转换。
1000213298174006=1×9005+624×9004+434×9003+632×9002+282×9001+206,所以417条码的编码序列是(1,624,434,632,282,206)。
PDF417条码有一个强大的功能就是可以对汉字进行编码,根据我国1980年制定的信息交换用汉字编码字符集《GB2312-80》规定,每一个汉字用两字节的区位码表示,第一字节表示区号(1~94),第二字节表示位号(1~94)。汉字在计算机内以两字节的机内码形式存储,
汉字的机内码和区位码之间的关系是:
机内码=区位码+A0A0H,即机内码用两字节的十六进制数表示。如:“啊”的区位码是1601(十进制数),在计算机内表示的“啊”是其机内码B0A1H。所以应采用机内码对汉字进行压缩编码。因汉字的机内码是用两字节的十六进制数表示的,多个汉字就是双倍的十六进制数,则汉字编码完全可以采用上述字节压缩模式进行编码,即每3个汉字可以用5个码字编码,不能被3整除余下的汉字,其区码、位码分别进行基900表示。
3.1.2 数据编码
对于一组要编码的数据,应按照数据的类别分别应用不同的压缩模式转换为数据码字。以“PDF417二维条形码”为例,共有11个字符。前6个字符“PDF417”采用文本压缩模式,后5个字符“二维条形码”是汉字,采用字节压缩模式。
字符串“PDF417”的编码为“P、D、F、ml4、1、7”(数字“417”的位数小于13,也采用文本压缩模式),其字符串配对为“PD、Fml、41、7ps”,与最后1个字符“7”配对的字符是“ps”,它是一个附加的填充字符。它们在文本压缩模式下的对应值分别为“15、3、5、28、4、1、7、
29”,即用4个基为30的符号表示(15,3)、(5,28)、(4,1)、(7,29),计算得到“PDF417”的数据码字为453,178,121,239。
字符“二维条形码”在字符集《GB2312-80》中的区位码分别是2294、4612、4485、4846、3475,计算得到它们对应的机内码分别为165EH、2E0CH、2C55H、302EH、224BH,共有10个字节数据。按照字节压缩模式编码规则,这10个字节数据在压缩是必须要用模式锁定901;前6个字节16H、5EH、2EH、0CH、2CH、55H通过基256到基900的转换后可以用5个码字表示为306,602,058,443,873;后4个字节30H、2EH、22H、4BH逐字节用基900的码字分别表示为208,206,194,235。
数据“PDF417二维条形码”本身的数据码字是453,178,121,239,901,306,602,058,443,873,208,206,194,235,共14个码字,其中901是采用字节压缩模式的模式锁定码字。
3.2 纠错码字编码
当数据流中的数据码字生成后,即可生成纠错码字。若给定纠错等级s,通过纠错等级计算出纠错码字长度k=2s+1。k个纠错码字的算法主要包括以下几个步骤:
第一步:建立符号数据多项式,公式如下所示:
字符串长度压缩d(x)=dn-1xn-1+dn-2xn-2+…+d1x+d0
多项式的系数由数字码字区中的数据码字组成,其中包括符号长度码字、数据码字和填充码字。n为数据码字的长度,其中dn-1对应第一个数据码字,以此类推,d0对应最后一个数据码字。
第二步:建立纠错码字的生成多项式,公式如下所示:
g(x)=(x-3)(x-32)…(x-3k)=xk+gk-1xk-1+…+g1x+g0,多项式中k为纠错码字数目。
第三步:纠错码字计算。
对于一组给定的数据码字和选定的错误纠正等级,错误纠正码字c0,…,ck-1为符号数据多项式d(x)乘以xk,然后除以生成多项式g(x),所得余式的各系数在有限域GF(929)上的补数。
3.3 条码矩阵设计
数据码字和纠错码字生成后,还要计算左、右行指示符号字符。左行指示符号字符Li由下式确定:
其中:
x_i=INT[((行号-1))/3]  i=1,2,3,…90
y=INT[((行数-1))/3]
z=错误纠正等级×3+(行数-1)mod 3
v=数据区的列数-1
ci=第i行的簇号
具有n个数据码字、k个错误纠正码字的数据区在PDF417条码符号中必须排列成一个矩阵,添上起始符、左、右行指示符和终止符,便形成如图4所示的条码矩阵。
图4 条码矩阵
数据“PDF417二维条形码”本身的数据码字有14个,加上数据长度作为第1个数据码字,则数据码字有15个。如果错误纠正等级设定为s=1,则错误纠正码字数k=2s+1=4,其条码矩阵中数据区码字数共有19个。如果排列成4行5列的矩阵,还需要在错误纠正码字最高位k3之前填充1个虚拟码字900,这样数据区符号长度码字数为16。其条码矩阵排列如图5所示。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。