前言
以前公司用Lodop打印控件,安裝在Chrome瀏覽器。新版的谷歌瀏覽器已經(jīng)不再支持安裝本地插件了?;旧纤蠰odop以及其他類似打印控件的使用者無不詬病其使用變態(tài)。后來使用JasperReport做報表,WEB應(yīng)用可以直接生成HTML,PDF等。本地打印還可以指定打印機。JasperReport支持分組,子報表等;可以設(shè)計出很多復(fù)雜的報表。簡直是一個良心大作。
但是有時候我們打印需要指定打印機,在網(wǎng)頁端不好實現(xiàn)了。需要在客戶機安裝一個打印中間件,提供打印數(shù)據(jù),并讓它實現(xiàn)個性化打印。接下來我們實現(xiàn)這個中間件:
演示


流程圖

系統(tǒng)的復(fù)雜點在于** 網(wǎng)頁 發(fā)送打印數(shù)據(jù)給 本地打印程序 **。思路如下:
本地打印程序(以下稱ClientPrinter),java實現(xiàn)的c/s程序。負責(zé)接收服務(wù)端的打印數(shù)據(jù),并且實現(xiàn)打印。
用戶在網(wǎng)頁點擊打印時,服務(wù)器返回jasper的模板文件和打印數(shù)據(jù)①,然后JS跨域發(fā)送模板文件和打印數(shù)據(jù)到ClientPrinter,ClientPrinter將模板文件和打印數(shù)據(jù)處理生成報表,最后返回結(jié)果給** 網(wǎng)頁 **。
用戶在網(wǎng)頁點擊打印時,服務(wù)器生成JasperPrint對象流數(shù)據(jù)data,并且將data存入緩存;然后把對應(yīng)的key返回到網(wǎng)頁端(更好的辦法是生成唯一url返回到網(wǎng)頁);接著網(wǎng)頁端通過自定義協(xié)議Url Protocol 調(diào)用本地的打印程序,本地程序通過url從服務(wù)端獲取打印數(shù)據(jù),最終完成打印。
*自定義協(xié)議Url Protocol請查看我另一篇博客 自定義Protocol URL從瀏覽器運行本地應(yīng)用
服務(wù)端系統(tǒng)
服務(wù)端需要提供JasperPrint打印數(shù)據(jù)。這里服務(wù)端直接提供JasperReport Studio 報表設(shè)計工具可以點擊這里下載。
//服務(wù)端網(wǎng)頁js
function print(url){
location.href='albertprint://'+url;
}
上面js中的url表示唯一的一個鏈接,這個鏈接返回JasperPrint對象流數(shù)據(jù)。
客戶端打印
public void print(String httpUrl) throws Exception{
Object en = HttpRequestUtil.request(httpUrl);//用上文提供的url從服務(wù)端獲取打印對象流
ResponseEntity re = (ResponseEntity) en;
if(re.getStatus()==-1)throw new Exception(re.getMsg());
printService.print((JasperPrint)re.getObj());//打印
}
最近有點忙,過幾天把PrintClient加入jre打包成exe安裝包,客戶機可以設(shè)置開機啟動或者加入到服務(wù)
用戶端DEMO: PrintClient https://github.com/zyqwst/PrintClient