前言:
如果你看了我之前的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码的文章都坑死我了。。。