趙海龍
(紅天智能科技(天津)有限公司 天津 300300)
目前,國內(nèi)很多打印店都遇到過這樣的問題,用戶打印一本宣傳手冊,需要 500份,通常情況下的操作方式就是打開文件,輸入份數(shù),打印。大多數(shù)打印店用的是中速打印機(jī),速度一般不超過 120張/min。我們假設(shè)宣傳手冊是100頁,那么500份文檔用一臺(tái)打印機(jī)要打7h左右,即使是10頁的宣傳手冊,時(shí)間也要接近 1h。通常,打印機(jī)長時(shí)間連續(xù)工作很容易損壞。由于打印任務(wù)的發(fā)送過程屬于單線程,所以任務(wù)發(fā)送過程中整個(gè)軟件界面是不能進(jìn)行其他操作的,手動(dòng)分配發(fā)送打印任務(wù)到不同的打印機(jī)則耗時(shí)費(fèi)力。
打印機(jī)不同于硬盤或顯卡這類硬件,也不同于鍵盤鼠標(biāo)等外部設(shè)備,它們都屬于即時(shí)響應(yīng)的設(shè)備,而操作系統(tǒng)打印一個(gè)文檔需要的時(shí)間不確定,快的幾秒,慢的需要幾分鐘甚至更長時(shí)間,操作系統(tǒng)不可能一直等到打印任務(wù)處理完。因此,操作系統(tǒng)提供了Spooler服務(wù)來對打印機(jī)的任務(wù)進(jìn)行管理。
為了實(shí)現(xiàn)我們的目標(biāo),對 Windows打印流程進(jìn)行系統(tǒng)分析是非常必要的。圖1展示了應(yīng)用程序發(fā)起打印請求開始,到假脫機(jī)文件的形成,最后完成打印的完整過程。
C#是微軟公司發(fā)布的一種面向?qū)ο蟮?、運(yùn)行于.NET Framework和.NET Core上的高級程序設(shè)計(jì)語言,是一種編譯解釋型語言,其原始代碼被編譯成能夠被.NET框架識(shí)別的編碼,并運(yùn)行在.NET平臺(tái)上。所以,C#是專門為.NET平臺(tái)開發(fā)的語言,與.NET平臺(tái)完美結(jié)合。C#是一種安全的、穩(wěn)定的、簡單的、優(yōu)雅的,由C和C++衍生出來的面向?qū)ο蟮木幊陶Z言。
圖1 Windows打印流程圖Fig.1 Windows printing flow sheet
PDFVIEW4NET是由羅馬尼亞的 O2 Solutions公司開發(fā)的一個(gè).NET工具包,用于在.NET應(yīng)用程序中添加 PDF呈現(xiàn)和打印支持。可將標(biāo)準(zhǔn)的文件轉(zhuǎn)換成 PDF,再將 PDF發(fā)送至打印機(jī)。它用于 Windows窗體、WPF和Silverlight的PDF查看器控件,以及用于從任何.NET應(yīng)用程序呈現(xiàn)和打印 PDF文件的.NET庫。PDF查看器控件具有對 PDF文件的注釋、書簽導(dǎo)航、添加和刪除文件附件以及其他功能的支持。該工具包包含自己的 PDF呈現(xiàn)引擎,它不依賴任何其他軟件來呈現(xiàn)和打印PDF文件。
軟件采用C#編程語言,利用PDFVIEW4NET工具包實(shí)現(xiàn),具體流程如圖2所示。
2.3.1 枚舉打印機(jī)
首先引用 System.Drawing.Printing命名空間,然后通過 foreach(String printerName in PrinterSettings.InstalledPrinters){}遍歷的形式,其中每一個(gè)printerName都是一臺(tái)已安裝的打印機(jī)。再根據(jù)每臺(tái)打印機(jī)的狀態(tài),枚舉出所有空閑的打印機(jī)。
2.3.2 打印參數(shù)的設(shè)置
打印參數(shù)包括紙張類型(如 A3、A4、B5)、打印顏色、單雙面、份數(shù)、打印機(jī)名稱等,信息設(shè)置完成后,存儲(chǔ)到一個(gè)實(shí)體類當(dāng)中,作為線程的參數(shù),分配到每個(gè)任務(wù)上。
圖2 分流軟件流程圖Fig.2 Flow sheet of shunting software
2.3.3 打印任務(wù)份數(shù)分配規(guī)則
打印任務(wù)數(shù)量采取平均分配原則,能夠整除的不需要考慮,對于不能整除的,具體的分配方式是:先計(jì)算份數(shù)除以打印機(jī)臺(tái)數(shù)的商和余數(shù),分配的數(shù)量就是余數(shù)個(gè)(商+1)和(打印機(jī)數(shù)量-余數(shù))個(gè)商,例如,打印份數(shù)為 100份,分配打印機(jī)數(shù)量是 6臺(tái),100÷6=16……4,即每臺(tái)打印機(jī)分配的份數(shù)是 17、17、17、17、16、16;如果分配的打印機(jī)數(shù)量是 7 臺(tái),100÷7=14……2,即每臺(tái)打印機(jī)分配的份數(shù)是 15、15、14、14、14、14、14。
2.3.4 將任務(wù)發(fā)送到打印機(jī)
遍歷打印機(jī)列表,創(chuàng)建 PrinterSettings實(shí)例settings,將打印參數(shù)(紙張類型、打印顏色、單雙面、份數(shù)、打印機(jī)名稱)賦值給 settings,利用帶參數(shù)的線程,Thread(ParameterizedThreadStart)初始化 Thread類的新實(shí)例,指定允許對象在線程啟動(dòng)時(shí)傳遞給線程的委托。在每個(gè)線程里面執(zhí)行Print(settings),即可完成分流打印。
在天津某大型打印連鎖店打印工廠現(xiàn)場實(shí)測。
測試條件:單頁文檔,打印 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
在進(jìn)行了系統(tǒng)測試之后,可以明顯看出,打印任務(wù)分流工具的優(yōu)勢在于,打印機(jī)越多,打印效率越高,打印機(jī)損耗相對越小。該工具能夠降低損耗,提高生產(chǎn)效率,實(shí)現(xiàn)了設(shè)計(jì)初衷。