最近公司要求开发打标系统,在调用打印机方面花了些时间,这里做下整理。
1、编译工具及环境:eclipse+jdk1.8+tomcat8.5+ireport5.0.1+jasperreports4.5.1+火狐浏览器
2、调用打印机方式可分为两种:
这里是用ireport设计好模板后生成jasper文件,后台调用jasper文件并传输数据生成pdf文件放到项目根目录下的temp文件夹中,这块代码就不放了,即以下的pdfPath为pdf文件的路径,例如:D:xxxapache-tomcat-8.5.53webapps项目名称 empxxx.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;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文件只显示二维码,其他内容是空白的,提示字体问题,由于时间关系就放弃了,需要的可以再网上找下具体操作。