前端使用lodop如何獲取打印狀態


前面已經說過,如何簡單使用lodop了,今天說一下如何獲得lodop的打印狀態?

在教程里面找了半天,摸索出來了一套。

template:

        <!-- 實驗代碼 -->
            <div>job碼</div>
            <input type="text" v-model="jobCode">
            <div id="printarea" v-html="bb" v-show="false"></div>
            <el-button @click="print()">打印</el-button>
            <el-button @click="preview()">預覽</el-button>

data:

  

        bb:`<!DOCTYPE html>
                <html lang="en">
                <head>
                    <meta charset="UTF-8">
                    <meta name="viewport" content="width=device-width, initial-scale=1.0">
                    <meta http-equiv="X-UA-Compatible" content="ie=edge">
                    <title>Document</title>
                </head>
                    <style>
                        
                    </style>
                <body>
                    <div style="text-align:center;font-family:'楷體';">
                        <div style="font-size:24px;font-weight:600;">交通會</div>
                        <div style="font-size:24px;font-weight:500;margin-top:70px;">大薩達所大所大薩達所大所所大薩達所大所</div>
                    </div>
                        
                </body>
                </html>`,
       jobCode:'1',//job碼
            printStatus:0,//打印狀態
methods:
     createPrintCode(){
            LODOP = getLodop();
            // 打印初始化 
            LODOP.PRINT_INIT("打印任務名稱");
            // 設置字體
            LODOP.SET_PRINT_STYLE("FontSize",18);
            // 設置加粗
            LODOP.SET_PRINT_STYLE("Bold",1);
            // 設置紙張大小 打印方向/width/height
            LODOP.SET_PRINT_PAGESIZE(0,"100mm","100mm","商品標簽");
            //在指定位置加文本
            // LODOP.ADD_PRINT_TEXT(50,"20%",260,39,"打印頁面部分內容");
            // 增加超文本項top/left/width/height(高度自適應,設小了有效,大了無效)
            LODOP.ADD_PRINT_HTM("20mm","10mm","80mm","600mm",document.getElementById("printarea").innerHTML);
        },
        print(){//打印
            var self=this;
            this.createPrintCode();
            LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);//執行該語句之后,PRINT指令不再返回那個所謂“打印成功”
            if (LODOP.CVERSION) {//判斷c_lodop是否存在,安裝了c-lodop就會存在
                LODOP.On_Return=function(TaskID,Value){
                    console.log("TaskID:"+TaskID);
                    console.log("Value:"+Value);//job代碼
                    self.jobCode=Value;
                    var timer = setInterval(function(){
                        console.log("每次輪詢的狀態:"+self.printStatus);
                        if(self.printStatus!=0||self.printStatus!=false){
                            clearInterval(timer);
                            return;
                        }
                        self.getStatusValue(Value);
                    },300);
                };
                LODOP.PRINT();
                return;
            } else{
                console.log("c-lodop出錯了");
            } 
        },
        getStatusValue(job){//根據job代碼,獲取是否打印成功
            var self=this;
            LODOP.On_Return=function(TaskID,Value){
                console.log("TaskID:"+TaskID);
                console.log("打印成功狀態:"+Value);//打印成功狀態
                self.printStatus=Value;
            };
            LODOP.GET_VALUE("PRINT_STATUS_OK",job);
        },
        preview(){//預覽
           this.createPrintCode();
            // 預覽
            LODOP.PREVIEW();
            // 直接打印
            // LODOP.PRINT(); 
        },

下面來簡單說一下,lodop插件可以實現靜默打印,免費的時候,靜默打印會帶水印。

調起靜默打印很簡單,但是如何知道打印機打印成功呢?

看了看,lodop的例子,我們可以獲得打印狀態,如果想更智能點,需要去循環查詢此狀態,一旦返回成功的狀態,我們就可以進行下一步處理了!!

第一次調用:    LODOP.On_Return=function(TaskID,Value){},就是給lodop加了個回調函數,TaskID:代表任務id,value是job代碼,我也不大理解job代碼,不過用它可以去查詢,打印狀態!!

