JAVA實現調用打印機打印PDF,網上搜索了一大把資料,基本上都是重複。。。下面罵人的一大堆。。我這裏來解決一下。html
需求:前端調用用接口 後端根據模版生成數據聯通打印機直接一鍵打印! 前端
思路:這裏講一下打印最好使用pdf去打印。無論是word.excel 都是經過轉PDF 再打印出來的。因此我這裏的思路就是 選擇模版生成文件,而且打印。java
我這裏選擇html模版 也就是freemark模版。後端
一、經過vm文件生成html 數組
二、經過html再轉成 pdf 服務器
三、調用打印機方法打印運維
可能這有人問爲啥不用 word模版。我這裏說明一個坑。若是是模版網上解決方案基本上是 xml格式的。xml格式的word轉pdf是很困難的。至少我沒找到合適的方法去轉。socket
本文的第一步第二部 就不介紹了 在個人 另外一篇博客中有講到。 html轉pdf 中有講解 本文重點介紹 調用打印機的方式!工具
調用打印機驅動的我目前實驗了 網上全部的方法,查了不少資料。大概摸出了兩種最有效的方式。spa
第一種 java調用打印機:在本機安裝驅動,利用java代碼去調用進行打印。若是你的代碼是在服務器上那麼就須要在服務器上安裝驅動。
代碼以下:
/** * 經過本機默認打印機打印pdf文件 * @param filePath 文件路徑 * @throws Exception */ public static void defaultPrintPDF(String filePath) throws Exception{ logger.info("打印工具類入參:filePath==================="+filePath); File file = new File(filePath); // 獲取選擇的文件 // 構建打印請求屬性集 HashPrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); // 設置打印格式,由於未肯定類型,因此選擇autosense DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF; logger.info("打印文件類型爲:==================="+flavor); //pras.add(MediaName.ISO_A4_TRANSPARENT);//A4紙張 //遍歷 // PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras); // // for (PrintService printService2 : printService) { // logger.info("本機可以使用打印機列表:==================="+printService2); // } // 定位默認的打印服務 PrintService defaultService = PrintServiceLookup .lookupDefaultPrintService(); logger.info("打印工具選擇打印機爲:==================="+defaultService); try { DocPrintJob job = defaultService.createPrintJob(); // 建立打印做業 FileInputStream fis = new FileInputStream(file); // 構造待打印的文件流 DocAttributeSet das = new HashDocAttributeSet(); Doc doc = new SimpleDoc(fis, flavor, das); job.print(doc, pras); } catch (Exception e) { e.printStackTrace(); logger.info("打印異常",e); throw new Exception(); } }
原本這種方式是OK的 可是咱們的運維人員說 服務器安裝打印機的紙張沒辦法更改,須要重啓服務器。重啓服務器咱們都不肯意。因此改用第二種方式。
第二種:java無驅實現鏈接打印機打印PDF
代碼以下:
/** * 經過 IP+端口 鏈接打印機打印文件 * @param filePath * @throws Exception */ public static void print2(String filePath,String ip) throws Exception{ File file = new File(filePath); // 獲取選擇的文件 Socket socket = new Socket(ip, 9100); OutputStream out = socket.getOutputStream(); FileInputStream fis = new FileInputStream(file); //創建數組 byte[] buf = new byte[1024]; int len = 0; //判斷是否讀到文件末尾 while((len=fis.read(buf)) != -1) { out.write(buf, 0, len); } //告訴服務端,文件已傳輸完畢 socket.shutdownOutput(); socket.close(); fis.close(); }
打印的過程當中:
一、 第一種方式:好比紙張設置。若是裝了驅動直接叫運維人員選擇紙張大小,固然代碼也能夠設置 儘可能少動手嘛
二、第二種的紙張大小能夠在html轉pdf的時候設置一下,
以上就是我要介紹的。若是你有更好的方式能夠聯繫我。
開發中又遇到什麼問題能夠在下面留言哦 我會回覆的。也能夠加QQ羣:600922504