zoukankan      html  css  js  c++  java
  • 前端使用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>
     





  • 相关阅读:
    js4——字符转化
    js3——表格下拉
    笔记展现
    js2——定时跳转
    js学习——1
    明明在/etc/my.cnf 配置了mysql.sock,为什么会在/var/lib/mysql/mysql.sock 里边寻找
    RBAC用户权限管理数据库设计
    mysql 字节问题,中文和数字
    PHP闭包
    一致性哈希算法原理
  • 原文地址:https://www.cnblogs.com/fqh123/p/11271660.html
Copyright © 2011-2022 走看看