自绘条形码(code39 + code128A+C奇偶数)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29238009/article/details/77983215

前言:

如果你看了我之前的blog,你就知道我在公司里面主要负责的还是pdf的编写。然后本来觉得该改进的东西也就没什么问题了,做的都挺完善的,但是还是炸锅了。
因为原来打印出来都挺perfect的,直到项目部署到一个子公司那里。他们用的打印机是针式打印机(不知道是什么的同学自行百度一下,就是我小学的时候家里的那种打印机。。。我小学大概2005年左右?),然后这种打印机,虽然旧了点,什么都还ok,唯独一点,打印pdf上面的图片的时候,会花掉。反正就是图不能看了。然后我单子上面是附上了生成的条形码图片的,so,单子条形码是扫不了了。但是其他的字和框都还勉强可以。所以我看到那个还挺笔直的线框,我就知道只有自己画出条形码才能拯救我写的插件了 “(º Д º*)!

前提:

下面都是一些语法的事,所以原则上来说,你用什么编程语言或者绘制手段都没关系,只要满足两个条件就可以了:一、能够画出线段出来,二、线段的XY位置能够微量调整(就是能够几像素几像素那样调)。这两个条件应该对于任何编程语言来说都不难,起码我知道PHP和JavaScript应该是没什么问题的。

————————————————————————正文————————————————————————

先来个简单点的,code128:

(1)原理:code128码制又分A,B,C三种码,道理都一样,这里我举例code128A码。
编码的顺序是 [起始码]+[数据码]+[校验码]+[终止码],我下面会给出对应关系数组。

举例:现在我要打code128A码,数据是“123”。

起始码:abc三个是下面数组id的103~105。如果你要打A码,就要选103的数组作为你的起始码,bs=bbsbssssbss,bc同理。
数据码:“123”,就相当于将17~19号的bs码串在一起,就是“bssbbbssbbs ”+“bbssbbbssbs
”+“bbssbsbbbss”
校验码: (起始码ID + 每个字符所在的位置*每个字符的ID)% 起始码ID 。这个例子中,就是(103+1*17+2*18+3*19)%103 = 7(如果我没算错的话= =。。。反正道理是这个道理)。然后找到ID是7的bs码,是bssbbsssbss。
终止码: 就是ID=106,abc码都是这个数,bs是bbsssbbbsbsbb。

所以打code128A码,数据是“123”,那么bs值就是
bbsbssssbssbssbbbssbbsbbssbbbssbsbbssbsbbbssbssbbsssbssbbsssbbbsbsbb
b就是一个单位宽度的黑条,s就是一个单位宽度的白条。下面有写详细bs的意思。

照着上面的原理来写就行了,我都不想贴代码上来了,感觉没什么参考意义,关键是要看懂这个算法就行了。

code128的对应关系数组:
注释:id就是id,a是在code128A码制下代表的字符,b、c同理,code是指这个id对应的code是多少(1-6位,奇数是黑条,偶数是白条,数字1代表一个单位,数字2代表两个单位),bs是指表现在屏幕上效果(b就是一个单位的黑条,s就是一个单位的白条)。例如现在要写code128A码,我数据码要写个数字‘1’,那么对应的bs就是bssbbbssbbs,就相当于叫你这段中,要从左到右打出 |–|||–||- (| 就是一条黑色竖线,-就是空格,什么都不写,并且 | 和 - 的宽度是一样的!!!)

