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