java web调用打印机打印pdf文件

时间:2024-03-06 16:11:22

最近公司要求开发打标系统,在调用打印机方面花了些时间,这里做下整理。

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文件只显示二维码,其他内容是空白的,提示字体问题,由于时间关系就放弃了,需要的可以再网上找下具体操作。