$rule = [
            0=>['id'=>'0','a'=>'SP ','b'=>'SP','c'=>'0','code'=>'212222','bs'=>'bbsbbssbbss',],
            1=>['id'=>'1','a'=>'!','b'=>'!','c'=>'1','code'=>'222122','bs'=>'bbssbbsbbss',],
            2=>['id'=>'2','a'=>'"','b'=>'"','c'=>'2','code'=>'222221','bs'=>'bbssbbssbbs',],
            3=>['id'=>'3','a'=>'#','b'=>'#','c'=>'3','code'=>'121223','bs'=>'bssbssbbsss',],
            4=>['id'=>'4','a'=>'$','b'=>'$','c'=>'4','code'=>'121322','bs'=>'bssbsssbbss',],
            5=>['id'=>'5','a'=>'%','b'=>'%','c'=>'5','code'=>'131222','bs'=>'bsssbssbbss',],
            6=>['id'=>'6','a'=>'&','b'=>'&','c'=>'6','code'=>'122213','bs'=>'bssbbssbsss',],
            7=>['id'=>'7','a'=>'\'','b'=>'\'','c'=>'7','code'=>'122312','bs'=>'bssbbsssbss',],
            8=>['id'=>'8','a'=>'(','b'=>'(','c'=>'8','code'=>'132212','bs'=>'bsssbbssbss',],
            9=>['id'=>'9','a'=>')','b'=>')','c'=>'9','code'=>'221213','bs'=>'bbssbssbsss',],
            10=>['id'=>'10','a'=>'*','b'=>'*','c'=>'10','code'=>'221312','bs'=>'bbssbsssbss',],
            11=>['id'=>'11','a'=>'+','b'=>'+','c'=>'11','code'=>'231212','bs'=>'bbsssbssbss',],
            12=>['id'=>'12','a'=>',','b'=>',','c'=>'12','code'=>'112232','bs'=>'bsbbssbbbss',],
            13=>['id'=>'13','a'=>'-','b'=>'-','c'=>'13','code'=>'122132','bs'=>'bssbbsbbbss',],
            14=>['id'=>'14','a'=>'.','b'=>'.','c'=>'14','code'=>'122231','bs'=>'bssbbssbbbs',],
            15=>['id'=>'15','a'=>'/','b'=>'/','c'=>'15','code'=>'113222','bs'=>'bsbbbssbbss',],
            16=>['id'=>'16','a'=>'0','b'=>'0','c'=>'16','code'=>'123122','bs'=>'bssbbbsbbss',],
            17=>['id'=>'17','a'=>'1','b'=>'1','c'=>'17','code'=>'123221','bs'=>'bssbbbssbbs',],
            18=>['id'=>'18','a'=>'2','b'=>'2','c'=>'18','code'=>'223211','bs'=>'bbssbbbssbs',],
            19=>['id'=>'19','a'=>'3','b'=>'3','c'=>'19','code'=>'221132','bs'=>'bbssbsbbbss',],
            20=>['id'=>'20','a'=>'4','b'=>'4','c'=>'20','code'=>'221231','bs'=>'bbssbssbbbs',],
            21=>['id'=>'21','a'=>'5','b'=>'5','c'=>'21','code'=>'213212','bs'=>'bbsbbbssbss',],
            22=>['id'=>'22','a'=>'6','b'=>'6','c'=>'22','code'=>'223112','bs'=>'bbssbbbsbss',],
            23=>['id'=>'23','a'=>'7','b'=>'7','c'=>'23','code'=>'312131','bs'=>'bbbsbbsbbbs',],
            24=>['id'=>'24','a'=>'8','b'=>'8','c'=>'24','code'=>'311222','bs'=>'bbbsbssbbss',],
            25=>['id'=>'25','a'=>'9','b'=>'9','c'=>'25','code'=>'321122','bs'=>'bbbssbsbbss',],
            26=>['id'=>'26','a'=>':','b'=>':','c'=>'26','code'=>'321221','bs'=>'bbbssbssbbs',],
            27=>['id'=>'27','a'=>';','b'=>';','c'=>'27','code'=>'312212','bs'=>'bbbsbbssbss',],
            28=>['id'=>'28','a'=>'< ','b'=>'< ','c'=>'28','code'=>'322112','bs'=>'bbbssbbsbss',],
            29=>['id'=>'29','a'=>'=','b'=>'=','c'=>'29','code'=>'322211','bs'=>'bbbssbbssbs',],
            30=>['id'=>'30','a'=>'> ','b'=>'> ','c'=>'30','code'=>'212123','bs'=>'bbsbbsbbsss',],
            31=>['id'=>'31','a'=>'?','b'=>'?','c'=>'31','code'=>'212321','bs'=>'bbsbbsssbbs',],
            32=>['id'=>'32','a'=>'@','b'=>'@','c'=>'32','code'=>'232121','bs'=>'bbsssbbsbbs',],
            33=>['id'=>'33','a'=>'A','b'=>'A','c'=>'33','code'=>'111323','bs'=>'bsbsssbbsss',],
            34=>['id'=>'34','a'=>'B','b'=>'B','c'=>'34','code'=>'131123','bs'=>'bsssbsbbsss',],
            35=>['id'=>'35','a'=>'C','b'=>'C','c'=>'35','code'=>'131321','bs'=>'bsssbsssbbs',],
            36=>['id'=>'36','a'=>'D','b'=>'D','c'=>'36','code'=>'112313','bs'=>'bsbbsssbsss',],
            37=>['id'=>'37','a'=>'E','b'=>'E','c'=>'37','code'=>'132113','bs'=>'bsssbbsbsss',],
            38=>['id'=>'38','a'=>'F','b'=>'F','c'=>'38','code'=>'132311','bs'=>'bsssbbsssbs',],
            39=>['id'=>'39','a'=>'G','b'=>'G','c'=>'39','code'=>'211313','bs'=>'bbsbsssbsss',],
            40=>['id'=>'40','a'=>'H','b'=>'H','c'=>'40','code'=>'231113','bs'=>'bbsssbsbsss',],
            41=>['id'=>'41','a'=>'I','b'=>'I','c'=>'41','code'=>'231311','bs'=>'bbsssbsssbs',],
            42=>['id'=>'42','a'=>'J','b'=>'J','c'=>'42','code'=>'112133','bs'=>'bsbbsbbbsss',],
            43=>['id'=>'43','a'=>'K','b'=>'K','c'=>'43','code'=>'112331','bs'=>'bsbbsssbbbs',],
            44=>['id'=>'44','a'=>'L','b'=>'L','c'=>'44','code'=>'132131','bs'=>'bsssbbsbbbs',],
            45=>['id'=>'45','a'=>'M','b'=>'M','c'=>'45','code'=>'113123','bs'=>'bsbbbsbbsss',],
            46=>['id'=>'46','a'=>'N','b'=>'N','c'=>'46','code'=>'113321','bs'=>'bsbbbsssbbs',],
            47=>['id'=>'47','a'=>'O','b'=>'O','c'=>'47','code'=>'133121','bs'=>'bsssbbbsbbs',],
            48=>['id'=>'48','a'=>'P','b'=>'P','c'=>'48','code'=>'313121','bs'=>'bbbsbbbsbbs',],
            49=>['id'=>'49','a'=>'Q','b'=>'Q','c'=>'49','code'=>'211331','bs'=>'bbsbsssbbbs',],
            50=>['id'=>'50','a'=>'R','b'=>'R','c'=>'50','code'=>'231131','bs'=>'bbsssbsbbbs',],
            51=>['id'=>'51','a'=>'S','b'=>'S','c'=>'51','code'=>'213113','bs'=>'bbsbbbsbsss',],
            52=>['id'=>'52','a'=>'T','b'=>'T','c'=>'52','code'=>'213311','bs'=>'bbsbbbsssbs',],
            53=>['id'=>'53','a'=>'U','b'=>'U','c'=>'53','code'=>'213131','bs'=>'bbsbbbsbbbs',],
            54=>['id'=>'54','a'=>'V','b'=>'V','c'=>'54','code'=>'311123','bs'=>'bbbsbsbbsss',],
            55=>['id'=>'55','a'=>'W','b'=>'W','c'=>'55','code'=>'311321','bs'=>'bbbsbsssbbs',],
            56=>['id'=>'56','a'=>'X','b'=>'X','c'=>'56','code'=>'331121','bs'=>'bbbsssbsbbs',],
            57=>['id'=>'57','a'=>'Y','b'=>'Y','c'=>'57','code'=>'312113','bs'=>'bbbsbbsbsss',],
            58=>['id'=>'58','a'=>'Z','b'=>'Z','c'=>'58','code'=>'312311','bs'=>'bbbsbbsssbs',],
            59=>['id'=>'59','a'=>'[','b'=>'[','c'=>'59','code'=>'332111','bs'=>'bbbsssbbsbs',],
            60=>['id'=>'60','a'=>'\\','b'=>'\\','c'=>'60','code'=>'314111','bs'=>'bbbsbbbbsbs',],
            61=>['id'=>'61','a'=>']','b'=>']','c'=>'61','code'=>'221411','bs'=>'bbssbssssbs',],
            62=>['id'=>'62','a'=>'^','b'=>'^','c'=>'62','code'=>'431111','bs'=>'bbbbsssbsbs',],
            63=>['id'=>'63','a'=>'_','b'=>'_','c'=>'63','code'=>'111224','bs'=>'bsbssbbssss',],
            64=>['id'=>'64','a'=>'NUL','b'=>'`','c'=>'64','code'=>'111422','bs'=>'bsbssssbbss',],
            65=>['id'=>'65','a'=>'SOH','b'=>'a','c'=>'65','code'=>'121124','bs'=>'bssbsbbssss',],
            66=>['id'=>'66','a'=>'STX','b'=>'b','c'=>'66','code'=>'121421','bs'=>'bssbssssbbs',],
            67=>['id'=>'67','a'=>'ETX','b'=>'c','c'=>'67','code'=>'141122','bs'=>'bssssbsbbss',],
            68=>['id'=>'68','a'=>'EOT','b'=>'d','c'=>'68','code'=>'141221','bs'=>'bssssbssbbs',],
            69=>['id'=>'69','a'=>'ENQ','b'=>'e','c'=>'69','code'=>'112214','bs'=>'bsbbssbssss',],
            70=>['id'=>'70','a'=>'ACK','b'=>'f','c'=>'70','code'=>'112412','bs'=>'bsbbssssbss',],
            71=>['id'=>'71','a'=>'BEL','b'=>'g','c'=>'71','code'=>'122114','bs'=>'bssbbsbssss',],
            72=>['id'=>'72','a'=>'BS','b'=>'h','c'=>'72','code'=>'122411','bs'=>'bssbbssssbs',],
            73=>['id'=>'73','a'=>'HT','b'=>'i','c'=>'73','code'=>'142112','bs'=>'bssssbbsbss',],
            74=>['id'=>'74','a'=>'LF','b'=>'j','c'=>'74','code'=>'142211','bs'=>'bssssbbssbs',],
            75=>['id'=>'75','a'=>'VT','b'=>'k','c'=>'75','code'=>'241211','bs'=>'bbssssbssbs',],
            76=>['id'=>'76','a'=>'FF','b'=>'I','c'=>'76','code'=>'221114','bs'=>'bbssbsbssss',],
            77=>['id'=>'77','a'=>'CR','b'=>'m','c'=>'77','code'=>'413111','bs'=>'bbbbsbbbsbs',],
            78=>['id'=>'78','a'=>'SO','b'=>'n','c'=>'78','code'=>'241112','bs'=>'bbssssbsbss',],
            79=>['id'=>'79','a'=>'SI','b'=>'o','c'=>'79','code'=>'134111','bs'=>'bsssbbbbsbs',],
            80=>['id'=>'80','a'=>'DLE','b'=>'p','c'=>'80','code'=>'111242','bs'=>'bsbssbbbbss',],
            81=>['id'=>'81','a'=>'DC1','b'=>'q','c'=>'81','code'=>'121142','bs'=>'bssbsbbbbss',],
            82=>['id'=>'82','a'=>'DC2','b'=>'r','c'=>'82','code'=>'121241','bs'=>'bssbssbbbbs',],
            83=>['id'=>'83','a'=>'DC3','b'=>'s','c'=>'83','code'=>'114212','bs'=>'bsbbbbssbss',],
            84=>['id'=>'84','a'=>'DC4','b'=>'t','c'=>'84','code'=>'124112','bs'=>'bssbbbbsbss',],
            85=>['id'=>'85','a'=>'NAK','b'=>'u','c'=>'85','code'=>'124211','bs'=>'bssbbbbssbs',],
            86=>['id'=>'86','a'=>'SYN','b'=>'v','c'=>'86','code'=>'411212','bs'=>'bbbbsbssbss',],
            87=>['id'=>'87','a'=>'ETB','b'=>'w','c'=>'87','code'=>'421112','bs'=>'bbbbssbsbss',],
            88=>['id'=>'88','a'=>'CAN','b'=>'x','c'=>'88','code'=>'421211','bs'=>'bbbbssbssbs',],
            89=>['id'=>'89','a'=>'EM','b'=>'y','c'=>'89','code'=>'212141','bs'=>'bbsbbsbbbbs',],
            90=>['id'=>'90','a'=>'SUB','b'=>'z','c'=>'90','code'=>'214121','bs'=>'bbsbbbbsbbs',],
            91=>['id'=>'91','a'=>'ESC','b'=>'{','c'=>'91','code'=>'412121','bs'=>'bbbbsbbsbbs',],
            92=>['id'=>'92','a'=>'FS','b'=>'|','c'=>'92','code'=>'111143','bs'=>'bsbsbbbbsss',],
            93=>['id'=>'93','a'=>'GS','b'=>'}','c'=>'93','code'=>'111341','bs'=>'bsbsssbbbbs',],
            94=>['id'=>'94','a'=>'RS','b'=>'~','c'=>'94','code'=>'131141','bs'=>'bsssbsbbbbs',],
            95=>['id'=>'95','a'=>'US','b'=>'DEL','c'=>'95','code'=>'114113','bs'=>'bsbbbbsbsss',],
            96=>['id'=>'96','a'=>'FNC3','b'=>'FNC3','c'=>'96','code'=>'114311','bs'=>'bsbbbbsssbs',],
            97=>['id'=>'97','a'=>'FNC2','b'=>'FNC2','c'=>'97','code'=>'411113','bs'=>'bbbbsbsbsss',],
            98=>['id'=>'98','a'=>'SHIFT','b'=>'SHIFT','c'=>'98','code'=>'411311','bs'=>'bbbbsbsssbs',],
            99=>['id'=>'99','a'=>'CODEC','b'=>'CODEC','c'=>'99','code'=>'113141','bs'=>'bsbbbsbbbbs',],
            100=>['id'=>'100','a'=>'CODEB','b'=>'FNC4','c'=>'CODEB','code'=>'114131','bs'=>'bsbbbbsbbbs',],
            101=>['id'=>'101','a'=>'FNC4','b'=>'CODEA','c'=>'CODEA','code'=>'311141','bs'=>'bbbsbsbbbbs',],
            102=>['id'=>'102','a'=>'FNC1','b'=>'FNC1','c'=>'FNC1','code'=>'411131','bs'=>'bbbbsbsbbbs',],
            103=>['id'=>'103','a'=>'StartA','b'=>'StartA','c'=>'StartA','code'=>'211412','bs'=>'bbsbssssbss',],
            104=>['id'=>'104','a'=>'StartB','b'=>'StartB','c'=>'StartB','code'=>'211214','bs'=>'bbsbssbssss',],
            105=>['id'=>'105','a'=>'StartC','b'=>'StartC','c'=>'StartC','code'=>'211232','bs'=>'bbsbssbbbss',],
            106=>['id'=>'106','a'=>'Stop','b'=>'Stop','c'=>'Stop','code'=>'2331112','bs'=>'bbsssbbbsbsbb',],
        ];

