PrintSample45.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>WEB打印控件LODOP的样例四十五:获得打印状态及控制打印</title>
  6. <script language="javascript" src="LodopFuncs.js"></script>
  7. </head>
  8. <body>
  9. <h2><font color="#009999">演示如何获得打印状态及控制打印:</font>
  10. </h2>
  11. <br>
  12. &nbsp;&nbsp;&nbsp;&nbsp;
  13. 由于Windows下打印一般采用后台服务完成,也就是说<a href="PrintSample35.html" target="_blank">样例35</a>返回的“打印成功”实际仅是成功加入后台队列,<p>要获得后台真实打印的状态变化以及最终是否打印成功结束,需要采用如下捕获语句:</p>
  14. <p><font color="#0000FF">LODOP.SET_PRINT_MODE(&quot;CATCH_PRINT_STATUS&quot;,true);</font></p>
  15. <p>执行该语句之后,PRINT指令不再返回那个所谓“打印成功”,而是该任务的<font color="#0000FF">JOB代码</font>(打印机序号和JOB序号组成)。</p>
  16. <p>有了该<font color="#0000FF">JOB代码</font>,可以用<font color="#0000FF">GET_VALUE(&quot;PRINT_STATUS_XXX&quot;,&quot;JOB代码值&quot;)</font>语句获得打印状态信息及最终结果。</p>
  17. <p>这与<a href="PrintSample28.html" target="_blank">样例28</a>方法不同的是,即便打印任务消失之后仍能查询,也可以循环查询,等待某个状态出现。</p>
  18. <p><b>下面演示:</b>
  19. </p>
  20. <p>1、先点<a href="javascript:MyPrint()">执行打印</a>获得该打印的JOB代码:<input type="text" id="T1" size="48"><br>
  21. </p>
  22. 2、<input type="button" value="获得该JOB是否已经打印成功:"
  23. onclick="document.getElementById('T2').value=getStatusValue('PRINT_STATUS_OK',document.getElementById('T1').value,document.getElementById('T2'))"><input type="text" id="T2" size="48">(1-成功
  24. 0-不成功)<br>
  25. 3、<input type="button" value="获得该JOB是否还处在队列中:"
  26. onclick="document.getElementById('T3').value=getStatusValue('PRINT_STATUS_EXIST',document.getElementById('T1').value,document.getElementById('T3'))"><input type="text" id="T3" size="48">(1-在
  27. 0-不在,可能已打完或未打而删除)<br>
  28. 4、<input type="button" value="获得该JOB当前打印状态代码:"
  29. onclick="document.getElementById('T4').value=getStatusValue('PRINT_STATUS_ID',document.getElementById('T1').value,document.getElementById('T4'))"><input type="text" id="T4" size="48">(含义见后面解释)<br>
  30. 5、<input type="button" value="获得该JOB当前打印状态描述:"
  31. onclick="document.getElementById('T5').value=getStatusValue('PRINT_STATUS_TEXT',document.getElementById('T1').value,document.getElementById('T5'))"><input type="text" id="T5" size="48"><br>
  32. 6、<input type="button" value="获得该JOB需要打印的总页数:"
  33. onclick="document.getElementById('T6').value=getStatusValue('PRINT_STATUS_TOTAL_PAGES',document.getElementById('T1').value,document.getElementById('T6'))"><input type="text" id="T6" size="48"><br>
  34. 7、<input type="button" value="获得该JOB文档名称:"
  35. onclick="document.getElementById('T7').value=getStatusValue('PRINT_STATUS_DOCNAME',document.getElementById('T1').value,document.getElementById('T7'))"><input type="text" id="T7" size="59"><br>
  36. 8、<input type="button" value="获得该JOB文档建立时间:"
  37. onclick="document.getElementById('T8').value=getStatusValue('PRINT_STATUS_ADDTIME',document.getElementById('T1').value,document.getElementById('T8'))"><input type="text" id="T8" size="53"><br>
  38. 9、<input type="button" value="获得该JOB打印状态变化记录:"
  39. onclick="document.getElementById('T9').value=getStatusValue('PRINT_STATUS_LIST',document.getElementById('T1').value,document.getElementById('T9'))"><br><textarea rows="6" id="T9" cols="45"> </textarea><br>
  40. 10、<input type="button" value="获得该打印任务持续的时间(秒):"
  41. onclick="document.getElementById('T10').value=getStatusValue('PRINT_STATUS_SECONDS',document.getElementById('T1').value,document.getElementById('T10'))"><input type="text" id="T10" size="7"><br>
  42. 11、<input type="button" value="获得该打印机是否处于忙碌状态:"
  43. onclick="document.getElementById('T11').value=getStatusValue('PRINT_STATUS_BUSY',document.getElementById('T1').value,document.getElementById('T11'))"><input type="text" id="T11" size="7">(1-忙碌
  44. 0-不忙碌)<br>
  45. <br>
  46. 12、由于打印能并发执行,所以哪怕上面的打印任务还没有完成,
  47. <p>&nbsp;&nbsp;&nbsp; 现在也可以<a href="javascript:PrintWait()">另外执行一个打印</a>(产生新JOB代码:<input type="text" id="T12A" size="5">)
  48. 并等待其打印成功状态出现:<input type="text" id="T12B" size="40">
  49. </p>
  50. <p>&nbsp;&nbsp;&nbsp; 等待过程中可以用如下语句对该打印机进行暂停打印、恢复打印及清理打印任务三项控制:<br>
  51. &nbsp; &nbsp;<font color="#0000FF">LODOP.SET_PRINT_MODE(&quot;CONTROL_PRINTER:打印机名称或序号&quot;,&quot;PAUSE&quot;);</font><br>
  52. &nbsp; &nbsp;<font color="#0000FF">LODOP.SET_PRINT_MODE(&quot;CONTROL_PRINTER:打印机名称或序号&quot;,&quot;RESUME&quot;);</font><br>
  53. &nbsp; &nbsp;<font color="#0000FF">LODOP.SET_PRINT_MODE(&quot;CONTROL_PRINTER:打印机名称或序号&quot;,&quot;PURGE&quot;);</font><br>
  54. &nbsp; &nbsp;先试试<a href="javascript:ControlPrinterPAUSE(document.getElementById('T12A').value)">暂停打印</a>,
  55. 暂停后<a href="javascript:ControlPrinterRESUME(document.getElementById('T12A').value)">恢复打印</a>,
  56. 或<a href="javascript:ControlPrinterPURGE(document.getElementById('T12A').value)">清理其所有打印任务</a>(清理过程稍等待)。</p>
  57. <p><b>打印状态代码含义:</b>
  58. </p>
  59. 状态代码是一个枚举组合值,有如下信息所代表的数字合计而成。<br>
  60. <table border="1" width="48%" height="65">
  61. <tr>
  62. <td width="32%" height="59" align="left">1-已暂停<br>
  63. 2-错误<br>
  64. 4-正删除<br>
  65. 8-进入队列</td>
  66. <td width="33%" height="59" align="left">
  67. 16-正在打印<br>
  68. 32-脱机<br>
  69. 64-缺纸<br>
  70. 128-打印结束</td>
  71. <td width="35%" height="59" align="left">
  72. 256-已删除<br>
  73. 512-堵塞<br>
  74. 1024-用户介入<br>
  75. 2048-正在重新启动</td>
  76. </tr>
  77. </table>
  78. <p>13、前面的<b>已经打印成功</b>是通过“状态码包含128”且“JOB已不在队列”来判断的,但有些打印机输出完毕状态码不变成128,
  79. </p>
  80. <p>而一直等于20(“正在打印16”和“正在删除4”之和),此时页面程序需要针对这种打印机进行附加判断。事实上多数情况下
  81. </p>
  82. <p>判断“JOB不在队列”就足可认定已经打印成功!</p>
  83. 下面演示逐个打印,也就是前面成功或删除了才继续打印下一个(演示中选“取消”就中断循环):
  84. <p><a href="javascript:PrintWaitLoop()">开始循环打印</a>:<input type="text" id="T14" size="60">
  85. </p>
  86. <p> 
  87. </p>
  88. <p><a href="PrintSampIndex.html">&lt;回样例目录</a>
  89. </p>
  90. <script language="javascript" type="text/javascript">
  91. var LODOP,P_ID="",TaskID1,TaskID2,t,waiting=false,c=0,loop=0; //声明为全局变量
  92. function getStatusValue(ValueType,ValueIndex,oResultOB){
  93. LODOP=getLodop();
  94. if (LODOP.CVERSION) LODOP.On_Return=function(TaskID,Value){oResultOB.value=Value;};
  95. var strResult=LODOP.GET_VALUE(ValueType,ValueIndex);
  96. if (!LODOP.CVERSION) return strResult; else return "";
  97. };
  98. function MyPrint(){
  99. LODOP=getLodop();
  100. LODOP.PRINT_INIT("打印控件功能演示_Lodop功能_获得打印状态1");
  101. LODOP.ADD_PRINT_TEXT(50,231,260,39,"打印的第一页内容");
  102. LODOP.NEWPAGEA();
  103. LODOP.ADD_PRINT_TEXT(50,231,260,39,"打印的第二页内容");
  104. LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);
  105. if (LODOP.CVERSION) {
  106. LODOP.On_Return=function(TaskID,Value){document.getElementById('T1').value=Value;};
  107. LODOP.PRINTA();
  108. return;
  109. } else document.getElementById('T1').value=LODOP.PRINTA();
  110. };
  111. function PrintWait(){
  112. if (c>0) {alert("正打印中...");return;}
  113. LODOP=getLodop();
  114. LODOP.PRINT_INIT("打印控件功能演示_Lodop功能_获得打印状态2");
  115. LODOP.ADD_PRINT_TEXT(50,231,260,39,"打印的页面部分内容");
  116. LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);
  117. if (LODOP.CVERSION) {
  118. LODOP.On_Return=function(TaskID,Value){
  119. P_ID=Value;
  120. document.getElementById('T12A').value=P_ID;
  121. if (P_ID!="") { c=0;C_WaitFor();};
  122. };
  123. LODOP.PRINTA();
  124. } else {
  125. P_ID=LODOP.PRINTA();
  126. document.getElementById('T12A').value=P_ID;
  127. if (P_ID!="") { c=0;WaitFor();};
  128. };
  129. }
  130. function WaitFor(){
  131. c=c+1;
  132. document.getElementById('T12B').value="正等待(JOB代码是"+P_ID+")打印结果:"+c+"秒";
  133. t=setTimeout("WaitFor()",1000);
  134. if (LODOP.GET_VALUE("PRINT_STATUS_OK",P_ID)) {
  135. clearTimeout(t);
  136. document.getElementById('T12B').value="打印成功!";
  137. c=0;
  138. alert("打印成功!");
  139. }if ((!LODOP.GET_VALUE("PRINT_STATUS_EXIST",P_ID))&&(c>0)) {
  140. clearTimeout(t);
  141. document.getElementById('T12B').value="打印任务被删除!";
  142. c=0;
  143. alert("打印任务被删除!");
  144. } else if (c>30){
  145. clearTimeout(t);
  146. document.getElementById('T12B').value="打印超时(30秒)!";
  147. c=0;
  148. alert("打印超过30秒没捕获到成功状态!");
  149. };
  150. };
  151. function C_WaitFor(){
  152. c=c+1;
  153. document.getElementById('T12B').value="正等待(JOB代码是"+P_ID+")打印结果:"+c+"秒";
  154. t=setTimeout("C_WaitFor()",1000);
  155. LODOP.On_Return_Remain=true;
  156. LODOP.On_Return=function(TaskID,Value){
  157. if (TaskID==TaskID1){
  158. if (Value==1){alert(TaskID+" "+Value);
  159. clearTimeout(t);
  160. document.getElementById('T12B').value="打印成功!";
  161. c=0;
  162. alert("打印成功!");
  163. };
  164. } else
  165. if (TaskID==TaskID2){
  166. if (Value==0){
  167. clearTimeout(t);
  168. document.getElementById('T12B').value="打印任务被删除!";
  169. c=0;
  170. alert("打印任务被删除!");
  171. };
  172. };
  173. };
  174. TaskID1=LODOP.GET_VALUE("PRINT_STATUS_OK",P_ID);
  175. TaskID2=LODOP.GET_VALUE("PRINT_STATUS_EXIST",P_ID);
  176. if (c>50){
  177. clearTimeout(t);
  178. document.getElementById('T12B').value="打印超时(50秒)!";
  179. c=0;
  180. alert("打印超过50秒没捕获到成功状态!");
  181. };
  182. };
  183. function PrintWaitLoop(){
  184. if (!waiting) {
  185. LODOP=getLodop();
  186. LODOP.PRINT_INIT("打印控件功能演示_Lodop功能_获得打印状态2");
  187. LODOP.ADD_PRINT_TEXT(50,231,260,39,"打印的页面部分内容");
  188. LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);
  189. if (LODOP.CVERSION) {
  190. LODOP.On_Return_Remain=true;
  191. LODOP.On_Return=function(TaskID,Value){
  192. if (TaskID==TaskID1){
  193. P_ID=Value;
  194. if ((P_ID!="")) {waiting=true;c=0;loop=loop+1;setTimeout("PrintWaitLoop()",200);} else {document.getElementById('T14').value="已停止循环!";};
  195. } else
  196. if (TaskID==TaskID2){
  197. if (Value==0) waiting=false;
  198. setTimeout("PrintWaitLoop()",200);
  199. };
  200. };
  201. TaskID1=LODOP.PRINTA();
  202. } else {
  203. P_ID=LODOP.PRINTA();
  204. if ((P_ID!="")) {waiting=true;c=0;loop=loop+1;setTimeout("PrintWaitLoop()",200);} else {document.getElementById('T14').value="已停止循环!";}
  205. };
  206. } else {
  207. c=c+1;
  208. document.getElementById('T14').value="正打印第"+loop+"个任务(JOB代码"+P_ID+")等待:"+c/5+"秒";
  209. if (LODOP.CVERSION) {
  210. TaskID2=LODOP.GET_VALUE("PRINT_STATUS_EXIST",P_ID);
  211. } else {
  212. if (!LODOP.GET_VALUE("PRINT_STATUS_EXIST",P_ID)) waiting=false;//以是否还在队列为准
  213. setTimeout("PrintWaitLoop()",200);
  214. };
  215. }
  216. }
  217. //从JOB代码找出打印机序号:
  218. function GetPrinterIDfromJOBID(strJOBID){
  219. var intPos=strJOBID.indexOf("_");
  220. if (intPos<0) {return strJOBID;} else {return strJOBID.substr(0,intPos);}
  221. }
  222. //暂停打印:
  223. function ControlPrinterPAUSE(strJOBID){
  224. strPrinterID=GetPrinterIDfromJOBID(strJOBID);
  225. LODOP=getLodop();
  226. if (LODOP.CVERSION) {
  227. LODOP.On_Return=function(TaskID,Value){alert("暂停结果:"+Value);};
  228. LODOP.SET_PRINT_MODE("CONTROL_PRINTER:"+strPrinterID,"PAUSE");
  229. return;
  230. } else {
  231. var strResult=LODOP.SET_PRINT_MODE("CONTROL_PRINTER:"+strPrinterID,"PAUSE");
  232. alert("暂停结果:"+strResult);
  233. };
  234. }
  235. //恢复打印:
  236. function ControlPrinterRESUME(strJOBID){
  237. strPrinterID=GetPrinterIDfromJOBID(strJOBID);
  238. LODOP=getLodop();
  239. if (LODOP.CVERSION) {
  240. LODOP.On_Return=function(TaskID,Value){alert("恢复结果:"+Value);};
  241. LODOP.SET_PRINT_MODE("CONTROL_PRINTER:"+strPrinterID,"RESUME");
  242. return;
  243. } else {
  244. var strResult=LODOP.SET_PRINT_MODE("CONTROL_PRINTER:"+strPrinterID,"RESUME");
  245. alert("恢复结果:"+strResult);
  246. };
  247. }
  248. //清理打印任务:
  249. function ControlPrinterPURGE(strJOBID){
  250. strPrinterID=GetPrinterIDfromJOBID(strJOBID);
  251. LODOP=getLodop();
  252. if (LODOP.CVERSION) {
  253. LODOP.On_Return=function(TaskID,Value){alert("清理结果:"+Value);};
  254. LODOP.SET_PRINT_MODE("CONTROL_PRINTER:"+strPrinterID,"PURGE");
  255. return;
  256. } else {
  257. var strResult=LODOP.SET_PRINT_MODE("CONTROL_PRINTER:"+strPrinterID,"PURGE");
  258. alert("清理结果:"+strResult);
  259. };
  260. }
  261. //如下过程本例没用到,但或许对您有用:
  262. function getStatuMessage(statusID) {
  263. var messages="";
  264. if (statusID & 1) messages += "已暂停 -";
  265. if (statusID & 2) messages += "错误 -";
  266. if (statusID & 4) messages += "正删除 -";
  267. if (statusID & 8) messages += "进入队列 -";
  268. if (statusID & 16) messages += "正在打印 -";
  269. if (statusID & 32) messages += "脱机 -";
  270. if (statusID & 64) messages += "缺纸 -";
  271. if (statusID & 128) messages += "打印结束 -";
  272. if (statusID & 256) messages += "已删除 -";
  273. if (statusID & 512) messages += "堵了 -";
  274. if (statusID & 1024) messages += "用户介入 -";
  275. if (statusID & 2048) messages += "正在重新启动 -";
  276. return messages;
  277. }
  278. </script>
  279. </body>
  280. </html>