天天看点

利用JQuery在网页上打印PDF

项目需求是这样的,在HTML网页上点击打印,然后弹出chrome打印窗口,窗口中是后台生成的PDF文件。其中PDF文件是由后台servlet生成的。

第一种想法是,点击打印时,弹出一个新的窗口

在这个新的页面中有PDF文件的内容,而且网页上也刚刚有打印的功能,这种看起来是最简单的,但是对用户而言,需要点击二次按钮才能真正打印。所以,用户体验不会太好。

第二种想法是利用iframe,将PDF文件的内容包含其中,这个时候调用window.print()来弹出打印窗口。

//创建一个空的iframe,因为如果每次请求都生成PDF,那么是不必要的。
<iframe style="display:none" id="printIframe"></iframe>

$(document).ready(function(){
    ....
    $("#printIframe").load(function(){//等待iframe加载完成后再执行doPrint.每次iframe设置src之后都会重新执行这部分代码。
        doPrint();
    });
    ....
});
//点击打印按钮,触发事件】
function printPDF(){
    var src = $("#printIframe").attr("src");
    if(!src){//当src为空,即第一次加载时才赋值,如果是需要动态生成的话,那么条件要稍稍变化一下
        $("#printIframe").attr("src","./attachment/Images.pdf");//暂时静态PDF文件
    }else
        doPrint();
}
function doPrint(){
    $("#printIframe")[].contentWindow.print(); 
}
           

一般的用法是使用window.print()方法来打印,但是当调用window.print()方法时将会显示的是网页正文的内容,而不是iframe的过程,有的网友说把网页的focus置为iframe即可,但是我调研了半天没找到一个好方法。

于是我想window只是一个对象,那么如果我能获取到iframe的window对象不就可以了?于是用了contentWindow的方法,果然好使。

这种方法看起来会更清爽一些,然后用户体验也还行。