参考文章:https://wenku.baidu.com/view/60372aea8bd63186bdebbc24.html

上面是code128 的A码(大写字母+数字,组合成任意长度),这里补充C码(纯数字,原则上仅支持偶数位)

照着上面对应规则的c码,能找到1-99。
偶数情况下:

例如有条码12345678,那么拆成四个码位,12 + 34 + 56 + 78,如果是有条码120345678,那么中间的03就对应3就行了,反正就是一个码位就算两位数字的。验证码还是 % 103,虽然这里C码是105
以12035678为例,先算校验码,(105 + 1x12 + 2x3 + 3x56 + 4x78)%103 = 88
整个码就是 105(起始码) + 12(数据码) + 3(数据码) + 56(数据码) + 78(数据码) + 88(校验码) + 106(终止码),把这里的id换成上面规则对应的bs黑白条纹就行了

奇数情况下:

例如有条码120356789,除去最后一位,其他是偶数,那么前8位拆成 12+3+56+78,最后一位要特殊处理,将最后一位写成B码。下面写出这个例子的运算方法。
先算校验码,105 + 1x12 + 2x3 + 3x56 + 4x78 + 5x100(CODEB) + 6x25(数字9 在B码上id是25) = 1253。 然后 1253 % 103 = 17

所以120356789整个码是 105(起始码) + 12(数据码) + 3 (数据码)+ 56(数据码) + 78(数据码) + 100(转B码,CODEB的id) + 25(数据码,数字9在B码上的id) + 17(校验码) + 106(终止码),把这里的id对应的bs黑白条纹组合在一起就行了

