PB条码打印探讨
在信息系统开发时通常有用户要求能够打印条码,笔者现在就power builder 工具开发的系统初略的介绍一下条码的实现方式及其优缺点。本文主要讨论code39和code128的实现方法。
code39总共可表示的字符范围:0~9,A~Z以及 +、-、*、/、%、$、.等特殊字符,在加上空格符‘ ’,共计44组编码,条码没有长度限制。但code39码能表示的字符的范围挺小的,而且表示出来的条码也比较长。然而,这种条码这pb中实现起来很简单。
Code128相对较为复杂,支持的字元也相对较多,又有不同的编码方式可供交互运用。它具有A、B、C三种不同的编码类型,可表示的范围也很广,具体特性大家可以到网上查找相关资料。它能表示高密度数据,条码不会太长。
一、使用条形码字体实现code39、code128
需要在本机上安装code39或code128字体,需要注意的是由于CODE128码字符串包含不可正常显示的字符,你必须使用支持Unicode码的PB版本,如PB10以上。
对于code39来说,通常用“*”号作为起始、终止符,校验码不用。如‘6921168509256’的值为:*6921168509256* 。在数据窗口中可以加一列计算列,表示为:'*'+yourcode+'*' ,然后在将计算列的字体选为:3 of 9 Barcode ,设置一下大小就可以了。需要注意的是code39条码一般都会很长,最好不要用它来表示太长的条码。在pb9和pb10中测试没有问题,用激光打印机打出来的条码可以在普通的条码扫描枪上正确识别。
对于code128来说实现起来没那么容易,Code128编码规则:开始位 + [FNC1(为EAN128码时加)] + 数据位 + 检验位 + 结束位。所以这要求我们先要计算出编码结果,然后用128字体表示出来。笔者在网上找了一个实现code128B版本的转换函数,使用它可以将字符串轻松转换。当然,如果大家有时间可以到网上好好查查code128的编码规则,然后自己写个函数。
附CODE128码在PB中的实现源代码。
/*******************************************************************/
//CODE128条码基础知识
//CODE128有三个版本
//CODE128A: 标准数字和字母, 控制符, 特殊字符
//CODE128B: 标准数字和字母, 小写字母, 特殊字符
//CODE128C: [00]-[99]的数字对集合, 共100个
//本函数采用CODE128B版本
//条码由开始位、数据位、校验位、停止位组成
//计算过程:
//1.取各字符ASC码乘以字符序号之和(以ASC=32为分界点,大于32减32,小于32加64)
//2.计算校验码
//3.组合条码:开始位+数据位+校验位+停止位
int li_asc_total = 104
int li_asc_tmp,i
char lc_start=char(204)//采用CODE128B版本
char lc_stop=char(206)
int li_check_digit
string ls_check_digit
//1.取各字符ASC码乘以字符序号之和(以ASC=32为分界点,大于32减32,小于32加64)
For i = 1 To len(as_sourcetext)
li_asc_tmp = Asc(mid(as_sourcetext,i, 1))
If li_asc_tmp >= 32 Then
li_asc_total = li_asc_total + (li_asc_tmp - 32) * i
Else
li_asc_total = li_asc_total + (li_asc_tmp + 64) * i
End If
Next
//2.计算校验码
li_check_digit = mod(li_asc_total,103)
If li_check_digit >= 95 Then//特殊字符
li_check_digit = li_check_digit + 100
Else
li_check_digit = li_check_digit + 32
end if
ls_check_digit = char(li_check_digit)
//3.组合条码:开始位+数据位+校验位+停止位
Return lc_start + as_sourcetext + ls_check_digit + lc_stop
先感谢一下函数的作者辛苦劳动。将转换后的字符串以128字体的方式显示即可。最后测试没问题,激光打印机打出来的条码可以在普通的条码扫描枪上正确识别。
二、使用MSBCODE9.OCX实现
这是微软提供的条码控件,可以表示多种条码字体,具体资料大家可以查阅MSBCODE9.CHM,可以到office安装目录下查找。
msbcode9.ocx是微软公司OFFICE自带的一个条码控件。不需要条码字体直接就可以打印一些条码,比如CODE128、CODE39等。而且对于开发环境没有太多的限制,至少pb9、pb10都测试通过。
1、首先你要注册一下msbcode9.ocx控件。regsvr32 msbcode9.ocx
2、使用ole在PB中把注册的控件增加到窗口中或数据窗口中。
3、双击控件就会看到一些属性,包括选择条码字体。
4、不过也可以在程序中用代码来控制。
dw_1.o b j e c t.ole_1.o b j e c t.style = 7 //7代表CODE128 6代表CODE39
dw_1.o b j e c t.ole_1.o b j e c t.value = '条码值'
MSBCODE9的帮助文件:MSBCODE9.HLP
目录在:C:\Program Files\Microsoft Office\OFFICE11\2052
然后就可以打印了,最后测试没问题,激光打印机打出来的条码可以在普通的条码扫描枪上正确识别,而且扫描效果很好,比用字体实现的要好。但存在另一个问题,如果想要打印一批单据,每个单据都带条码的话,用条码字体比较好实现,用控件的话不好实现。可以先把ole对象存在数据库中,最后检索出来,但日后数据库检索的速度会很慢,这是因为存储ole对象的缘故。
三、其他
还有一些使用图片生成条码的,其实质也是先通过字符串编码转换为条码编码,然后以图片的形式进行显示,感觉倒不如使用控件更直接。对于直接向打印机发送控制命令来实现条码的方式,笔者没有进行测试,希望有兴趣的可以试试。