趙海龍
(紅天智能科技(天津)有限公司 天津 300300)
目前,國內(nèi)很多打印店都遇到過這樣的問題,用戶打印一本宣傳手冊,需要 500份,通常情況下的操作方式就是打開文件,輸入份數(shù),打印。大多數(shù)打印店用的是中速打印機,速度一般不超過 120張/min。我們假設(shè)宣傳手冊是100頁,那么500份文檔用一臺打印機要打7h左右,即使是10頁的宣傳手冊,時間也要接近 1h。通常,打印機長時間連續(xù)工作很容易損壞。由于打印任務(wù)的發(fā)送過程屬于單線程,所以任務(wù)發(fā)送過程中整個軟件界面是不能進行其他操作的,手動分配發(fā)送打印任務(wù)到不同的打印機則耗時費力。
打印機不同于硬盤或顯卡這類硬件,也不同于鍵盤鼠標(biāo)等外部設(shè)備,它們都屬于即時響應(yīng)的設(shè)備,而操作系統(tǒng)打印一個文檔需要的時間不確定,快的幾秒,慢的需要幾分鐘甚至更長時間,操作系統(tǒng)不可能一直等到打印任務(wù)處理完。因此,操作系統(tǒng)提供了Spooler服務(wù)來對打印機的任務(wù)進行管理。
為了實現(xiàn)我們的目標(biāo),對 Windows打印流程進行系統(tǒng)分析是非常必要的。圖1展示了應(yīng)用程序發(fā)起打印請求開始,到假脫機文件的形成,最后完成打印的完整過程。
C#是微軟公司發(fā)布的一種面向?qū)ο蟮摹⑦\行于.NET Framework和.NET Core上的高級程序設(shè)計語言,是一種編譯解釋型語言,其原始代碼被編譯成能夠被.NET框架識別的編碼,并運行在.NET平臺上。所以,C#是專門為.NET平臺開發(fā)的語言,與.NET平臺完美結(jié)合。C#是一種安全的、穩(wěn)定的、簡單的、優(yōu)雅的,由C和C++衍生出來的面向?qū)ο蟮木幊陶Z言。

圖1 Windows打印流程圖Fig.1 Windows printing flow sheet
PDFVIEW4NET是由羅馬尼亞的 O2 Solutions公司開發(fā)的一個.NET工具包,用于在.NET應(yīng)用程序中添加 PDF呈現(xiàn)和打印支持。可將標(biāo)準(zhǔn)的文件轉(zhuǎn)換成 PDF,再將 PDF發(fā)送至打印機。它用于 Windows窗體、WPF和Silverlight的PDF查看器控件,以及用于從任何.NET應(yīng)用程序呈現(xiàn)和打印 PDF文件的.NET庫。PDF查看器控件具有對 PDF文件的注釋、書簽導(dǎo)航、添加和刪除文件附件以及其他功能的支持。該工具包包含自己的 PDF呈現(xiàn)引擎,它不依賴任何其他軟件來呈現(xiàn)和打印PDF文件。
軟件采用C#編程語言,利用PDFVIEW4NET工具包實現(xiàn),具體流程如圖2所示。
2.3.1 枚舉打印機
首先引用 System.Drawing.Printing命名空間,然后通過 foreach(String printerName in PrinterSettings.InstalledPrinters){}遍歷的形式,其中每一個printerName都是一臺已安裝的打印機。再根據(jù)每臺打印機的狀態(tài),枚舉出所有空閑的打印機。
2.3.2 打印參數(shù)的設(shè)置
打印參數(shù)包括紙張類型(如 A3、A4、B5)、打印顏色、單雙面、份數(shù)、打印機名稱等,信息設(shè)置完成后,存儲到一個實體類當(dāng)中,作為線程的參數(shù),分配到每個任務(wù)上。

圖2 分流軟件流程圖Fig.2 Flow sheet of shunting software
2.3.3 打印任務(wù)份數(shù)分配規(guī)則
打印任務(wù)數(shù)量采取平均分配原則,能夠整除的不需要考慮,對于不能整除的,具體的分配方式是:先計算份數(shù)除以打印機臺數(shù)的商和余數(shù),分配的數(shù)量就是余數(shù)個(商+1)和(打印機數(shù)量-余數(shù))個商,例如,打印份數(shù)為 100份,分配打印機數(shù)量是 6臺,100÷6=16……4,即每臺打印機分配的份數(shù)是 17、17、17、17、16、16;如果分配的打印機數(shù)量是 7 臺,100÷7=14……2,即每臺打印機分配的份數(shù)是 15、15、14、14、14、14、14。
2.3.4 將任務(wù)發(fā)送到打印機
遍歷打印機列表,創(chuàng)建 PrinterSettings實例settings,將打印參數(shù)(紙張類型、打印顏色、單雙面、份數(shù)、打印機名稱)賦值給 settings,利用帶參數(shù)的線程,Thread(ParameterizedThreadStart)初始化 Thread類的新實例,指定允許對象在線程啟動時傳遞給線程的委托。在每個線程里面執(zhí)行Print(settings),即可完成分流打印。
在天津某大型打印連鎖店打印工廠現(xiàn)場實測。
測試條件:單頁文檔,打印 800份,測試結(jié)果如表1所示。

表1 單頁文檔測試結(jié)果Tab.1 Single-page document test results
測試條件:10頁文檔,打印 800份,測試結(jié)果如表2所示。

表2 10頁文檔測試結(jié)果Tab.2 10 pages document test results
在進行了系統(tǒng)測試之后,可以明顯看出,打印任務(wù)分流工具的優(yōu)勢在于,打印機越多,打印效率越高,打印機損耗相對越小。該工具能夠降低損耗,提高生產(chǎn)效率,實現(xiàn)了設(shè)計初衷。