之前的博文有通過判斷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>
圖示:用手動刪除任務模擬打印成功,任務不在隊列算成功。
前面圖片用了顏色區分各個部分,追着顏色看代碼更清晰。