之前的博文有通过判断pirnt的返回值,判断加入队列算打印成功,建议使用这种简单的判断方法。
此外还有其他判断方法,例如通过PRINT_STATUS_OK判断,但是这个状态不是所有打印机能支持这种判断成功,这个是通过“状态码包含128”来 判断,但是但有些打印机输出完毕状态码不变成128,而一直等于20(“正在打印16”和“正在删除4”之和),所有这种单独用这个PRINT_STATUS_OK判断,有些打印机会判断不出来。
这种情况下,需要加附加判断,判断打印机不在队列为成功。或者直接使用JOB不在队列为成功,JOB不在队列 有两种情况,可能是打印成功了,也可能是在队列删除了该任务。

方法1:判断加入队列算成功(之前的相关博文:)
这种脱机 ,缺纸等情况下,加入队列会一直在排队,这种也会提示打印成功。
或者可以修改提示,改为“成功发送了指令,成功加入队列”等提示也可以,避免脱机缺纸等情况,任务一直在排队,却提示打印成功,用户可能不满意。

方法2:单独用这个PRINT_STATUS_OK判断
不是所有打印机都支持,不同打印机状态码可能不同,所有尽量不用这个单独判断。如果需要的打印机固定,可实际测试该打印机支不支持这个。

方法3:用PRINT_STATUS_OK和不在队列联合判断,或者单独判断不在队列。
这种方法如果是手动在队列删除了任务,也会判断为成功。
但是大多数情况下,一般用户不会在打印中途删除任务,所以这种方法还可以使用,但是这种是根据JOB判断,所以是判断单个任务是否打印成功,如果打很多,这种方法也不太好,还比如不判断。

目前市面上很多软件,包括本人用来打发票的开票软件,都没有提示打印成功的,试试上打印机本身如果缺纸卡纸或脱机等,打印机本身会有提示音或提示灯,windows系统一般会在右下角提示打印错误,所以不提示成功也是常见的。
或者用方法1和方法3判断,单独用状态码的那个,由于有的打印机判断不出来,不建议使用。

这三种方法,都不是绝对的打印成功,但是近似打印成功
方法1:缺纸,脱机等也会认为打印成功
方法2:有些打印机不支持,会总认为不成功
方法3:在队列删除任务,也会被认为打印成功

本文下面的图示中的成功,是我手动在队列删除任务的效果。查看log日志,可以看出这打印成功或删除是从任务不在队列里判断出来的。此时间不是打印成功时间,是我手动删除打印机队列该任务所用的时间。用手动删除队列任务模拟打印成功。

测试代码 :
如本代码 ,变量c有两个作用,一个是判断前一个任务是否判断完成,一个是用来计算打印所用的秒数,用JS的setTimeout方法,每隔1秒进行判断一次,一直到判断成功或超时停止判断。

里面包含的判断:
1.由于lodop和c-lodop获取返回值的方法不同,所以里面要判断当前走的是哪个,如果是c-lodop,就采用回调方式获取返回值,如果是lodop,就直接获取返回值。关于回调函数,可查看本博客其他相关博文。
2,最开始先判断c的值,如果上一个任务判断完成(成功或超时),就把c重新设置为0。c如果为0,说明当前没有正在打印的任务,或之前的任务已经判断完成,可以进行新的任务。如果c不为0,说明前面的任务还没判断完成,该代码中通过alert提示正在打印中,然后return,不在执行后面的方法。
3.判断PRINT_STATUS_OK打印状态,如果通过状态判断为成功,提示成功。
判断PRINT_STATUS_EXIST,JOB是否在队列,不在则判断为成功,提示成功或删除(本文用的删除模拟成功会任务在队列消失)判断job时,如果前面的那个判断失败,再进行判断下一个,如果前面的成功,就没有必要再继续判断了,判断c>0,表示前面的判断没成功,就是相当于c-lodop中的else if的写法,只是写法不同,两者同时成立,用且语句,上面那个判断为成功了,就会把c重置为0。
最后加个else,前面的判断不成功会会一致继续定时判断,判断当c>50,超过50秒时,因为c每次加1,所以当c是51秒时就停止这个定时,因为如果脱机什么的状态,这个任务会一直在队列里,这么长时间都没打印出来,一直判断下去就停止不了了,所以弄个判断截止的时间,当这个时间到了,还判断不到打印成功那个地方,就提示超时或在这个时间内失败。

