JAVA實現調用打印機打印PDF

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

相關文章
相關標籤/搜索