zl程序教程

您现在的位置是:首页 >  其他

当前栏目

前端使用lodop如何获取打印状态

状态前端 如何 获取 打印 lodop 使用
2023-09-11 14:19:39 时间

前面已经说过,如何简单使用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>