admin管理员组

文章数量:1539988


2024年6月20日发(作者:)

维普资讯

第27卷 

第8期 

计算机工程与设计 

2006年4月 

VO1.27 

NO.8 

Computer Engineering and Design Apr.2006 

斑马条码打印机打印系统的设计与开发 

杨迎新, 马月坤 

(河北理工大学计算机与自动控制学院,河北唐山063009) 

摘要:系统主要是为斑马打印机在SuperMarket2.0系统下调用而开发的打印机驱动软件,是在Delphi7.0企业版开发平台上 

实现的。Zebra条码打印模块完成的任务是根据输入信息生成相应ZPL指令集,并输入到Zebra打印机中,由Zebra打印机解 

释执行,打印出条码标签,包括时汉字、英文、数字、条码和方框等时象的处理和打印。介绍了该系统设计和实现的关键技术 

关键词:斑马条码打印机;ZPL指令集;Delphi 7.0;SuperMarket 2.0;动态链接库 

中图法分类号:TP301 文献标识码:A 文章编号:1000.7024(2006)08.1486.03 

Design and realization of zebra BarCode printer print system 

YANG Ying—xin,MAYue—kun 

(Institute of Computer and Automation,Hebei University of Technology,Tangshan 063009,China) 

Abstract:This system is a printer driver software ofthe Zebra BarCode Printer in order that it can be tmsfler in the SuperMarket 2.0 sys- 

tem based on Delphi 7.0.The task ofthis print model is given ZPL instruction nad input Zebra printerand print the barcode label,include 

the process nad print of some o ̄ect is given,such as chinese,lettre, figure,bar code nad pane etc.The design nad realization of some 

key technology rae introduced. 

Key words;zebra barCode printer;ZPL instruction;delphi 7.0;supermarket 2.0;DLL 

0引 言 

在该模块中,操作者主要负责选取数据源的数据,数据的 

选取工作是由POWERBIULD7.0系统来实现的,首先由PB程 

斑马打印机自身携带的驱动程序不能很好地和现有的应 

序为各个对象的不同属性分别赋值,然后在本系统模块中由 

用软件系统紧密结合,从而限制了斑马条码打印机在应用系 

各个对象根据自身属性值生成自己的ZPL指令集,最后打印 

统中的使用。为了解决这一问题,我们开发了斑马打印机条 

机对象对添加进来的ZPL指令集进行封装处理后发送到打印 

码打印系统。该系统是利用Delphi 7.0企业版开发的应用于 机。实现该功能时,首先找出需求中需要系统识别的数据,从 

在Windows2000操作系统下开发的应用软件系统的斑马打印 而进一步确定系统需要处理的对象:汉字、英文、数字、条码和 

机驱动模块。该模块完全替代了打印机自带的打印驱动程 方框等,如图2所示。 

序,是完全定制于我们所开发的应用系统的一个嵌入式组成 

部分,通过这种方法实现了打印模块和业务系统的无缝连接。 

1 系统设计 

该系统的主要功能是设计Zebra条码打印模块,该模块能 

够根据输入信息生成相应ZPL指令集,并输入到Zebra打印 

一 

Zebra打印机 

机中,由Zebra打印机解释执行,打印出条码标签。以下域模 

型描述了本系统模块人与计算机的结合模型(如图1所示)。 

图2对象阵列 

上述抽象出的对象在数据库表中各用一个字段来表示, 

各字段对象间无直接联系,各个对象字段与打印机对象主要 

通过各字段打印机对象的AddField函数发生交互(如图3所 

示)。每个字段对象在设置完各种属性后,在提取每个字段的 

ZPLS ̄属性或汉字字段的ResZPLs属性时,将会自动根据已 

图1 Zebra打印模块域模型 

经赋值的其它属性自动生成ZPL指令,然后通过ZebraPrinter 

收稿日期:2005.01.15。 

作者简介:杨迎新(1972--),女,河北唐山人,讲师,研究方向为多媒体、数据库编程和B/S结构程序设计; 马月坤(1976一),女,河北唐山 

人,助工,研究方向为面向对象程序设计和数据库编程。 

・—-

1486-—— 

维普资讯

对象的AddField0方法将每个字段对象所生成的指令字符串 

添加到ZebraPrinter对象中,由ZebraPrinter对象负责处理并传 

输到打印机中,控制打印机进行打印。 

图3系统交互 

2主要实现技术 

2.1 ZPL指令集 

对于每一个对象,都定义了许多字段及相应的属性和方 

法,从而形成类。进而形成ZPL指令集。表3给出了打印机对 

象的类视图。 

表3打印机对象类 

字段; 

1.strLPTPortName【String】【端口名】【Private】 

