赵海龙
(红天智能科技(天津)有限公司 天津 300300)
目前,国内很多打印店都遇到过这样的问题,用户打印一本宣传手册,需要 500份,通常情况下的操作方式就是打开文件,输入份数,打印。大多数打印店用的是中速打印机,速度一般不超过 120张/min。我们假设宣传手册是100页,那么500份文档用一台打印机要打7h左右,即使是10页的宣传手册,时间也要接近 1h。通常,打印机长时间连续工作很容易损坏。由于打印任务的发送过程属于单线程,所以任务发送过程中整个软件界面是不能进行其他操作的,手动分配发送打印任务到不同的打印机则耗时费力。
打印机不同于硬盘或显卡这类硬件,也不同于键盘鼠标等外部设备,它们都属于即时响应的设备,而操作系统打印一个文档需要的时间不确定,快的几秒,慢的需要几分钟甚至更长时间,操作系统不可能一直等到打印任务处理完。因此,操作系统提供了Spooler服务来对打印机的任务进行管理。
为了实现我们的目标,对 Windows打印流程进行系统分析是非常必要的。图1展示了应用程序发起打印请求开始,到假脱机文件的形成,最后完成打印的完整过程。
C#是微软公司发布的一种面向对象的、运行于.NET Framework和.NET Core上的高级程序设计语言,是一种编译解释型语言,其原始代码被编译成能够被.NET框架识别的编码,并运行在.NET平台上。所以,C#是专门为.NET平台开发的语言,与.NET平台完美结合。C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。
图1 Windows打印流程图Fig.1 Windows printing flow sheet
PDFVIEW4NET是由罗马尼亚的 O2 Solutions公司开发的一个.NET工具包,用于在.NET应用程序中添加 PDF呈现和打印支持。可将标准的文件转换成 PDF,再将 PDF发送至打印机。它用于 Windows窗体、WPF和Silverlight的PDF查看器控件,以及用于从任何.NET应用程序呈现和打印 PDF文件的.NET库。PDF查看器控件具有对 PDF文件的注释、书签导航、添加和删除文件附件以及其他功能的支持。该工具包包含自己的 PDF呈现引擎,它不依赖任何其他软件来呈现和打印PDF文件。
软件采用C#编程语言,利用PDFVIEW4NET工具包实现,具体流程如图2所示。
2.3.1 枚举打印机
首先引用 System.Drawing.Printing命名空间,然后通过 foreach(String printerName in PrinterSettings.InstalledPrinters){}遍历的形式,其中每一个printerName都是一台已安装的打印机。再根据每台打印机的状态,枚举出所有空闲的打印机。
2.3.2 打印参数的设置
打印参数包括纸张类型(如 A3、A4、B5)、打印颜色、单双面、份数、打印机名称等,信息设置完成后,存储到一个实体类当中,作为线程的参数,分配到每个任务上。
图2 分流软件流程图Fig.2 Flow sheet of shunting software
2.3.3 打印任务份数分配规则
打印任务数量采取平均分配原则,能够整除的不需要考虑,对于不能整除的,具体的分配方式是:先计算份数除以打印机台数的商和余数,分配的数量就是余数个(商+1)和(打印机数量-余数)个商,例如,打印份数为 100份,分配打印机数量是 6台,100÷6=16……4,即每台打印机分配的份数是 17、17、17、17、16、16;如果分配的打印机数量是 7 台,100÷7=14……2,即每台打印机分配的份数是 15、15、14、14、14、14、14。
2.3.4 将任务发送到打印机
遍历打印机列表,创建 PrinterSettings实例settings,将打印参数(纸张类型、打印颜色、单双面、份数、打印机名称)赋值给 settings,利用带参数的线程,Thread(ParameterizedThreadStart)初始化 Thread类的新实例,指定允许对象在线程启动时传递给线程的委托。在每个线程里面执行Print(settings),即可完成分流打印。
在天津某大型打印连锁店打印工厂现场实测。
测试条件:单页文档,打印 800份,测试结果如表1所示。
表1 单页文档测试结果Tab.1 Single-page document test results
测试条件:10页文档,打印 800份,测试结果如表2所示。
表2 10页文档测试结果Tab.2 10 pages document test results
在进行了系统测试之后,可以明显看出,打印任务分流工具的优势在于,打印机越多,打印效率越高,打印机损耗相对越小。该工具能够降低损耗,提高生产效率,实现了设计初衷。