第31卷增刊电子科技大学学报V ol.31 No.7      2002年12月Journal  of  UEST  of  China                          Dec. 2002 ・工作研究・
用Visual Basic开发图书馆常用条形码打印软件
魏敏瑞*
(电子科技大学图书馆成都  610054)
【摘要】论述了用Visual Basic 6.0 中文版开发图书馆常用条形码(39码)打印软件的经验。讨论了39条形码的编码规则。对程序设计中的打印条形码元素、打印条形码字符、条形码号码增值、设定条码打印位置等
关键问题作了介绍,并给出了相应的程序代码。
关键词条形码;  Visual Basic;  程序设计;  图书馆应用
中图分类号G250.7
To Develop Barcode Printing Software Used
in Libraries with Visual Basic
Wei Minrui
(Library of UESTC  Chengdu 610054)
Abstract This paper discourses on the experience of developing b arcode(3 of 9 code) printing software which used frequently at libraries by Visual Basic 6.0(Chinese edition)
program language. It discusses some programming key problems, such as the coding regulation
of 3 of 9 barcode, the routines of printing of barcode elements, the printing of barcode characters,
the increasing of barcode number, the setting of barcode printing position, et al. and also gives
the program codes correspondingly.
Key words barcode;  Visual Basic; programming;  application in libraries
条形码作为一种信息识别与输入技术,具有快速、准确、方便等优点,被广泛应用于商品流通、邮政、图书馆等自动化管理系统中。目前,在图书馆自动化管理系统中常用的条形码有39码、库德巴码
和二五码。其中39码由于其具有较广的字符集(包括数字和字母及一些特殊符号)、自带校验、误码率低等特点,成为迄今应用最为广泛的一种条形码码制。
在条形码应用实践中,不可避免地涉及到条形码的制作问题。自制条形码有两种方式:1) 使用专用条形码打印机制作。用这种打印机制作条形码不需要另外的软件,但设备和耗材价格昂贵(1台条形码打印机需1~2万元);2) 使用普通激光打印机制作。其特点是设备价格低廉(1台激光打印机只需3~5千元),并且还可一机多用,但需要有相应的软件支持。对于一般图书馆来说,用普通激光打印机制作条形码比较适宜。虽然条形码打印软件的开发需要一定的编程知识和技巧,但也不是高不可攀的。本文用Visual Basice 6.0中文版成功地开发出具有一定特的条形码(39码)打印软件,和同行交流一些编程经验。
1  39码的编码规则
条形码是由一组规则排列、宽窄不同的条(条形码中反射率较低的部分)、空(条形码中反射率较
2002年9月15日收稿
* 男  50岁大学副研究馆员
增刊曹学艳:  电子科技大学学报被EI Compendex Web 收录情况统计分析53
高的部分)元素及其对应字符组成的标记,用以表示一定的信息。39码在表示每一个字符时,使用9个元素,其中3个宽元素,6个窄元素,故称39码。宽元素的宽度是窄元素的2~3倍。如数字“1”的编码规则是:“宽条、窄空、窄条、宽空、窄条、窄空、窄条、窄空、宽条”。39码还规定相邻字符之间用一个“窄空”作为分隔,一组条形码字符两端用星号“*”作为起始符和终止符。
2  条码打印程序的设计
Visual Basic是近年来比较流行的程序设计语言,它具有易学易用、功能强大等特点。一般的应用软件都可以用VB来编写。用VB开发条形码打印软件,可以在比较短的时间里很方便地设计出界面美观、操作简便的程序。下面着重讨论开发该软件的四个关键问题。
2.1  打印条形码元素
编写条形码打印软件的关键是如何打印出条形码的各个元素:条和空,并将它们组合成合乎规则的条码字符。最为简便的方法是使用Windows系统中的Code3of9字库,只要向打印机发送要打印的字符,就可以直接产生39码条形码,而且打印速度很快。(根据测试,用这种方法打印1页A4纸60个条形码只需5s)。如果没有Code3of9字库,可以用VB中的画直线和矩形的语句Line来实现条和空的打印。但这种方法打印速度较慢。(根据测试,打印1页A4纸60个条形码约需60s)。用Line语句打印条码元素的方法如下:
DrawWidth = 1  ‘将打印宽度单位设为像素
Line=10        ‘设置窄条的宽度
High=400        ‘设置条码高度
‘打印窄条:
Printer.Line(X, Y) - Step(Line, High), , BF
X = X + Line ‘移动X坐标
‘打印宽条:
Printer.Line(X, Y) - Step(Line*3, High), , BF
X = X + Line * 3 ‘移动X坐标
窄空和宽空的打印只需移动X坐标即可,并不需要实际打印。
2.2  打印条形码字符的语句
有了条形码的基本元素,只要将它们按照规则组合,就可形成条形码字符。分别把每个元素及字符的打印语句写成独立的过程,在程序中打印时调用相应的过程。如打印数字“1”的过程:Private Sub One(X As Single, Y As Single)
Call Wline(X, Y)        ‘宽条
Call Nspace(X, Y)      ‘窄空
Call Nline(X, Y)        ‘窄条
Call Wspace(X, Y)      ‘宽空
Call Nline(X, Y)
Call Nspace(X, Y)
Call Nline(X, Y)
Call Nspace(X, Y)
Call Wline(X, Y)
Call Nspace(X, Y)
End Sub
为节省篇幅,其他字符的过程语句就不在这里一一列出了,有兴趣的读者可以参照有关条形码技术规则编写。
54                                电子科技大学学报      31卷
2.3 条形码号码的增值
图书馆自动化系统使用的条形码一般都是连续增值的数字条码,即一个条码一个数字,互不重复。有的还在数字前面加上字母作为前缀,如:“B00123456”、“B00123457”,等。所以在程序中要考虑到字母前缀和号码增值的问题。在打印程序中需要将条码号码定义为字符串型变量来接受用户的输入,再用字符串搜索函数查用户输入的号码中是否含有字母前缀,如果有,则将其与后面的数字分离开,存入一个全局变量中,将数字部分存入一个长整型变量中,按照用户输入的步长值增加数字的值。下面是分离字母前缀和号码增值的程序语句:
‘分离字母前缀
Sub GetPrefix(BarcodeNumberString As String, BarcodeNumber As Long)
Dim StringLength As Integer  ‘声明一个储存字符串长度的整型变量
Dim TempString As String    ‘声明一个临时字符串,用于保存前缀字符
Prefix = ""                  ‘将前缀字符串置空
StringLength = Len(BarcodeNumberString)    ‘取得条形码字符串的长度
I = 1                      ‘设置搜索目标字符串的开始位置
Do                        ‘取得前缀字符的循环
TempString$ = Mid$(BarNumberString, I, 1)  ‘取得条码字符串中位置I 上的一个字
‘符并存入临时字符串中
I = I + 1                  ‘搜索位置加1
Loop While IsNumeric(TempString) = False    ‘当搜索到数字时,结束循环
I = I – 2                    ‘将搜索位置的值设为条码字符串中的实际位置
If I > 0 Then                ‘如果位置值大于0,则表示有字符前缀
Prefix = Left$(BarNumberString, I)  ‘截取前缀字符串
End If
BarcodeNumber = Right$(BarcodeNumberString, StringLength – I)  ‘截取条码号码
End Sub
2.4 调整条形码的打印位置
条形码打印程序中的另一个重要部分就是条码打印位置的调整。当打印完一个条形码后,需要将打印机坐标调整到下一个条码的打印位置,同时还要判断是否满足了用户设定的列数、行数以及打印数量条件。程序流程如下:
1) 将循环计数器置0,循环开始
2) 将打印机X坐标和Y坐标调整到一页的起始位置。
3) 打印一个条码。
4) 判断是否打满一行。若否,则将X坐标移到下一列起始位置,然后转到7);若是则执行5)。
5) 判断是否打满了一页。若否,则将Y坐标移到下一行,x坐标移到一行的起始位置,然后转到7);若是,则执行6)。
6) 发出换页走纸命令。
7) 将条码号码加1。将循环计数器加1。
8) 判断是否打完了用户指定的数量。若否,则转到3);若是,则执行9)。
9) 发出换页走纸命令。循环打印结束。
下面是程序代码:
‘打印条形码
PrintedNumber = 0 ‘将打印数量计数器置0
Do            ‘循环开始
Call PrintBarcode(Prefix, BarcodeNumberString, X, Y)  ‘调用另一过程打印一个条码
If Column < ColumnNumber Then    ‘若没有打满一行
增刊曹学艳:  电子科技大学学报被EI Compendex Web 收录情况统计分析55 X = X + ColumnSpace          ‘将坐标移动到下一列
Columns = Columns + 1        ‘列计数器加1
Else                            ‘若已经打满了一行
X = LeftMargin                ‘将X坐标移动到左边界
Y = Y + LineSpace              ‘将Y坐标移动到下一行
Columns = 1                    ‘将列计数器置1
Lines = Lines + 1                ‘将行计数器加1
If Lines > LinesInPage Then      ‘若已经打满一页
Printer.EndDoc                ‘发出换页命令
Lines = 1                    ‘将行计数器置1
X = LeftMargin                ‘将X坐标移动到左边界
Y = TopMargin                ‘将Y左边移动到上边界
End If
End If
BarcodeNumber = BarcodeNumber + 1  ‘将条码号码加1
PrintedNumber = PrintedNumber + 1    ‘将打印数量计数器加1
Loop Until PrintedNumber = Amount    ‘若打完指定数量,结束循环
3  窗体及菜单设计
Visual Basic 是面向对象的可视化编程语言,应用程序的用户接口通过窗体及其控件来完成。条形码打印软件是一个比较小型的软件,其用户界面可以设计得相对简单一些。
3.1  窗体及控件的设计
VB应用程序的用户界面一般由一个或多个窗体及设置的窗体上的各种控件组成。程序开始运行时启动的窗体可称为主窗口。我们可以在主窗口上设计以下四个基本控件:
1) 文本框1。用于接受用户输入的条码起始号
2) 文本框2。用于接受用户输入的打印数量
3) 命令按钮1。用于发出打印命令
4) 命令按钮2。用于退出程序
其他窗体及控件可根据需要设置。
3.2  菜单的设计
简单的应用程序只由一个窗体和几个控件组成,可以不要菜单。如果设计的程序比较复杂,通过增加菜单可增强应用程序的功能。用VB的菜单编辑器可以很方便地设计出多级菜单。由于篇幅所限,具体方法就不在此介绍了。有兴趣的读者可以参考VB编程方面的书籍。
以上是程序的主要部分,是组成条形码打印软件最基本的模块。为了提高软件的质量,设计了其他一
些模块,如“打印参数设置”、“打印效果预览”、“打印个别号码”、“条码注释文字”、“条形码长度规格设定”、“从文件调入条码起始号”、“编辑条码起始号文件”、“数据存盘”以及“软件封面”等,并设计了相应的窗体和菜单。为了避免每次打印手工输入条形码起始号的麻烦,还特别设计了条形码号码记忆功能。当每次软件运行时,由软件自动输入条形码起始号,使得软件的功能更加完善,使用更加方便。
参考文献
visual basic pdf
1  黄以. 条形码技术. 北京: 国防工业出版社, 1991
2  于振荣. 条形码实用技术手册. 哈尔滨: 黑龙江科学技术出版社, 1994
3  宋伟. 中文Visual Basic 6.0编程基础. 北京: 清华大学出版社, 1999
4  蒋波, 高雪佳. 用VB设计条形码轻印刷系统. 电子科技, 1999, (3): 32-34