2.strResZPLs[String】【要传送的指令】[Pfiv ̄e] 

属性: 

1.LPTPertName[String】【端口名】【suLPTPortName] 

方法: 

1.WfiteZPLToLPTPort(Const ResZPLs:String); 

[向并行端口发送数据】[Private] 

2.GetPortName 0[String】 

[返回占用的并行端口名称】[Private] [属性LPTPortName】 

3,SetPortName(const Value:String); 

[设黄程序占用的并行端口][Private] [属性LPTPortName】 

4.AddField(Const iXPos:Integer;Const iYPos:Integer;Const ResZPLs; 

String);[Public】 

[向打印机对象加入各种字段的ZPL】【Public)【外部调用] 

5.Print():[Public】【打印条码】[Public】【外部调用] 

6.SctDotsPerMillimeter(bValue:Boolean);[Public】 

[设置每毫米打印点数]【Public】【外部调用】3.2 Win 2000下并L_】操作 

在Windows 2000下,系统不再允许应用程序直接访问并 

口,且系统并未像串口一样提供相应API。因此只能将并口视 

为文件进行访问。在向并口发送数据和接收数据时,应建立 

两个不同线程分别对并口进行数组接收和数据发送。 

对于单向并口,接收线程在接收并口发送过来数据时应 

判断一下现在发送线程是否正在运行,如发送线程正在运行 

则接收线程读取的内容将为尚未发送到打印机的内容。 

在发送线程向并口发送数据时,需要将收集来的ZPL指 

令集字符串分割成略小于Zebra打印机缓冲区的数据段,然后 

发送,否则将会造成数据丢失。 

2.3汉字打印 

Zebra S-400打印机硬件本身不携带汉字字库,通常情况 

下ZebraS-400打印机无法打印汉字。要使ZebraS-400打印机 

打印出汉字,必须将所打印出的汉字视为一幅图像,令打印机 

按照打印图像的方式来打印汉字,即必须得到汉字点阵。 

获取汉字点阵有两种比较常用的方式,现在本系统采用 

的获取汉字点阵的方式是,在内存中创建一幅BMP图像,然 

后在BMP图像表面直接书写汉字,书写汉字完毕后根据图像 

表面不同颜色,获得汉字点阵数据。另外一种方法是使用 

UCDOS汉字字库。查找在UCDOS字库中起始位置和中止位 

置,两位置之间数据即为该汉字点阵数据。 

这两种获取汉字点阵数据的方式中,采用图片方式时最 

终生成的点阵数据量略大于采用字库方式,计算速度也稍慢。 

但是,采用图片方式可以任意选用Windows中的TrueType字 

体,在放大缩小时,不会产生字符变形情况 另外,Windows字 

库中。汉字数=垦远远大于UCDOS字库中汉字数量。采用图片 

方式提取汉字点阵基本不会发生汉字不在字库中的问题:采用 

此方式可以使用任意的TrueType字体,其精美程度远远超过采 

用UCDOS点阵的方式:且采用该方式不需要携带多余字库。 

在现在采用的以图片方式显示汉字的时候,还有两个地 

方至关重要。首先是图片大小,如果图片太大,则最终产生的 

数据太多,将会使数据传输时间拉长:如果图片太小,则无法 

完全正确地提取汉字点阵数据,将来打印出来的汉字将会出 

现断字等情况。 

在向BMP位图表面书写汉字的时候。必须采用Windows 

API函数直接书写,如果采用Delphi或VC++自带的函数。由 

于事件响应机制的不同,在PB调用时,会产生汉字尚未书写, 

程序却已经将点阵提取完毕的情况,这样提取出来的点阵其 

二进制字符串全部为0,无法正确打印汉字。另外,在向BMP 

表面书写汉字的时候,不要按常规采用TextOuti或TextOutEx 

API函数。而要采用DrawTextEx函数。这样,当汉字字符串过 

长时,可以自动换行。 

在设置图片大小的时候,程序必须将输入的数据重新计 

算一下,使之成为8的整数倍,因为在ZPL指令集中向打印机 

上载图片的指令需要向打印机传递整幅图片字节量和单行图 

片字节量,而通过图片方式得到的汉字点阵为一个由0和1组 

成的二进制字符串[0表示白色。l表示黑色],每个二进制位代 

表一位数据,在计算得到字节量时,如果图片的长和宽不是8 

的整数倍,则最后无法精确计算出字节量,此时将数据传入打 

印机后,无法正确打印汉字,而将打印出花屏。 

下面的程序段是这一部分的核心代码片段 

Function GetZIKU(strlnPut:String):String; 

{ 

AssignFile(HZK16,’hzkl6 ); 

FileMode:=O: 

I Set(HZKl 6): 

k: ̄Trim(strlnPut); 

i:=((0rd(kfl1).161)*94+(ord(k[2])-161)) 32; 

Seek(HZK1 6d); 

n:=1: 

Str:=”; 

for liCount:=1 to 32 d0 

begin 

Read(HZK1 6,i[n1); 

strTemp:=IntToHex(Ord(i[n]),2)+tH’; 

if((n mod 8)c O)then 

-——

1487-—— 

维普资讯

begin strTemp:=strTemp+’,’;end; 

函数中,根据需要打印的条码的版型,分别创建若干字段对象 

ifstrTemp[1]>’9’then 以代表条码中不同的字段。并根据字段相应取值为创建完毕 

begin strTemp: ’0’+strTemp;end; 

的各个字段对象赋值,当所有字段赋值后,创建打印机对象, 

str:=str+strTemp; 

并将创建的对象所生成的ZPL指令字符通过打印机对象的 

ifnmod 8=0then 

AddField函数添加到打印机对象中。添加后,调用打印机对 

begin str:=str+char(13)+cha ̄10);end; 

象的Print函数开始打印一版条码。 

n:-n+1; 

end; 

4结束语 

Result:=str; 

本系统的实现是多位教师共同努力的结果。该系统已经 

{ 

应用于多家超市,反映效果良好 由于该系统代码较多。这里 

forn:=l t0 l6 do 

就没有给出代码的具体实现。 

begin 

q【n】:=p【n】 256州n+l 6】; 

参考文献: 

end; 

I1l1 张桂永.API for Windows 2000/XP详解【M】.北京:清华大学出 

strTemp:=copy(inttohex(w,4),3,2 H’; 

版社,2003.30-90. 

if((2*m mod 8)<>O)then 

飞思科技.Delphi 7高级应用开发【M】.北京:电子工业出版社, 

begin strTemp: strTemp+','; 

2003.15O.165. 

end; 

Anton Eliens.面向对象软件开发原理【

旧 

M】.北京:机械工业出版 

ifstrTemp[1]>’9’then begin strTemp:=’0’+strTemp;end; 

社。2003.180-213. 

str:=str+strTemp; 

孙晋文,肖建国.自动文本分类中的智能处理技术[J].计算机科 

) 

学,2003,3O(8):l 8-2O. 

} 

张志猛,庄越挺.面向对象软件的逆向工程【J】_计算机发展与研 

在使用图片方式提取汉字点阵的时候,需要以循环方式扫 

究,2003,(7):l062-l065. 

描图片的每一个像素,确定该像素颜色,以生成二进制字符串。 张鹏,唐发根.软件架构设计在XP方法中的实施【J].计算机工 

但是在循环到面的时候,必须以列为基准,否则将打印花屏。 

程与应用,2003,(33):106-108. 

3 DLL外部调用部分修改维护 

张玉珍,颜廷睿.DLL及其在delphi中的应用【J].计算机时代, 

2005,(1):45.46. 

当程序需要修改时,只需要改动Delphi的主要导出函数,该函 

吴小林,蒋先刚.基于delphi的多层数据库应用系统连接技术 

数参数原型如下:Zebra.Printer(Flag:PChar):Integer;Stdcall;在该 

的研究【J].华东交通大学学报,2005,(1):66-70. 

(上接第1485页) 

报表栏数据多时,更让人不能接受。为了解决这种问题,我们 下行,同时执行速度要比画线方法快多倍。 

采用一种变通方法,主要是在模板里增加初始数据行为3行, 

然后复制中间行即可。例如,我们要输出下面表1的报表。 

4结束语 

对于这样的表我们可以建立如表2所示的报表模板。 总之,我们利用多线程技术有效地实现了对Excel报表模 

板的自定义设计,并且利用AutoWrap0函数使系统不受具体 

表1最终输出报表格式 

Excel版本限制 此设计已用于物流信息管理系统,并取得了 

栏名1 栏名2 栏名3 栏名4 栏名5 栏名6 

较好的效果。 

参考文献: 

【1】 马宁,蒲浩,詹振炎.Excel表格自动输出【J].计算机应用,2000, 

2O(7):70.72. 

[2】 于宏文.在程序中利用Excel的模板和名字制作灵活和便于修 

改的报表【J].微型电脑应用,2002,18(7):58.59. 

【3】 郑存红,胡荣强,赵瑞峰.VC++程序数据在Excel中的动态显示 

【J].武汉理工大学学报(信息与管理工程版),2002,24(5):39.4 1. 

【4】 陈清华,潘地林.用VC结合Excel实现煤矿机械试验报表制 

作【J1.煤矿机械,2004,(4):59.61. 

这样我们在插入新的行时只需将栏名下的第2行复制到下面 

【5】 陈国华.基于Excel的报表引擎的研究与设计【J】_计算机工程 

即可,这样不仅保证了格式一致,而且将上行的计算信息带到 

与设计,2004,25(4):526 529. 

-——

1488-—— 


本文标签: 打印机打印系统数据对象