zoukankan      html  css  js  c++  java
  • java web调用打印机打印pdf文件

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

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

  • 相关阅读:
    Python3标准库:fnmatch UNIX式glob模式匹配
    Python3标准库:glob文件名模式匹配
    Python3标准库:pathlib文件系统路径作为对象
    Python3标准库:os.path平台独立的文件名管理
    Python3标准库:statistics统计计算
    36-Docker 的两类存储资源
    第四章-操作列表
    35-外部世界如何访问容器?
    34-容器如何访问外部世界?
    33-容器间通信的三种方式
  • 原文地址:https://www.cnblogs.com/Mrshuang11/p/12759794.html
Copyright © 2011-2022 走看看