那么,這個job代碼在哪用呢?
看上面代碼可以知道,在getStatusValue(job)方法中用到了它,這個方法里又一次給lodop加了個回調函數,參數和第一次調用名字完全一樣,但是加完這個回調函數后,下面還寫了一句代碼:
LODOP.GET_VALUE("PRINT_STATUS_OK",job);
這句代碼是 根據job代碼 查詢打印狀態的,調用完這句后,就會觸發那個回調函數了,嗯此時的回調內 反回來的value值,就是打印的狀態(成功:1或true 失敗:0或false),這個值可以用一個全局變量接住,當我們點擊打印時,就循環查詢這個狀態,一旦,返回的狀態時成功狀態,那么終止循環查詢。

 具體可以參考,教程的45講

 

判斷本地c-lodop服務是否啟動,可以在

LODOP = getLodop();后加一個判斷

如果c-lodop服務沒啟動,這個值就會是undefined

如果啟動了,會有值!!!

 

判斷打印機是否忙碌:“PRINT_STATUS_BUSY”

      getStatusValue(valueName,job){//根據job代碼,獲取是否打印成功
            var self=this;
            LODOP.On_Return=function(TaskID,Value){
                console.log("TaskID:"+TaskID);
                console.log(valueName+":"+Value);
                self.printStatus=Value;
            };
            LODOP.GET_VALUE(“PRINT_STATUS_BUSY”,job);
        },

 

 

 下面,再上一個完整的demo,在vue中使用:

<template>
  <div class="dashboard-container">
    <!-- 實驗代碼 -->
    <div>job碼</div>
    <div id="printarea" v-html="bb" v-show="false"></div>
    <el-button @click="print(1,bb)" :disabled="Boolean(printStatus)">打印</el-button>
    <el-button @click="preview()">預覽</el-button>
    <el-button @click="print(count,bb)" :disabled="Boolean(printStatus)">重復打印</el-button>
    <input type="text" v-model.number="count">
    <!-- <el-button @click="reqeatPrint()">分任務連續打印</el-button> -->
    <el-button @click="breakPagetPrint(printList)">分頁連續打印</el-button>
    <!-- 遮罩層 -->
    <div class="dayinShadow" v-show="shadowShow">
      <i class="el-icon-close" @click="closeShadow()" style="cursor:pointer;float:right;font-size:30px;margin:30px;"></i>
      正在打印中...
    </div>
    <!-- 實驗代碼 -->
  </div>
</template>

<script>
var LODOP;