里面需要获取的返回值:
LODOP.PRINTA()————-返回job代码
LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);加这句才是返回job代码,否则是默认返回值,参考本博客的那个加入队列算成功的博文。
PRINT_STATUS_OK-----根据状态获取成功(有的打印机不支持)
PRINT_STATUS_EXIST----判断任务是否在队列

一个回调获取两个回调值,要加LODOP.On_Return_Remain=true;,否则一个回调后就销毁了。

测试代码 :

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>WEB打印控件LODOP</title>
<script language="javascript" src="LodopFuncs.js"></script>
</head>
<body>
<a href="javascript:PrintWait()">通过状态和不在队列打印测试是否成功</a><br>
<script language="javascript" type="text/javascript">
var LODOP,P_ID="",TaskID1,TaskID2,t,c=0;//声明为全局变量
function PrintWait(){
if (c>0) {alert("正打印中...");return;}
LODOP=getLodop();
LODOP.PRINT_INIT("");
LODOP.ADD_PRINT_TEXT(50,231,260,39,"打印的页面部分内容");
LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);
if (LODOP.CVERSION) {
LODOP.On_Return=function(TaskID,Value){
P_ID=Value;
console.log("该任务走的是c-lodop方式,job代码为"+P_ID);
if (P_ID!="") { c=0;C_WaitFor();};
};
LODOP.PRINTA();
} else {
P_ID=LODOP.PRINTA();
console.log("该任务走的是lodop插件方式,job代码为"+P_ID);
if (P_ID!="") { c=0;WaitFor();};
};
}
function WaitFor(){
c=c+1;
console.log("正等待(JOB代码是"+P_ID+")打印结果:"+c+"秒");
t=setTimeout("WaitFor()",1000);
if (LODOP.GET_VALUE("PRINT_STATUS_OK",P_ID)) {
clearTimeout(t);
console.log("走的lodop插件方式:PRINT_STATUS_OK判断为打印成功");
c=0;
alert("打印成功!");
}if ((!LODOP.GET_VALUE("PRINT_STATUS_EXIST",P_ID))&&(c>0)) {
clearTimeout(t);
console.log("走的lodop插件方式:判断该该任务已经不在队列,已成功或删除任务");
c=0;
alert("打印任务不在队列,成功或删除");
} else if (c>50){
clearTimeout(t);
console.log("打印超过50秒没捕获到成功状态!");
c=0;
alert("打印超过50秒没捕获到成功状态!");
};
};
function C_WaitFor(){
c=c+1;
console.log("正等待(JOB代码是"+P_ID+")打印结果:"+c+"秒");
t=setTimeout("C_WaitFor()",1000);
LODOP.On_Return_Remain=true;
LODOP.On_Return=function(TaskID,Value){
if (TaskID==TaskID1){
if (Value==1){alert(TaskID+" "+Value);
clearTimeout(t);
console.log("走的c-lodop方式:PRINT_STATUS_OK判断为打印成功");
c=0;
alert("打印成功!");
};
} else
if (TaskID==TaskID2){
if (Value==0){
clearTimeout(t);
console.log("走的c-lodop方式:判断该该任务已经不在队列,已成功或删除任务");
c=0;
alert("打印任务不在队列,成功或删除");
};
};
};
TaskID1=LODOP.GET_VALUE("PRINT_STATUS_OK",P_ID);
TaskID2=LODOP.GET_VALUE("PRINT_STATUS_EXIST",P_ID);
if (c>50){
clearTimeout(t);
console.log("打印超过50秒没捕获到成功状态!");
c=0;
alert("打印超过50秒没捕获到成功状态!");
};
};
</script>
</body>

图示:用手动删除任务模拟打印成功,任务不在队列算成功。

前面图片用了颜色区分各个部分,追着颜色看代码更清晰。

