2023年11月30日发(作者:)
C#调⽤Bartender打印
BarTender是⼀款优秀的条形码打印软件,可以⽀持很多种类型的条形码设计和打印,具体⼤家可参考他的官⽹(),这⾥不多介绍。
本来在做SilverLight的东西的,后来项⽬有需求,说要在系统⾥加⼊条形码的设计和打印功能,PM提出两个⽅案,⼀个就是⾃⼰去开发
⼀个条形码设计器,这样的好处就是跟系统的集成使⽤⽐较⽅便,但是开发这个设计器⼜是⼀个⽐较⼤的Task;另外⼀个⽅案就是使⽤客户
原有的BarTender软件,把软件集成到系统中,那么设计部分还是交由BarTender去完成,我们的系统只需开发集成的部分就好。经过商
量,⼤家决定了采取集成BarTender的⽅案,于是就要找⼈去做技术攻关了,跟原来的Partner商量了⼀下,他说想继续深⼊学习
SilverLight,我就想去涉猎更多的东西,于是刚好,分道了~~
在刚开始接触BarTender的时候,发现⽹上的资料很少,我是把他们官⽹上的资料都看了,什么⽩⽪书啊,向导之类的都看了。我们的
系统是做的,通过⼀段时间的学习,知道了BarTender的⼏种集成模式。ActiveX COM集成,Commander的触发式集成,还有
9.0版本后⽀持的.NET SDK的⽀持。简单说说这⼏个⽅式:
1、
ActiveX COM:BarTender在你的机器上安装好后,会在机器上注册⼀个COM,你在程序中可以调⽤这个COM,使⽤他提供的⽅法和属性,进⾏BarTender的程序级控制。这个集成⽅式⽐较实⽤,对BarTender的版本要求
低,不过因为是基本的COM使⽤,所以要求你对COM的接⼝⽐较熟悉,对整个BarTender的调⽤流程和细节⽐较清晰,对于COM接⼝的描述,⼤家可以参考这个帮助⽂档(在SeagullBarTender
SuiteBarTender⽬录下)。
2、
Commander的触发式集成:简单来说,这个是通过配置BarTender,让他监视某个⽂件,当程序⽣成这个⽂件的时候,就会触发唤醒BarTender进⾏打印⼯作,这种⽅式我觉得不⼤好⽤,所以了解也不多,欢迎讨论交流。
3、
.NET SDK:这个是9.0版本开始⽀持的⼀个适⽤于.NET框架的SDK,⾥⾯提供了很多类来进⾏BarTender的控制,由于这个SDK也是⽤.NET编写的,所以对于⽤在.NET下的集成⾮常⽅便,不过由于对版本有要求,所以要
考虑客户的成本来使⽤。
⼀、.NET SDK
我们的项⽬开始的时候是使⽤.NET SDK 的,因为那时都还没有搞清楚客户是需要在服务器打印还是客户端打印,⽼⼤就要求先开始研
究了,这个很⽓⼈!做了许久才说客户要在客户端打印,把之前做的⼀切东西都推翻了~~
.NET SDK⾥⾯分开了两个,⼀个是标准的,⼀个是Server版的,标准的只是简单的开启BarTender进程去处理打印任务,所以当有多个
任务同时打印的时候,就需要⾃⼰去管理任务队列问题;⽽Server版的就是⾥⾯有了任务队列机制,很⽅便的管理任务队列和BarTender的
进程资源。但是Server版需要安装BarTender的Enterprise版才⽀持,ORZ~~什么都是钱~~
1、
SDK其实底层上也是对COM的调⽤,只不过封装了,让开发者更好操作,标准的SDK应该看帮助⽂档没什么问题,⾥⾯对各个类以及他们的⽅法和属
性都做了详细的解释。下⾯给出⼀段代码,⾥⾯代表了最简单的典型使⽤:
⾸先添加引⽤,在.NET的TAB⾥⾯可以找到
然后,在程序⾥添加命名空间引⽤ “using ;”
之后程序的简单使⽤如下:
//new an BarTender engine
Engine engine = new Engine(true);
//use the engine to open a format document to return a LabelFormatDocument object
LabelFormatDocument format = ("c:");
//use the LabelFormatDocument object to print
("Select printer", out messages);
使⽤完成后记得回收相关资源。
2、
对于Server版的SDK,我在这⾥稍微的描述⼀下他的队列管理详细吧,不过单纯使⽤SDK是不需要知道这些东西的,使⽤上跟标准的SDK⼀样简单,
只要参考帮助⽂档和Samples就可以很好明⽩了。写出他的队列管理详细仅供⼤家探讨~~⼤家看这⼀部分源码的时候,要先看⼀下线程的相关知识。
⼆、ActiveX COM
在我呕⼼沥⾎看了好久的SDK,把他的源码反编译出来慢慢研究了⼏个星期后,⽼⼤说要在客户端进⾏打印~~顿时内⽜满⾯~~我跟⽼
⼤说起上⾯的那种先⽣成打印⽂件,再发送到客户端的打印⽅式,⽼⼤说不⾏,最好少跟服务器进⾏通信,因为他们的⽹络环境不怎样~~郁
闷了~~在Senior的提醒下,开始对ActiveX进⾏研究~~主要的思路是想通过做出⼀个ActiveX插件,然后进⼊页⾯的时候在客户端进⾏安装,
然后对客户端机器上的BarTender进⾏控制~~既然是⽤ActiveX,那就使⽤BarTender提供的最简单的COM就⾏了~
COM⾥⾯主要的就那么⼏个类,下⾯⼀⼀详细说明:
1)
Application类:实际上代表⼀个BarTender的进程,当你新建⼀个此类的对象的时候,就会出现⼀个新的BarTender进程。
2)
Format类:实际上代表⼀个格式标签(BTW⽂件),使⽤Application. ()⽅法可以打开并返回⼀个Format对象。这个类⾥⾯包含了打印设置,标签的参数设置等⼀系列的设置,很重要的⼀个
类。
3)
NamedSubString类:管理标签⽂件⾥所有SubString的类。
4)
DataBase类:管理标签⽂件⾥设置的所有数据库链接的类。
5)
QueryPromts类:管理标签⽂件⾥⾯数据库查询参数的类。
鉴于Format类是⽐较重要的类,这⾥再对他的相关属性和⽅法也做⼀下说明:
1) Print⽅法:这个就是最常⽤的打印⽅法,⾥⾯可设置打印的任务名,是否等待打印完成,等待超时时间,打印过程输
出的信息。
2) PrintOut⽅法:如果你需要在打印时出现打印设置对话框和状态框,你可以选择这个⽅法来实现。
3) Save⽅法:保存对Format的更改。
4) SetNamedSubStringValue⽅法:设置某个特定的SubString的值,这⾥就可以作为⼀个动态改变打印内容的⽅法。
5) SetPromt⽅法:跟SetNamedSubStringValue⽅法类似,不过他设置的是打印提⽰的值,某些标签通过设置可以在打印
的时候弹出对话框,输⼊某些变量的值来改变打印内容,这个⽅法就是动态设置这些变量的。不过在集成中⽐较少⽤。
6) IdenticalCopiesOfLabel属性:这个是设置打印时要打印多少份相同的标签的,默认为标签设置。
7) NumberSerializedLabels属性:这个是序列化打印时使⽤的,当你的标签启动了序列化后,这个属性代表的就是打印
的份数,譬如你的序列化初始数据是1,增量为1,NumberSerializedLabels设置为5,那么就会打印出1、2、3、4、
5,五个标签出来。
8) Printer属性:指定要使⽤的打印机,默认为系统指定的默认打印机。
9) PrintToFile属性:标⽰是马上⽤打印机打印出实物,还是⽣成⼀个打印⽂件。
通过上⾯⽅法的解释,⼤家已经看到⾥⾯已经有⼏种动态控制打印内容的⽅式了,我在项⽬中使⽤了上⾯两种,⼀种是直接通过
SetNamedSubStringValue⽅法去设置某些变量的值,然后进⾏打印,这个适合⼩量的打印,因为每次都要调⽤Application和Format对象来
处理,所以打印100份就要调⽤⼀百次,效率低,但是可以灵活设置每次的打印内容;另外⼀种是使⽤序列化打印,这个的效率就⾼了,因
为他是只调⽤⼀次把数据扔给BarTender,之后的都是BarTender根据序列化规则去⽣成打印内容,不过这个⽅式就⽋缺灵活性,只适⽤于
标签的内容是有⼀定的规律进⾏变化的⼤批量打印。
上⾯还提到了DataBase和QueryPromts类,这两个类是⽤在连接数据库的打印中的,这个是我⽤到的第三种动态控制打印内容的⽅法。
主要思路是,在标签⾥设置好各项内容,这些内容都是对应数据库的某些字段,然后设置好查询条件,暴露⼀个或多个查询参数,然后在程
序⾥通过QueryPromts类来设置这些查询参数来查询出不同的数据库内容,达到动态改变打印内容的⽬的。
ryPrompt()可以特定的查询条件,然后通过设置Value属性来设置他的值,最后设置完所有查询条
件后进⾏打印。
关于这⼏种动态控制打印内容的⽅法,都是要设计标签⽂件和程序相互配合的,⽐较不灵活,其实可以做成更好的动态配置⽅式的,不
过⽼⼤说没必要,就放弃了。⾄于要是有朋友不了解标签⽂件的设计,我有时间会写⼀个⽂章来专门说标签⽂件的设计的。
三、集成
有了上⾯的介绍后,⼤家对BarTender提供的集成信息有了⼀定的了解了。我是采⽤了ActiveX COM的⽅式,⽽且我的是客户端打印,于
是我也做了个伪ActiveX插件,为什么叫“伪”呢?因为他不是传统意义上的ActiveX,⽽是⽤C#编写的(悔恨当年没学C++),所以叫“伪”。
关于制作伪ActiveX,⽹上有很好的教程,我这⾥就给个链接算了()。
在做好ActiveX并确定部署好后,在⽹页上调⽤ActiveX插件就需要⽤到JavaScript了,⼤家在部署ActiveX的⽹页上,会有下⾯这样⼀句代码:
这⾥也提醒⼀下,第⼆个属性的名字是classid,然后⾥⾯设置的字符串的开头那⼏个是clsid,是不同的,我当时就在这⾥没注意,部署了好久都不⾏。
回到JavaScript的调⽤上来,在调⽤时,主要就是下⾯的代码:
printClient = new ActiveXObject("lient");
这⾥应该很好理解,就是创建BTDPrintClient这个object对象⾥⾯的PrintClient对象。完成这⼀句后,printClient就等于是⼀个PrintClient的对象了,你可
以在JavaScript⾥⾯调⽤PrintClient的各种⽅法属性了,于是就可以控制本地的BarTender了。


发布评论