最近公司要求開發打標系統,在調用打印機方面花了些時間,這里做下整理。
1、編譯工具及環境:eclipse+jdk1.8+tomcat8.5+ireport5.0.1+jasperreports4.5.1+火狐瀏覽器
2、調用打印機方式可分為兩種:
這里是用ireport設計好模板后生成jasper文件,后台調用jasper文件並傳輸數據生成pdf文件放到項目根目錄下的temp文件夾中,這塊代碼就不放了,即以下的pdfPath為pdf文件的路徑,例如:D:\xxx\apache-tomcat-8.5.53\webapps\項目名稱\temp\xxx.pdf,
下邊直接放代碼。
(1)調用服務端的打印機(優點:可以實現一鍵打印 缺點:就是需要客戶端共享打印機給服務器,運維同事說如果服務器斷電了重啟就得重新配置打印機,所以這不是我的最終方案)
String printName = "xxxx";// 打印機的名稱 boolean isChoose = false; //是否有對應打印機 File file = new File(pdfPath); PDDocument document = PDDocument.load(file); // 讀取pdf文件 PrinterJob job = PrinterJob.getPrinterJob(); // 創建打印任務 // 遍歷所有打印機的名稱獲取到指定的打印機 for (PrintService ps : PrinterJob.lookupPrintServices()) { String psName = ps.toString(); if (psName.equals(printName)) { isChoose = true; job.setPrintService(ps); break; } } if (isChoose) { job.setPageable(new PDFPageable(document)); Paper paper = new Paper(); paper.setSize(227, 142);// 設置打印紙張大小 :長度(mm) * 72/25.4 我這里是80mm*50mm paper.setImageableArea(0, 0, paper.getWidth(), // 設置打印位置/坐標 paper.getHeight()); PageFormat pageFormat = new PageFormat(); pageFormat.setPaper(paper); Book book = new Book(); // 設置一些屬性 是否縮放 打印張數(document.getNumberOfPages()是pdf文件的頁數)等,這里選擇實際尺寸 book.append(new PDFPrintable(document, Scaling.ACTUAL_SIZE), pageFormat, document.getNumberOfPages()); job.setPageable(book); job.print();// 開始打印 } //刪除文件 if (file.exists()) { file.delete(); }
(2)調用客戶端(本地)的打印機(js實現瀏覽器調用打印機)(優點:直接調用本地打印機,不需配置。缺點:會彈出打印提示框,多了一步操作)
調用后台生成pdf文件,並將文件路徑傳到前台,在頁面添加以下代碼,這里我是在頁面顯示出來,相當於打印預覽(不想顯示則在style中加上display:none,這里發現加上之后打印出來是空白的,后面有時間再調試)
<iframe style="font-weight:bold;width:100%;height:300px" id="printIframe"></iframe>
在點擊打印按鈕觸發方法中添加以下代碼
var arr = data.pdfPath.split("項目名稱\\");<!--data.pdfPath是從前台返回的pdf路徑,我們只需要取到項目名稱后的路徑--> $("#printIframe").attr("src", arr[1]);<!--加載iframe的src,將pdf文件加載進來--> setTimeout(function() { document.getElementById('printIframe').contentWindow.print(); }, 500);
點擊后會彈出打印提示,如果是默認打印機,點擊打印即可(打印機需要先設置好紙張大小)
補充一下:以上方式必須在win7或以上系統,xp支持的火狐瀏覽器版本太低,不支持打印iframe。
調用客戶端的打印機在網上查到可以使用lodop插件,可以實現一鍵打印,但是打印內容會自動添加試用版幾個字,需要購買才可以去掉,或者預覽后再打印也可以去掉,但還是多了一步操作,所以我就沒進行下一步了。
還有一種方法是客戶端安裝adobe reader,java后台調用執行AcroRd32.exe直接進行打印,這個確實可以實現,但因為我安裝的adobe reader打開標簽pdf文件只顯示二維碼,其他內容是空白的,提示字體問題,由於時間關系就放棄了,需要的可以再網上找下具體操作。