————————————————————————————————————————————

code39,这个我做了一下午。关键是网上的很多都写错了,有两三种算法,我最后还是看例子总结出来了。

(1)原理:
如果你看完了我上面写的code128,那么我现在说这个code39就容易理解点了。
先贴个对应关系出来吧:

$rules = [
            '0' => '000110100',
            '1' => '100100001',
            '2' => '001100001',
            '3' => '101100000',
            '4' => '000110001',
            '5' => '100110000',
            '6' => '001110000',
            '7' => '000100101',
            '8' => '100100100',
            '9' => '001100100',
            'A' => '100001001',
            'B' => '001001001',
            'C' => '101001000',
            'D' => '000011001',
            'E' => '100011000',

            'F' => '001011000',
            'G' => '000001101',
            'H' => '100001100',
            'I' => '001001100',
            'J' => '000011100',
            'K' => '100000011',
            'L' => '001000011',
            'M' => '101000010',
            'N' => '000010011',
            'O' => '100010010',
            'P' => '001010010',
            'Q' => '000000111',
            'R' => '100000110',
            'S' => '001000110',
            'T' => '000010110',

            'U' => '110000001',
            'V' => '011000001',
            'W' => '111000000',
            'X' => '010010001',
            'Y' => '110010000',
            'Z' => '011010000',
            '-' => '010000101',
            '.' => '110000100',
            ' ' => '011000100',
            '$' => '010101000',
            '/' => '010100010',
            '+' => '010001010',
            '%' => '000101010',
            '*' => '010010100',
        ];

code39码的组成是:[定位码] + [数据码] + [定位码]
例如,现在我要写个 123的code39码
那么头尾两个定位码“*”就是010010100,然后数据码就是100100001+001100001+101100000。
然后每个字符之间还要有两个空位,就是两个单位宽度的空格!网上很多要么是上面的码制对应关系是错的,要么就是没说要加两位空位,搞得我做了一下午都扫不出正确的码。。。。。
所以123的code39码就是 * 123 *
也就是 010010100 + [两个空位] + 100100001 + [两个空位] + 001100001 + [两个空位] + 101100000 + [两个空位] + 010010100。
叫39码是因为,有9位数位,然后仅有3个数是1。规则是奇数位是黑条,偶数位是空条,值为0是一个单位宽度,值为1是两个单位宽度。例如 定位码* 010010100,就是 |–|-||-||-|,每9位数里面,就是2黑粗+3黑细,1白粗+3白细。每9位数单位之间记得加两个空位哦 ,就是 –

这里就不写参考文献了,大部分看过的39码的文章都坑死我了。。。

猜你喜欢

转载自blog.csdn.net/qq_29238009/article/details/77983215