吴 迪,张润久
(1.天津市市容和园林管理委员会信息中心,天津 300381;2.天津凯舜科技发展有限公司,天津 300384)
依据《天津市户外广告设置管理规定》,除有固定线路运营的公交车辆可以设置车体广告外,其他车辆禁止设置车体广告。企事业单位需要在本单位车辆上设置单位名称和标识的,应按照有关规定提交相关资料报天津市行政许可服务中心市容委窗口办理行政许可手续。
为贯彻这一规定,加强对各企事业单位车辆在车身上设置广告和单位名称(标识)的管理,开发制作了非接触式《天津市车体广告(单位名称、标识)行政许可证》卡。
XID580ie是一款功能强大的证卡打印机,具有双面打印、紫外线防伪打印等功能。车身广告管理卡由1张IC卡和1张ID卡组成,采用此打印机进行手工双面防伪打印。在CardFive软件中设置打印机状态,每套卡需要分别打印2张卡4面共4次,不但工作量大,并且经常出现错打、重打的问题,造成了卡片和人力的浪费。实现自动双面防伪打印成为了迫切的需求。
XID580ie在Windows系统中安装驱动程序后,成为标准的Windows打印机。在打印机属性选项卡中可以设置防伪图片、打印方向等状态,如图1所示。
通过对打印过程的分析,发现在打印过程启动后,打印队列中的内容很快消失,在XID580ie的打印队列控制中有打印内容的显示,并可观察到打印的数量和当前打印的状态,如图2所示。
首先,采用C#设计了Windows打印程序。在Windows API中找到了系统调用DocumentProperties和EnumPrinterData用来获取和设置防伪和打印方向。但是,通过对这些项目的设置,只能打印出无防伪的单面卡片,无法得到双面防伪打印的效果。
然后,通过观察其他的Windows程序,如记事本、写字板也无法在设置了双面防伪的情况下得到正常的结果。观察了CardFive的正常打印过程,但CardFive无法进行二次开发,采用Windows消息的方法可以控制窗口的行为,但是,过程复杂,实现自动打印难度较大。
最后,经过对其他软件的实验,发现使用Word也可以得到正常的打印效果,采用C#重新设计了打印程序,在程序中通过VSTO(Visual Studio to Office)技术自动生成Word文件,并打印该Word文件,经过测试,C#采用VSTO技术的打印程序无法将内容正常发送到打印机。但是,在Word中进行打印总能得到正确的结果,能够在Word中进行编程控制的方法,只有Word宏可以用,至此,采用Word宏生成文件并进行打印成为了最终惟一的选择。
宏在Microsoft Office系列软件中有着广泛的应用,使用Word宏可以调用几乎全部的Windows API函数,宏编程的语言称为VBA(Visual Basic for Applications),宏的开发也使用了与Visual Basic的界面和格式。Word宏可以调用Word中的全部文字处理功能,同时,也可以对操作系统进行操作,具有强大的功能。Word宏编程简单,通过录制宏即可直接生成宏代码,不需要专门记忆。
程序流程如图3所示。
程序启动,开始录入信息,并在屏幕上实现类似所见即所得的效果,IC卡正面屏幕截图如图4所示。
用户确认后,屏幕的内容与屏幕底纹图片被保存为jpg格式的图形文件。
设计Word模版文件用来对IC卡和ID卡分开处理,并保存打印机和页面设置等信息。
在C#中采用Process.Start方法启动Word并打开指定的模版文件。Word启动后,会自动执行AutoOpen宏,后续的程序都在这个宏中运行。使用宏Selection.InlineShapes.Addpicture装载生成的图片文件,并使之充满页面,使用ActiveDocument.SaveAs另存为指定的文件名留作备份,另存的另外一个目的是防止在窗口关闭时出现确认对话框。而后,调用Application.PrintOut宏进行打印。打印必须使用后台方式进行,命令发出后,打印队列中的数据需要发送到打印机,此时需要主程序继续等待一段时间,否则将导致无法打印。打印内容发出后,主程序通过向Word发出WM_QUIT消息关闭Word,继续下一张卡的录入。
采用Word宏,需要在Word宏安全性中进行设置,如图5所示。
采用Word宏会降低系统的安全性,但是,在没有外网的环境中,这个设置还是可以接受的。
键盘输入控制。在程序中对全部的文本框(TextBox)的按键事件进行了处理,按回车键可以将光标自动跳转到下一个文本框。实现了无鼠标操作。
输入法控制。车辆类型、标识内容等项目,不需要输入数字,只能输入汉字。在这些输入项目中,程序控制自动启动汉字输入法。标识规格联系电话等需要输入的内容全部是数字,在光标进入标识规格文本框时,自动切换到英文键盘输入状态。
输入内容控制。在批量录入的情况下,大部分输入内容是相同的,针对可能重复录入的内容,在该项目录入完毕后自动保存到注册表。下次录入的时候,仍然会显示前面的结果。这样也减少了程序意外终止造成的重复录入。
流程控制。按照上报的顺序设计了输入流程,卡片每一面作为1个对话框输入,每个对话框都提供了预览功能,使用者可以随时看到最终打印的结果。
文字位置控制。程序可以根据输入内容的多少在一定范围内自动调整位置和字体大小,尽可能保证文本的均匀分布。
采用Word宏进行打印的方法,具有一定的普遍性,随着软件功能的丰富,经常会出现某个功能很好用,但是,自己的程序中却无法调用的情况,并且,在没有开发文档的情况下,采用程序调用另外程序的方法得到最终的结果,应当是最现实并且最可能实现的途经。
通过以上方法设计的程序,从2012年3月试用,经过不断修改,7月正式使用。至今运行超过1 a,在Word 2003和Word 2007下都取得了同样的效果。程序运行稳定,差错明显减少,极大提高了打印速度和正确率。在城市车体广告管理方面,节省大量成本,提高工作效率。
[1]Schildt H.C#完全手册[M].朱德爽,胡凤燕,胡复明,译.北京:电子工业出版社,2002.
[2]何振林,胡绿慧.MS Office与VBA高级应用案例教程[M].北京:中国水利水电出版社,2010.