頁面打印,lodop使用筆記


需求通過編寫前端頁面實現多次打印。記下要點。

1. 分頁

  css自帶分頁樣式: page-break-after: always;page-break-before:always。

  在某些打印工具下可能會出現空白頁。我遇到的情況是,每個頁面的包裹div和頁面差不多大,加上分頁符就多了一頁。我把頁面包裹div高度減少,這樣每頁內容不變高度減少都加上分頁也沒問題。可以試試控制最后一頁不加分頁樣式,我記得我沒成功。

2.打印插件 vue-print-nb

   我使用vue寫的頁面,最開始使用 vue-print-nb 打印插件,用起來很方便,把需要打印的內容放id在 一個用v-print觸發就好。<button v-print="'#printMe'">Print local range</button>

  但是除了新版chrome外,使用系統打印工具的瀏覽器都不能設定好打印樣式,不能縮放等,所以放棄了。

  后來改用lodop,這是付費插件,好在公司買過了。

 

3.lodop

   lodop可以使用自帶指令編寫打印內容,但是我建議使用html的方式,畢竟最為前端,使用起來方便靈活點。

  (1)官網下載軟件包和文檔。軟件包有三個安裝包一個初始化js和一堆示例。

    

    chrome和火狐吧用需要安裝第一個,IE區分32和64位,引入第四個文件 LodopFuncs.js后頁面會提示。

  (2)官方推薦使用 LodopFuncs.js,但是在使用之前需要對這個js進行改造。

      首先,需要把外部需要使用的 getLodop() 暴露出去,只需要在最后 export default getLodop,然后在vue里import一下就可以使用了: import getLodop from './LodopFuncs'。

      其次,最好修改一下提示的文件地址,或者按需刪除地址修改提示。

      我的這個項目引用element,由於提示采取js拼接dom的方式,出現提示頁面就會卡死,我引用MessageBox : import { MessageBox } from 'element-ui'; 通過MessageBox 進行提示,解決問題。

      最后,在js最后添加注冊號,官方就是個坑,官方紅字地方的代碼復制下來不能用,下圖標示的地方下划線應該是 _ 一個,而那地方是 __ 兩個,刪一個~~~~

      

  (3) 使用lodop,代碼如下。

 lodop() {
      LODOP = getLodop();
      if (LODOP) {
        //獲取css字符串 采用js傳入
        var strBodyStyle = `<style>${strStyle}</style>`
        //拼接超文本
        var strFormHtml = strBodyStyle + "<body>" + document.getElementById("printTest").innerHTML + "</body>";
        LODOP.PRINT_INIT("打印綜合二維碼面單");
        //添加打印
        LODOP.ADD_PRINT_HTM(0, '1mm', '120mm', '200mm', strFormHtml);
        //設置預覽界面預覽顯示模式和大小 0為適高
        LODOP.SET_PREVIEW_WINDOW(0, '', '', '600', '800', '');
        //設置打印 縮放比例
        LODOP.SET_PRINT_MODE("PRINT_PAGE_PERCENT", '50%');
        //設置打印請求結束后自動關閉預覽
        LODOP.SET_PRINT_MODE("AUTO_CLOSE_PREWINDOW", true);
        // 預覽  LODOP.PRINT();為直接打印
        LODOP.PREVIEW();
      }
    }

    ###  遇到一個問題是,css不能加載。沒有樣式,這就很酸爽了, vue-print-nb就不存在這個問題。官方提供方法:

//獲取<style id="style1">的內容拼接
var strBodyStyle="<style>"+document.getElementById("style1").innerHTML+"</style>";
var strFormHtml=strBodyStyle+"<body>"+document.getElementById("form1").innerHTML+"</body>";

//直接寫樣式內容 拼接
var strBodyStyle="<style>table,td { border: 1 solid #000000;border-collapse:collapse }</style>";
var strFormHtml=strBodyStyle+"<body>"+document.getElementById("form1").innerHTML+"</body>";

//獲取外部樣式拼接
var strStyleCSS="<link href='PrintSample10.css' type='text/css' rel='stylesheet'>";
var strFormHtml="<head>"+strStyleCSS+"</head><body>"+document.getElementById("form1").innerHTML+"</body>";

    第一三的方法很好,但不知什么原因我沒成功~~~~~~~~~~~

    然后只好使用第二種方法,但是直接在邏輯代碼里寫css字符串顯得有點怪怪的,所以我復制所有css內容放在另一個js文件里然后用``包裹成字符串,然后 export 出去,在打印邏輯引用就好了。用``包裹嗨可以保留css結構。

     

    ###  其他問題比如需要設置縮放什么的,前面的代碼都有,也寫了注釋。

4. 另外打印二維碼使用 jrQrcode,條形碼使用 JsBarcode,使用都很簡單。

  JsBarcode是生成Base64,純數據,可以在獲取打印數據的地方直接使用,而jrQrcode需要獲取dom,需要dom渲染完成才能使用。vue使用this.$nextTick(() => { fun() })。

  lodop打印也是需要獲取dom,也需要使用this.$nextTick(() => { fun() })。

 


免責聲明!

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



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