export default {// 實驗代碼 
  watch:{
  },
  data(){
    return {
      // 實驗代碼 
      bb:`<!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <meta http-equiv="X-UA-Compatible" content="ie=edge">
              <title>Document</title>
          </head>
              <style>
                  
              </style>
          <body>
              <div style="text-align:center;font-family:'微軟雅黑';">
                  <div style="font-size:24px;font-weight:600;">xx</div>
                  <div style="font-size:20px;font-weight:500;margin-top:50px;">xx市</div>
                  <!-- <img src="http://cmsppt.hoohui.cn/qrCode/1564626553.png" /> -->
              </div> 
          </body>
          </html>`,
      cc:`<!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1.0">
              <meta http-equiv="X-UA-Compatible" content="ie=edge">
              <title>Document</title>
          </head>
              <style>
                  
              </style>
          <body>
              <div style="text-align:center;font-family:'微軟雅黑';">
                  <div style="font-size:24px;font-weight:600;">xx</div>
                  <div style="font-size:20px;font-weight:500;margin-top:50px;">xx市</div>
              </div> 
          </body>
          </html>`,
      printList:[],//打印數組
      printStatus:0,//打印狀態
      shadowShow:false,//遮罩顯示與否
      count:1,//打印份數
      // 實驗代碼 
    }
  },
  created(){
    this.printList.push(this.bb);
    this.printList.push(this.cc);
    console.log(this.printList)
  },
  mounted(){

  },
  methods:{
    createPrintCode(count,htmlStr){
      var self=this;
      LODOP = getLodop();
      return new Promise(function(resolve,reject){
        if (LODOP.CVERSION) {//是否能檢測到c-lodop的版本號
          if(!LODOP){//c-lodop如果沒啟動,則不能打印
            alert("請啟動c-lodop服務");
            return;
          }
          // 打印初始化 
          LODOP.PRINT_INIT("打印任務名稱");
          if(count){//設置重復打印要放在初始化后面
            LODOP.SET_PRINT_COPIES(count);
          }
          // 設置紙張大小 打印方向/width/height
          LODOP.SET_PRINT_PAGESIZE(0,"100mm","100mm","商品標簽");
          // 增加超文本項top/left/width/height(高度自適應,設小了有效,大了無效)
          LODOP.ADD_PRINT_HTM("40mm","10mm","80mm","600mm",htmlStr);
          resolve();
        } else{
          alert("請下載c-lodop");
        } 
      })  
    },
    
    breakPagetPrint(htmlList=[]){//分頁連續打印
      var self=this;
      if(htmlList.length==0){return};
      self.shadowShow=true;
      LODOP = getLodop();
      if (LODOP.CVERSION) {//是否能檢測到c-lodop的版本號
        if(!LODOP){//c-lodop如果沒啟動,則不能打印
          alert("請啟動c-lodop服務");
          return;
        }
        LODOP.PRINT_INIT("分頁打印任務");//初始化在循環中
        // 設置紙張大小 打印方向/width/height
        LODOP.SET_PRINT_PAGESIZE(0,"100mm","100mm","商品標簽");
        // 增加超文本項top/left/width/height(高度自適應,設小了有效,大了無效)
        for(let i=0,len=htmlList.length;i<len;i++){
          LODOP.ADD_PRINT_HTM("40mm","10mm","80mm","600mm",htmlList[i]);
          LODOP.NewPage(); 
        }
        self.carryPrint();//執行打印命令
      } else{
        alert("請下載c-lodop");
      }
    },
    print(count,htmlStr){//打印
      var self=this;
      if(!htmlStr){alert("沒有要打印的內容"); return;};
      self.shadowShow=true;
      this.createPrintCode(count,htmlStr).then(function(){
        self.carryPrint();
      })   
    },
    carryPrint(){//執行打印命令
      var self=this;
      LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);//執行該語句之后,PRINT指令不再返回那個所謂“打印成功”,才能獲取到打印狀態
      LODOP.On_Return=function(TaskID,Value){//TaskID:任務id,Value:job代碼
        var timer = setInterval(function(){
          if(self.printStatus!=0 || self.printStatus!=false){
            clearInterval(timer);
            self.printStatus=0;
            self.shadowShow=false;
            return;
          }
          // PRINT_STATUS_BUSY
          self.getStatusValue("PRINT_STATUS_OK",Value);//查詢打印任務完成狀態
        },500);
      };
      LODOP.PRINT();
    },
    getStatusValue(valueName,job){//根據job代碼,獲取是否打印成功
      var self=this;
      LODOP.On_Return=function(TaskID,Value){//TaskID:任務id,Value:打印成功狀態
        //彈出層彈出時,而打印機沒正常打印,此時為了能關閉彈窗,需要強行把打印狀態改成1(完成狀態)
        self.printStatus = self.shadowShow ? Value : 1;
        console.log("打印成功狀態:"+self.printStatus);
      };
      LODOP.GET_VALUE(valueName,job);
    },
    preview(){//預覽
      this.createPrintCode().then(function(){
        LODOP.PREVIEW();
      })
    },
    closeShadow(){//強制關閉遮罩層
      this.printStatus=1;//強制打印狀態變為1
      this.shadowShow=false;//強制遮罩成關閉
    },
    reqeatPrint(){//分任務連續打印
      var self=this;
      LODOP = getLodop();
      for(let i=0,len=self.printList.length;i<len;i++){
        LODOP.PRINT_INIT("循環打印任務");//初始化在循環中
        // 設置字體
        LODOP.SET_PRINT_STYLE("FontSize",18);
        // 設置加粗
        LODOP.SET_PRINT_STYLE("Bold",1);
        // 設置紙張大小 打印方向/width/height
        LODOP.SET_PRINT_PAGESIZE(0,"100mm","100mm","商品標簽");
        // 增加超文本項top/left/width/height(高度自適應,設小了有效,大了無效)
        LODOP.ADD_PRINT_HTM("40mm","10mm","80mm","600mm",self.printList[i]);
        LODOP.PRINT(); 
      }
    },
  }
}
</script>

<style lang="scss" scoped>
.dashboard {
.dayinShadow{
    position: fixed;
    top:0;
    left:0;
    right:0;
    bottom:0;
    background:rgba(0,0,0,.5);
    z-index: 1200;
    color:#ffffff;
    font-size:20px;
    text-align:center;
    line-height:800px;
  }
</style>

 

 

 

 

 






免責聲明!

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



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