java web調用打印機打印pdf文件


最近公司要求開發打標系統,在調用打印機方面花了些時間,這里做下整理。

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文件只顯示二維碼,其他內容是空白的,提示字體問題,由於時間關系就放棄了,需要的可以再網上找下具體操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM