利用JQuery在網頁上列印PDF
阿新 • • 發佈:2019-01-29
專案需求是這樣的,在HTML網頁上點選列印,然後彈出chrome列印視窗,視窗中是後臺生成的PDF檔案。其中PDF檔案是由後臺servlet生成的。
第一種想法是,點選列印時,彈出一個新的視窗
window.open(url,"_blank");//url為生成PDF的url
在這個新的頁面中有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")[0].contentWindow.print();
}
一般的用法是使用window.print()方法來列印,但是當呼叫window.print()方法時將會顯示的是網頁正文的內容,而不是iframe的過程,有的網友說把網頁的focus置為iframe即可,但是我調研了半天沒找到一個好方法。
於是我想window只是一個物件,那麼如果我能獲取到iframe的window物件不就可以了?於是用了contentWindow的方法,果然好使。
這種方法看起來會更清爽一些,然後使用者體驗也還行。