一种打印绘制图形化文件的通用方法及动态链接库
技术领域
本发明涉及计算机通用打印绘制图形化文件的方法,适用于微软公司的Windows系列操作系统。它由两部份组成,即通用打印绘制方法及打印接口动态链接库(Dynamic Link Lib,即DLL)组成,通用打印绘制工具是一个可独立运行的应用软件,提供了图形化的界面,以绘制打印模版,而打印接口动态链结库提供使用其的应用程序调用,以打印其通用打印绘制工具绘制的打印模版格式的内容,并传递其动态变化的打印内容,输出至打印机的通用接口。
背景技术
随着计算机管理在各行各业越来越广泛的应用,许多行业都需要为本行业定制计算机管理系统,即MIS系统,而MIS系统的难点在于其需求的变化性及行业的特殊性,这为MIS系统开发供应商带来了极大的困难,而MIS系统必然涉及到大量的票据打印以及大量的报表打印,例如医院管理系统(HIS),它一般会有门诊收费收据、挂号单、住院出院发票、住院病人每日费用条、药方领药单、注射单、药库进货单、调拨单等等,报表更是无数,如167报表、E14报表等等, 长期以来,MIS系统开发供应商可以说在开发MIS系统时,花费在打印开发的时间是非常大的,而且用户的需求不断的变化,于是开发商不断的修改程序,以满足用户的要求,这也是造成MIS系统开发举步唯艰的原因之一。以上是针对MIS系统而言,因为MIS系统是最客户化的系统。
对于现有的开发工具而言,一般提供了报表工具,如Visual Basic的Repository,Delphi的QuickReport等,但这些报表工具对票据打印不适合,一是难以绘制,二是修改格式需重新编译程序,可移制性差,三是程序调用复杂,四是使用麻烦,即使对于报表,第二点、第三点、第四点问题也存在。
不论是用C语言、BASIC语言、PASCAL等编程工具在编制各种票据打印时,均要写大量代码,其最关键的是当打印的格式发生变化时,需重新编译程序,而且相互间移制很困难,这为维护及升级带来了极大的困难,也耗费了开发人员大量的时间,并且特别是当别人去接手该应用程序时,更是带来了困难。
发明内容
本发明要解决的技术问题在于,针对在Windows操作系统下(包括windows95/98/2000及windowsNT)下用各种语言编制应用程序时打印的复杂性和维护困难性及移制性,提供一种通用打印绘制图形化文件的方法,当打印的格式发生变化时,无须编译源程序,任何人(不一定是程序员)都可维护;使使用者可图形化的绘制所需打印票据、报表,所见所打,绘制的打印模板存为文件格式,任何语言都可调用,移植性强。任何windows编程语言(如C++、Delphi、Visual Ba等程序调用方便灵活,动态数据传送方便,代码量少,与打印机类型无关,只要打印机正确安装,支持对多打印机,可输出至所需打印机。
本发明采用如下技术方案解决上述技术问题:构造一种打印绘制图形化文件的通用方法,是将线、文字及表格等打印内容作为一个模版来绘制,该模版的内容有许多属性,如页高度、宽度等,将这个模版保存于一个文件中,提供一个可读取这种打印模版文件的动态链接库,采用如下步骤打印绘制任一种图形化格式的文件:
1、用打印绘制工具生成打印模版文件,该文件为一个文本格式的文件;2、通过动态链接库的接口函数读取打印模版文件至一个新的打印页对象;3、读取打印模版文件后,对需打印输出的图形化文件中的动态变化数据进行赋值;在对动态变化数据进行赋值后,4、将整个页对象付之打印输出。
在上述打印绘制图形化文件的通用方法中,所述步骤1中进一步包括如下步骤:
产生一个新的打印模版对象,所述对象是整个绘制的组成单位,分为基本对象,包括线对象、字串对象、表单对象,复合对象,由基本对象组成,复合对象主要是页对象;
为打印绘制工具接受使用者的键盘和鼠标输入,打印绘制工具中设有基本对象线、字串、表格的按钮供使用者使用;
判断使用者是否单击了线、字串、表格的按钮,并进行了相应的辅助操作以产生一个新的对象,如果是产生一个新的对象,进入下一步,否则等待键盘和鼠标输入;
打印模版页对象把其所有的基本对象当作一个链表来管理,当新的对象产生时,自动把该对象加入页对象的链表中;
通过激活链表的对象,给基本对象的属性赋值,基本对象的属性主要有:
<1>线(Line)
有起点及终点的线段,它属打印模版的外观格式对象,可组成许多图形,无动态属性,绘制成什么样,即打印成什么样。
属性:a、宽度 b、类型,如短虚线、虚线等
<2>字串(String)
最常用的对象,它即可静态显示也可动态传递数据,实际上由它和线对象便可满足票据打印页面的需要;
属性:a、字体 b、是否有动态,如果有其动态ID的值 c、是否动态打印时隐藏
<3>表格(grid)
此表格可以编辑其单元格的内容,原则上可由线对象和字串对象组成;属性:a、字体 b、是否有动态,如果有其动态ID的值c、格子隐藏 d、列数 e、行数 f、格式是否固定,即其行数是否可变化,g、如果是非固定格式,其是否影响坐标下面对象的移动h、如果是非固定格式,其是否影响页的移动I、是否隐藏格线J、是否隐藏边框页对象也有属性,其属性主要为:a、页高b、页宽判断是否已不添加对象至模版中,保存打印模版;
保存此打印模版,其保存的方法为:首先保存标识头WXADRAW001,然后保存页对象属性,遍历模版对象链表,保存每一个基本对象的属性,存为一个文本文件。
在上述通用打印绘制图形化文件的方法中,所述步骤2中进一步包括如下步骤:
申请一个新的页对象,然后以读的方式打开打印模版文件;
读取文件的第一行;
判断该行是否为标识1头WXADRAW001,如果不是说明其打印模版文件格式不正确;
在读取标识头为WXADRAW001的情况下,继续读下一行;
根据读取行内容进行处理,然后继续进行读取步骤,当读到End:时表示读到结束,以下为打印模版文件的格式:生成后缀为wxt的文本文件,符合该格式要求的文件可以被RrprintEn.dll的调用,而该类文件也可以再次被Winterface打开修改,也可以直接用文本编辑器,如MicroSoft的记事本、UltraEdit等修改,但必须符合接口文件的格式要求;
除第一行外,每行由一个行头标识构成,是XXX:,其后(指该行)可能有内容或无内容,列如STRINGOBJ:表明一个字串对象,其后无内容,但如果是Point:,表明坐标其后有内容,每行头后的内容之间的分隔符为Tab既ASCII码9;以下表格格式的表示方法为类型+序号:
I整数、N小数、S文本(可以是汉字,也可是英文,或两者混合)、C汉字文本、E英文文本、B真假只有True或False,坐标单位为twip,为1/20像点,1/1440Inch 1/567 MM;
<1>页存为文件有一个文件头WXADRAW001,它是文件的第一行,文件结尾有一个END。
在上述通用打印绘制图形化文件的方法中,所述步骤3中进一步包括如下步骤:
针对对象的动态赋值分两种情况,一种是字串对象,另一种是表格对象才有动态;
对于字串动态赋值情况,在页对象读取打印模版文件后,它把所有的基本对象组成一个链表,因此需遍历链表;
如已经读到链表尾端,表示本次赋值已结束;
在还没有读到尾端时,对读取的对象进行判断,如果该对象尾字串对象且其动态标识(ID)等于所需找的动态ID,把所需赋的字符串值传送给该字串对象,然后重复至上述步骤;
针对表格动态赋值的情况,需遍历链表,找到动态ID为所需动态ID的表格对象;
针对所找的表格对象进行动态赋值,表格的动态赋值便是对其单元格的赋值,对所需要赋值的单元格逐个赋予相应的值即可。
在上述通用打印绘制图形化文件的方法中,所述步骤4中进一步包括如下步骤:
保存打印机当前页的高宽和字体等信息,根据打印模版页对象的属性来确定打印页的高宽和字体等信息;
根据打印模版页对象的属性来设置打印页的高宽和字体等信息,以满足打印页符合设计的需要;
遍历页对象的对象链表,在打印画布上逐个画出该对象的外观,具有动态的对象按照其动态值绘制,具有动态属性的表格对象按其单元格内容绘制;
将画布传于制定的打印机,否则为默认的打印机。
本发明还提供一种用于读取打印模版文件的动态链接库,所述动态链接库中含有多个用于读取打印模版文件的应用程序,动态链接库可以读取由打印绘制工具绘制的打印模版,通过它提供的属性和方法对模版的内容进行处理,如动态值的传递等,并且可以调用它的预览或打印方法预览或打印模版出来。
实施本发明提供的打印绘制图形化文件的通用方法,具有如下优点:打印绘制方法(Winterface)提供了一个图形化的打印模板绘制工具,它提供线、文字及表格把打印内容作为一个模版来绘制,当然该模版的内容有许多属性,如页高度、宽度等等,这个模版保存于一个文件中,这个文件实际上包括了这个打印模板的所有内容描述。在动态链接库(RrprintEn.DLL)提供了大量的读取打印模版的应用程序及方法,它可以读取由打印绘制工具(Winterface)绘制的打印模版,通过它提供的属性和方法可以对模版的内容进行处理,如动态值的传递等,并且可以调用它的预览或打印方法预览或打印模版出来。
本发明将数据与格式分离,为了使各种打印的格式与它所涉及的源程序无关,当打印的格式发生变化时,无须编译源程序,任何人(不一定是程序员)都可维护;使使用者可图形化的绘制所需打印票据、报表,所见所打,绘制的打印模板存为文件格式,任何语言都可调用,移植性强。任何windows编程语言(如C++、Delphi、Visual Ba等程序调用方便灵活,动态数据传送方便,代码量少。与打印机类型无关,只要打印机正确安装;本发明提供的方法还支持对多打印机,可输出至所需打印机。
附图说明
图1是本发明方法的打印步骤流程方框图;
图2是图1中步骤A的具体步骤流程方框图;
图3是图1中步骤B的具体步骤流程方框图;
图4是图1中步骤C的具体步骤流程方框图;
图5是图1中步骤D的具体步骤流程方框图;
具体实施方式
本发明提供的方法是针对一张需按程序打印出来的打印文件样式,认为是由线、文字、表格这些对象组成的,有些对象它是固定不变的,而有些对象是可变的,可以想象就象在一张纸张上填写内容一样,填写前纸张上的东西(对象)便是固定不变,也就是静态对象,填写的内容是可变的,指按不同的需要所填写的内容称之为动态的,因此程序要实现打印这样的内容,是否可以每次打印是只需改变这些动态的对象呢,其次对于这些静态的对象,是否可以用一个与应用程序无关的接口来描述,如一个文件,应用程序只需从该文件读取这些对象的属性就可以了,同时对于动态的对象,它们的位置有一定的要求,这也可以与应用程序无关;基于上述原理,本发明提供如下通用的方法来实现打印绘制图形化文件:
如图1、2所示,步骤A首先使用打印绘制工具生成打印模版文件,该文件为一个文本格式的文件(步骤A由A1、A2、A3、A4、A5、A6、A7组成,见图2)。
步骤A1产生一个新的打印模版对象,对象是该工具的一个基本概念,即对象是整个绘制的组成单位,它分基本对象,包括线对象、字串对象、表单对象,复合对象,由基本对象组成,复合对象主要是页对象。
步骤A2为打印绘制工具接受使用者的键盘和鼠标输入,打印绘制工具有基本对象线、字串、表格的按钮供使用者使用。
步骤A3判断使用者是否单击了线、字串、表格的按钮,并进行了相应的辅助操作以产生一个新的对象,如果是产生一个新的对象,进入下一步,否则等待键盘和鼠标输入。
步骤A4打印模版页对象把其所有的基本对象当作一个链表来管理,当新的对象产生时,自动把该对象加入页对象的链表中。
步骤A5通过激活链表的对象,给基本对象的属性赋值,基本对象的属性主要有:
<1>线(Line)有起点及终点的线段,它属打印模版的外观格式对象,可组成许多图形,无动态属性,绘制成什么样,即打印成什么样。
属性:a、宽度b、类型,如短虚线、虚线等
<2>字串(String) 最常用的对象,它即可静态显示也可动态传递数据,实际上由它和线对象便可满足票据打印页面的需要
属性:a、字体 b、是否有动态,如果有其动态ID的值c、是否动态打印时隐藏
<3>表格(grid)
此表格可以编辑其单元格的内容,原则上可由线对象和字串对象组成;属性:a、字体 b、是否有动态,如果有其动态ID的值c、格子隐藏 d、列数 e、行数 f、格式是否固定,即其行数是否可变化。g、如果是非固定格式,其是否影响坐标下面对象的移动h、如果是非固定格式,其是否影响页的移动I、是否隐藏格线J、是否隐藏边框页对象也有属性,其属性主要为:
属性:a、页高 b、页宽
步骤A6判断是否已不添加对象至模版中,一般是进行了保存动作
步骤A7保存此打印模版,其保存的方法为:首先保存标识头WXADRAW001,然后保存页对象属性,遍历模版对象链表,保存每一个基本对象的属性,存为一个文本文件。
如图1、3所示,步骤B是应用程序通过该工具提供的动态链接库的接口函数读取打印模版文件至一个新的打印页对象(步骤B由B1、B2、B3、B4组成,见图3)。
步骤B1是申请一个新的页对象,然后以读的方式打开打印模版文件。
步骤B2是读取文件的第一行。
步骤B3是判断该行是否为标识1头WXADRAW001,如果不是说明其打印模版文件格式不正确。
步骤B4是在步骤3读取标识头为WXADRAW001的情况下,继续读下一行。
步骤B5是根据步骤3读取行内容进行处理,然后继续步骤4,当读到End:时表示读到结束,以下为打印模版文件的格式:
打印绘制工具的目的是生成后缀为wxt的文本文件,符合该格式要求的文件可以被RrprintEn.dll的调用,而该类文件也可以再次被Winterface打开修改,也可以直接用文本编辑器,如MicroSoft的记事本、UltraEdit等修改,但必须符合接口文件的格式要求。
除第一行外,每行由一个行头标识构成,是XXX:,其后(指该行)可能有内容或无内容,列如STRINGOBJ:表明一个字串对象,其后无内容,但如果是Point:,表明坐标其后有内容,每行头后的内容之间的分隔符为Tab既ASCII码9。以下表格格式的表示方法为类型+序号,用于说明。
I整数N小数S文本(可以是汉字,也可是英文,或两者混合)C汉字文本 E英文文本 B真假 只有True或False
坐标单位为twip,为1/20像点,1/1440Inch 1/567 MM;
<1>页页存为的文件有一个文件头WXADRAW001,它是文件的第一行,这是不能更改的。
文件结尾一定有一个END:,否则读取该文件时会出错。
头 |
格式 |
描述 |
PageSize: |
I N1 N2 N3 N4 |
页大小,只关心N1,N2,N1为页宽,N2为页高 |
DataBase: | |
不用关心 |
<2>线
头 |
格式 |
描述 |
LINEOBJ: | |
表明线开始 |
Name: |
E |
名称(内部使用) |
Point: |
N1 N2 N3 N4 |
坐标,N1起点横坐标N2起点纵坐标N3终点横坐标N4终点纵坐标 |
TabIndex: | |
不用关心 |
Movity(0): | |
不用关心 |
Movity(1): | |
不用关心 |
Width: |
I |
线宽度 |
Style: |
I |
线类型 |
Hide: |
B |
动态打印时是否隐藏 |
LINEEND: | |
线对象结束 |
<3>字串
头 |
格式 |
描述 |
STRINGOBJ: | |
表明字串开始 |
Name: |
E |
名称(内部使用) |
Point: |
N1 N2 N3 N4 |
坐标,N1起点横坐标N2起点纵坐标N3终点横坐标N4终点纵坐标 |
TabIndex: | |
不用关心 |
Movity(0): | |
不用关心 |
Movity(1): | |
不用关心 |
Font:: |
Bi S B2 B3 N |
B1是否黑体S字体名称B2是否斜体B3是否下划线N字体大小 |
Dyn:: |
E I |
E动态ID,I对齐方式 |
Hide: |
B |
动态打印时是否隐藏 |
Str: |
S |
显示文本 |
STRINGEND: | |
字串对象结束 |
<4>表格
头 |
格式 |
描述 |
GRIDOBJ: | |
表明表格开始 |
Name: |
E |
名称(内部使用) |
Point: |
N1 N2 N3 N4 |
坐标,N1起点横坐标N2起点纵坐标N3终点横坐标N4终点纵坐标 |
TabIndex: | |
不用关心 |
Movity(0): | |
不用关心 |
Movity(1): | |
不用关心 |
Font:: |
B1 S B2 B3 N |
B1是否黑体S字体名称B2 |
| |
是否斜体B3是否下划线N字体大小 |
Dyn:: |
E I |
E动态ID,I对齐方式 |
Hide: |
B |
动态打印时是否隐藏 |
Rows: |
I |
最大行数 |
Cols: |
I |
最大列数 |
RowHeight: |
N1 N2 N3... |
每行高度 |
ColWidth: |
N1 N2 N3... |
每列宽度 |
ColAlign: |
I1 I2 I3.. |
每列对齐方式 |
Data: |
S1@S2@S3... |
单元文本 |
GridFrameHide: |
B |
是否隐藏分隔线 |
Fixed: |
B |
是否行数固定 |
GRIDEND: | |
表格对象结束 |
如图1、图4所示,步骤C是说明当读取打印模版文件后,如何对动态变化数据进行赋值的?也是本工具实现打印数据传送的方法(步骤C由C1、C2、C3、C4、C5、C6组成,见图4)。
步骤C1针对对象的动态赋值分两种情况,实际上,只有字串对象和表格对象才有动态,而且字串对象和表格对象的赋值方法是迥然不同的,因此分别给出其实现步骤。
步骤C2是针对字串动态赋值的情况,在页对象读取打印模版文件后,它把所有的基本对象组成了一个链表,因此需遍历链表。
步骤C3如已经读到链表尾端,表示本次赋值已结束。
步骤C4在步骤3没有读到尾端时,对读取的对象进行判断,如果该对象尾字串对象且其动态标识(ID)等于所需找的动态ID,编把所需赋的字符串值传送给该字串对象,然后重复至第步骤C2。
步骤C5是针对表格动态赋值的情况,需遍历链表,找到动态ID为所需动态ID的表格对象,以下步骤是对该表格对象操作的。
步骤C6是由步骤5所找的表格对象进行的,表格的动态赋值便是对其单元格的赋值,对所需要赋值的单元格逐个赋予相应的值即可。
如图1、图5所示,步骤D当通过步骤C进行动态赋值后便可把整个页对象付之打印,步骤D说明了打印的实现步骤(步骤D由D1、D2、D3、D4组成,见图5)。
步骤D1:由于打印页的高宽和字体等信息是根据打印模版页对象的属性来确定的,因此首先应保存打印机当前的页的高宽和字体等信息。
步骤D2:根据打印模版页对象的属性来设置打印页的高宽和字体等信息,以满足打印页符合设计的需要。
步骤D3:遍历页对象的对象链表,在打印画布上逐个画出该对象的外观,具有动态的对象按照其动态值绘制,具有动态属性的表格对象按其单元格内容绘制。
步骤D4:将画布传于制定的打印机,否则默认的打印机。
动态链接库(RrprintEn.DLL)提供了大量可用于读取打印模版的应用程序及方法,它可以读取由打印绘制工具(Winterface)绘制的打印模版,通过它提供的属性和方法可以对模版的内容进行处理,如动态值的传递等,并且可以调用它的预览或打印方法预览或打印模版出来。
在应用程序中采用本方法进行定制打印图形文件,可简化编程人员编制打印部分的工作量,且一劳永逸,该通用打印方法可广泛应用采用Windows环境(Windows 95、Windows 98、Widnows NT、Windows 2000、Windows XP)下编制各种应用程序的打印需要,特别是针对这种管理系统各种发票繁多、修改频繁的特点,其格式与数据的独立性,大大降低了软件的维护成本,使软件使用商可以自己维护各种打印的样式;其采用动态链接库接口方式,其熟悉不同Windows环境下的编程语言的程序员均可方便的使用;其与打印设备的无关性,使程序员不必去关心打印设备;其编程使用的简单、明了让程序员可轻易对付各种复杂的打印需求,极大的提高了开发效率。
更重要的是该方法可以进行扩展,它提供了一个框架,可以进一步进行封装,支持更专业化、更特殊的打印需求。