問題描述:后台系統的多單單據需要各自對應不同的打印機,並且同時打印(LQ-690K 2台,hp激光打印2台)。
一開始的功能是直接在各個單據的頁面上直接放置打印按鈕來打印,最終提出的需求是為了節約時間,提高打印速度,要多台打印機同時連接電腦,每台對應一種單據,同時打印。
后台是基於j2ee的,web打印方式也就那幾種,一是用js,二就是用控件。初始的打印按鈕使用window.print()來打印,已經滿足不了要求,需要有新的方式來實現.中間走了許多彎路,現在將過程中一些思路整理了下:
1、想控制多台打印機,只好在客戶端電腦放置一個java程序,使用java的打印api,從服務器獲取html內容輸出到打印機,但是查看java打印api的使用,很多都局限於對2d圖形的打印(查了很多資料實現不了對html,pdf的直接打印)。
2、中間試圖用js存儲html到本地,轉成pdf打印,最后發現對於分頁,打印都是有問題。
時間有限,最后回來最初的選擇上來,js打印基本是不用指望了,那就控件了,一開始沒有使用控件是打個打印覺得沒必要買控件(大部分功能完善點的都要收費吧)。不過這時候有需要只好找一個,傑表看了貌似有點貴,最后選Lodop來,暫時是會輸出一行水印。
最終的思路就是調用控件針對不同的URL,分別指定到指定序號的打印機打印。考慮到如果有多個地方使用,所以序號的指定放到客戶端電腦了。將打印機序號寫到一個文本文件中,頁面上使用js來讀取打印機序號。
//獲取本地txt文件內容 function getPrinter(){ var fso, tf; fso = new ActiveXObject("Scripting.FileSystemObject"); tf = fso.OpenTextFile("c://printer.txt",1); var content = ""; if(!tf.AtEndOfStream) { content =tf.ReadAll(); } tf.Close(); return content; }
//打印函數 function order(){ var c = getPrinter(); var arr = c.split(","); var index = arr[2] if(LODOP.SET_PRINTER_INDEX(index)){ LODOP.SET_PRINT_PAGESIZE(1,0,0,"A4"); LODOP.ADD_PRINT_URL("2.5cm",15,"20.2cm","100%","${basePath }order.do?method=orderPackagePrintBatch&poid=${tPickingOrder.id}"); LODOP.PRINT(); } }
基本實現了預期的功能。(唯一存在的問題是,現場反饋的針式打印機經常要重啟才能打印,查一下,估計是usb供電問題)