lodop和c-lodop通过打印状态和任务不在队列获取打印成功的更多相关文章

  1. LODOP获取打印状态码和时间列表

    之前有博文介绍获取打印状态码和打印状态码的含义,相关博文:LODOP获取打印机状态码和状态码含义测试.此外 ,也有获取状态码及其变化的方法,可以获取打印状态码的列表,列表包含每个状态和每个状态的时间. ...

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

    前面已经说过,如何简单使用lodop了,今天说一下如何获得lodop的打印状态? 在教程里面找了半天,摸索出来了一套. template: <!-- 实验代码 --> <div> ...

  3. LODOP获取打印成功,是否加入队列

    之前博文介绍过获取打印机状态码 LODOP获取打印机状态码和状态码含义测试,但是打印机种类千差万别,状态码不一定准确,特别是打印成功的状态码,获取任务不在队列,可以判断打印成功,删除任务也是任务不在队 ...

  4. LODOP 获取打印设计代码不带INIT初始化语句

    前面的博文生成JS代码模版和文档式模版,生成的是带初始化语句的模版,如果想要打印多个,可以循环多个任务,什么是一个任务,可查看本博客相关博文:Lodop打印语句最基本结构介绍(什么是一个任务)一个任务 ...

  5. Lodop强制分页LODOP.NewPage()和LODOP.NewPageA()

    使用Lodop打印控件打印时,有自动分页,有手动强制分页,也可以两者结合使用,在使用两者结合的时候注意LODOP.NewPage()和LODOP.NewPageA()的区别,如果前面打印项自动分页不止 ...

  6. C#通过调用WinApi打印PDF文档类,服务器PDF打印、IIS PDF打印

    其他网站下载来的类,可以用于Winform.Asp.Net,用于服务器端PDF或其他文件打印. 直接上代码: using System; using System.Collections.Generi ...

  7. PrintDocument打印、预览、打印机设置和打印属性的方法

    WindowsForm 使用 PrintDocument打印.预览.打印机设置和打印属性的方法. private void Form1_Load(object sender, System.Event ...

  8. 打印文本中的所有单词,并且打印每个单词出现的行号,非实义单词不考虑(TCPL,练习6-3)

    建立一棵二叉树,每个接单存放单词以及指向一个链表的指针,以及指向左右节点的指针.链表内存放行号以及指向下一个链表节点的指针. 每录入一个单词,先寻找二叉树,再寻找它的链表,分别将单词和行号插入二叉树和 ...

  9. windows7打印时,显示脱机,提示“服务器打印后台处理程序服务没有运行”。

    1. 问题 windows7打印时,显示脱机,提示“服务器打印后台处理程序服务没有运行”. 2. 解决方法. 将下面的文字保存为bat文件执行,其中\\192.168.40.110\Lenovo M7 ...

随机推荐

  1. JDK9的JShell简单使用

    JShell其实就是一个命令行工具,输入片段代码马上就可以看到结果,相当于脚本一行行解析执行,用户可以体验一把Java交互式编程环境.

  2. URLSearchParams对象

    URLSearchParams对象用于处理URL中查询字符串,即?之后的部分. 1.语法 其实例对象的用法和Set数据结构类似.实例对象本身是可遍历对象.但是不是遍历器. var paramsStri ...

  3. 洛谷 P816 忠诚 题解

    每日一题 day28 打卡 Analysis 这道题用线段树维护区间最小值很简单,因为没有修改所以连lazy_tag都不用,但是这道题可以用树状数组维护区间最小值,非常骚气. 线段树代码: #incl ...

  4. TPC-H简介

    TPC-H是事务处理性能委员会( Transaction ProcessingPerformance Council )制定的基准程序之一,TPC- H 主要目的是评价特定查询的决策支持能力,该基准模 ...

  5. 一个简单的直播demo for java

    obs推流,nginx挂rtmp模块,配置rtmp端口,obs向此端口推流,video.js H5拉流播放 加阿里CDN 超级简单- -

  6. go error=216编译错误

    CreateProcess error=216, 该版本的 %1 与您运行的 Windows 版本不兼容.请查看计算机的系统信息,了解是否需要 x86 (32 位)或 x64 (64 位)版本的程序, ...

  7. Java与设计模式之单例模式(上)六种实现方式

           阎宏博士在<JAVA与模式>中是这样描述单例模式的:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类.      ...

  8. Note_4.1

    2019/4/1 奇奇怪怪的笔记 多项式除法 问题描述 给定\(n\)次多项式\(A(x)\)和\(m\)次多项式\(B(x)\) 求: \[ A(x)=B(x)*C(x)+R(x) \] 我们要求\ ...

  9. WSL2(Ubuntu)安装Docker

    原文链接:https://www.cnblogs.com/blog5277/p/12071400.html 原文作者:博客园--曲高终和寡 *******************如果你看到这一行,说明 ...

  10. 两个对象key相同但是value不同,将value不同的键值对以对象形式输出

    let obj={ name:'jack', age:18, sex:'girl' } let obj2={ name:'rose', age:18, sex:'boy' } var str={} f ...