前端使用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,//打印状态
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>
前端使用lodop如何获取打印状态的更多相关文章
- LODOP获取打印状态码和时间列表
之前有博文介绍获取打印状态码和打印状态码的含义,相关博文:LODOP获取打印机状态码和状态码含义测试.此外 ,也有获取状态码及其变化的方法,可以获取打印状态码的列表,列表包含每个状态和每个状态的时间. ...
- 前端使用lodop插件进行打印设置
先前梳理了后台打印导出参考:https://www.cnblogs.com/yyk1226/p/9856032.html,但是没有显示出来打印预览页面. 本章使用Lodop插件进行打印设置,实现打印机 ...
- LODOP获取打印机状态码和状态码含义测试
由于打印机千差万别,打印机执行的标准也不一样,LODOP获取的打印状态码也可能不同,安装了个打印机驱动实际测试一下,测试的打印机驱动是Brother Color Type3 Class Driver. ...
- lodop和c-lodop通过打印状态和任务不在队列获取打印成功
之前的博文有通过判断pirnt的返回值,判断加入队列算打印成功,建议使用这种简单的判断方法.此外还有其他判断方法,例如通过PRINT_STATUS_OK判断,但是这个状态不是所有打印机能支持这种判断成 ...
- LODOP获取打印成功,是否加入队列
之前博文介绍过获取打印机状态码 LODOP获取打印机状态码和状态码含义测试,但是打印机种类千差万别,状态码不一定准确,特别是打印成功的状态码,获取任务不在队列,可以判断打印成功,删除任务也是任务不在队 ...
- asp.net Lodop实现批量打印
1.列表(前台) <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="w_stu ...
- 如何在使用 RemoteWebDriver 打开网页的同时获取 Http 状态码
最近一直在用Selenium这个开源项目写一些web 自动化的小玩意.本来一直运行的挺好,直到有一天突然发现资源抓取失败了,翻看日志才发现,原来本该正常打开的页面返回了504错误所以自然失败了.如何避 ...
- lodop判断是否打印成功
需要引用js <script src="js/jquery-3.3.1.js"></script> <script src="js/Lodo ...
- iOS 获取网络状态
在iOS开发者,获取网络状态比较常用 -(NSString *)getNetWorkStates{ UIApplication *app = [UIApplication sharedApplicat ...
随机推荐
- Android 自定义控件之 日期选择控件
效果如下: 调用的代码: @OnClick(R.id.btn0) public void btn0() { final AlertDialog dialog = new AlertDialog.Bui ...
- ASP.NET Core 入门(3)(单元测试Xunit及Shouldly的使用)
一.本篇简单介绍下在ASP.NET Core项目如何使用单元测试,例子是使用VS自带的Xunit来测试Web API接口,加上一款开源的断言工具Shouldly,方便写出更简洁.可读行更好的测试代码. ...
- Spring的SSM标准配置
一.首先是web.xml文件的配置 <welcome-file-list> <!--设置默认显示登陆界面--> <welcome-file>login.jsp< ...
- 【数字图像处理】帧差法与Kirsch边缘检测实现运动目标识别与分割
本文链接:https://blog.csdn.net/qq_18234121/article/details/82763385 作者:冻人的蓝鲸梁思成 视频分割算法可以从时域和空域两个角度考虑.时域分 ...
- leetcode-101. 判断对称树 · Tree + 递归
题面 判断给定二叉树是否对称. Note : empty tree is valid. 算法 1. 根节点判空,若空,则返回true;(空树对称) 2. 根节点不空,递归判断左右子树.如果左右孩子都空 ...
- 【Zookeeper】实现哨兵机制(选举策略)
一.Master选举使用场景及结构 二.代码实现 2.1 Maven依赖信息 2.2 IndexController 2.3 MyApplicationRunner 2.4 ElectionMaste ...
- What Linux bind mounts are really doing
Lots of Unixes have some form of 'loopback' mounts, where you can mount a bit of an existing filesys ...
- Djang drf:APIView源码分析
Django REST framework 简介 在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 开发REST AP ...
- php+redis一步一步测试秒杀
1.普通的秒杀查库减库存: <?php /** 100个用户同时访问100次会出现超卖 **/ //连接数据库 $dsn = "mysql:host=localhost;dbname= ...
- Centos杀死进程kill方法大全
杀死进程最安全的方法是单纯使用kill命令. 首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令: # kill -pid 注释:标准的kill命令通常都能达到目的.终止有问题的进程,并 ...