前端網頁打印插件print.js(可導出pdf)


 

 

在前端開發中,想打印當前網頁的指定區域內容,或將網頁導出為多頁的PDF,可以借助print.js實現,該插件輕量、簡單、手動引入、不依賴其他庫。示范項目github:https://github.com/lemoncool/print-demo。打印或導出PDF后效果很好,下圖是對比圖:

關於print.js


 功能:網頁打印插件,支持打印或不打印指定區域,並且它還支持將網頁導出為pdf。前提是可以接受該交互效果。

  • 已實現:

  原生js書寫

  不依賴其他庫可指定打印(或不打印)的區域

  支持定制css,內聯、外聯均可

  支持select、input(text、redio、checkbox)、textarea獲取參數

  • 待驗證:

  目前測試谷歌瀏覽器運行正常,其他低版本瀏覽器兼容性待驗證

如何使用


 本插件可在 js 或 vue 項目中使用,其他框架未驗證。兩種使用場景引入的 js 大同小異。

1、聲明打印區域:

可通過設置 class 類名或 id 指定打印區域,但vue項目涉及到打包部署,推薦使用 ref 獲取DOM節點,如果使用 id 或 class 獲取,打包部署后打印內容可能顯示空白。

<div class="printDom">指定打印區域</div>
 
<div id="printDom">指定打印區域</div>
 
<div ref="printDom">指定打印區域</div>

2、調用打印方法:

2.1 js 項目
// 引入
<script src="print.js"></script>
 
// 調用
Print('#printDom',{});
2.2 vue 項目

main.js引入,xx.vue頁面引用

//main.js
import Print from './print';
Vue.use(Print);
 
// xx.vue
this.$print(this.$refs.printDom, {}); 

3、聲明不打印區域:

js 和 vue 項目通用

3.1 聲明"no-print"類名

print方法中,不需要特意聲明,在打印時默認會剔除.no-print區域。

<div class="no-print">不打印區域</div>
 
Print('#printDom');
3.2 自定義類名

此時需要在print方法中通過"noPrint"屬性指定不打印區域。

<div class="no-print-box">自定義不打印區域類名</div>
 
Print('#printDom',{noPrint:'.no-print-box'});

4、參數說明:

js 和 vue 項目通用,以 vue 項目為例。

復制代碼
this.$print(this.$refs.printDom, {
    noPrint: '.noPrint',
    onStart: () => {
        console.log('打印開始');
    },
    onEnd: () => {
        onsole.log('打印完成');
    }
});
復制代碼

 

參數位置
屬性
說明
參數1
類名、id、ref聲明dom
打印區域
 
noPrint
不打印區域,默認'.no-print'
參數2
onStart
打印前回調函數
 
onEnd
打印后回調函數,確定和取消都會觸發

5、vue項目可能遇到的問題,見下圖:

 

1、el-select中,文本過長,超出了顯示寬度。這種情況在網頁上,可以通過下拉框選項看完整文本。但是此時導出頁面是沒有交互的。

  解決辦法:盡可能把下拉框寬度調寬,如果效果仍然不好,可以考慮在下拉框同級寫個textarea,在打印時,控制下拉框和文本域的顯示隱藏。

 

2、選項的背景色沒有正常顯示。  

解決辦法:為打印區域的最外層容器設置樣式,如果項目中安裝了node-sass,也可直接為body加樣式。兩種方式任選其一。

復制代碼
<style>
.printContainer {
    -webkit-print-color-adjust: exact;
  }
</style>
 
 
<!--以下方式需要項目引入node-sass-->
<style lang="scss">
@media print {
    body {
        -webkit-print-color-adjust: exact;
    }
}
</style>
復制代碼

3、<el-input type="textarea" autosize></el-input>在打印預覽時,顯示高度錯誤。

  原因:vue頁面中,打印區域的寬度大於打印預覽時頁面寬度。在生成打印預覽文件時,textarea沒有重新計算,直接將vue頁面下的height搬了過來,從而引發了打印時textarea文本展示高度不夠的問題。

  解決辦法:可以的話,為打印區域的最外層容器設置寬度。值接近打印預覽時寬度,700px左右即可。或者想辦法在打印的一瞬間,讓該文本域先隱藏,再展示,也可以觸發重新計算,也可規避此問題。

 

4、vue頁面中,顯示"打印"按鈕,在打印時不想打印該按鈕。

  解決辦法:見本文上述第三節提到的指定不打印指定區域。

 

5、打印預覽時顯示undefined。

  檢查是否把 ref 綁定在了el-xx 標簽上,如果是,試試外層包一個div,ref 綁在div上。

 

6、打印預覽時,顯示空白。

  檢查一下print.js文件,toPrint 方法中, 是否有load方法。因為我在其他網頁鏈接中看到過不同版本的print.js。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM