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