lodop和c-lodop经过打印状态和任务不在队列获取打印成功

2021年09月15日 阅读数:3
这篇文章主要向大家介绍lodop和c-lodop经过打印状态和任务不在队列获取打印成功,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

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

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

方法2:单独用这个PRINT_STATUS_OK判断
不是全部打印机都支持,不一样打印机状态码可能不一样,全部尽可能不用这个单独判断。若是须要的打印机固定,可实际测试该打印机支不支持这个。java

方法3:用PRINT_STATUS_OK和不在队列联合判断,或者单独判断不在队列。
这种方法若是是手动在队列删除了任务,也会判断为成功。
可是大多数状况下,通常用户不会在打印中途删除任务,因此这种方法还能够使用,可是这种是根据JOB判断,因此是判断单个任务是否打印成功,若是打不少,这种方法也不太好,还好比不判断。windows

目前市面上不少软件,包括本人用来打发票的开票软件,都没有提示打印成功的,试试上打印机自己若是缺纸卡纸或脱机等,打印机自己会有提示音或提示灯,windows系统通常会在右下角提示打印错误,因此不提示成功也是常见的。
或者用方法1和方法3判断,单独用状态码的那个,因为有的打印机判断不出来,不建议使用。函数

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

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

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

里面包含的判断:
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>

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

 

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