• 前端使用C-lodop 实现循环套打小案例


    前言

    lodop是一个很优秀打印插件,具体的大家可以官网了解,先在官网下载插件,安装在本地,并启动,点击官网下载

    引入js文件

    //==本JS是加载Lodop插件或Web打印服务CLodop/Lodop7的综合示例,可直接使用,建议理解后融入自己程序==
    
    //用双端口加载主JS文件Lodop.js(或CLodopfuncs.js兼容老版本)以防其中某端口被占:
    var MainJS ="CLodopfuncs.js",
        URL_WS1   = "ws://localhost:8000/"+MainJS,                //ws用8000/18000
        URL_WS2   = "ws://localhost:18000/"+MainJS,
        URL_HTTP1 = "http://localhost:8000/"+MainJS,              //http用8000/18000
        URL_HTTP2 = "http://localhost:18000/"+MainJS,
        URL_HTTP3 = "https://localhost.lodop.net:8443/"+MainJS;   //https用8000/8443
    
    var CreatedOKLodopObject, CLodopIsLocal, LoadJsState;
    
    //==判断是否需要CLodop(那些不支持插件的浏览器):==
    function needCLodop() {
        try {
            var ua = navigator.userAgent;
            if (ua.match(/Windows\sPhone/i) ||
                ua.match(/iPhone|iPod|iPad/i) ||
                ua.match(/Android/i) ||
                ua.match(/Edge\D?\d+/i))
                return true;
            var verTrident = ua.match(/Trident\D?\d+/i);
            var verIE = ua.match(/MSIE\D?\d+/i);
            var verOPR = ua.match(/OPR\D?\d+/i);
            var verFF = ua.match(/Firefox\D?\d+/i);
            var x64 = ua.match(/x64/i);
            if ((!verTrident) && (!verIE) && (x64)) return true;
            else if (verFF) {
                verFF = verFF[0].match(/\d+/);
                if ((verFF[0] >= 41) || (x64)) return true;
            } else if (verOPR) {
                verOPR = verOPR[0].match(/\d+/);
                if (verOPR[0] >= 32) return true;
            } else if ((!verTrident) && (!verIE)) {
                var verChrome = ua.match(/Chrome\D?\d+/i);
                if (verChrome) {
                    verChrome = verChrome[0].match(/\d+/);
                    if (verChrome[0] >= 41) return true;
                }
            }
            return false;
        } catch (err) {
            return true;
        }
    }
    
    //==检查加载成功与否,如没成功则用http(s)再试==
    //==低版本CLODOP6.561/Lodop7.043及前)用本方法==
    function checkOrTryHttp() {
      if (window.getCLodop) {
         LoadJsState = "complete";
         return true;
      }
      if (LoadJsState == "loadingB" || LoadJsState == "complete") return;
      LoadJsState = "loadingB";
      var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
      var JS1 = document.createElement("script")
         ,JS2 = document.createElement("script")
         ,JS3 = document.createElement("script");
      JS1.src = URL_HTTP1;
      JS2.src = URL_HTTP2;
      JS3.src = URL_HTTP3;
      JS1.onload = JS2.onload = JS3.onload = JS2.onerror = JS3.onerror=function(){LoadJsState = "complete";}
      JS1.onerror = function(e) {
          if (window.location.protocol !== 'https:')
              head.insertBefore(JS2, head.firstChild); else
              head.insertBefore(JS3, head.firstChild);
      }
      head.insertBefore(JS1,head.firstChild);
    }
    
    //==加载Lodop对象的主过程:==
    (function loadCLodop(){
      if (!needCLodop()) return;
      CLodopIsLocal = !!((URL_WS1 + URL_WS2).match(/\/\/localho|\/\/127.0.0./i));
      LoadJsState = "loadingA";
      if (!window.WebSocket && window.MozWebSocket) window.WebSocket=window.MozWebSocket;
      //ws方式速度快(小于200ms)且可避免CORS错误,但要求Lodop版本足够新:
      try {
        var WSK1=new WebSocket(URL_WS1);
        WSK1.onopen = function(e) { setTimeout("checkOrTryHttp()",200); }
        WSK1.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}
        WSK1.onerror = function(e) {
             var WSK2=new WebSocket(URL_WS2);
             WSK2.onopen = function(e) {setTimeout("checkOrTryHttp()",200);}
             WSK2.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}
             WSK2.onerror= function(e) {checkOrTryHttp();}
        }
      } catch(e){
        checkOrTryHttp();
      }
    })();
    
    //==获取LODOP对象主过程,判断是否安装、需否升级:==
    function getLodop(oOBJECT, oEMBED) {
        var strFontTag = "
    打印控件"
    ; var strLodopInstall = strFontTag + "未安装!点击这里执行安装"; var strLodopUpdate = strFontTag + "需要升级!点击这里执行升级"; var strLodop64Install = strFontTag + "未安装!点击这里执行安装"; var strLodop64Update = strFontTag + "需要升级!点击这里执行升级"; var strCLodopInstallA = "
    Web打印服务CLodop未安装启动,点击这里下载执行安装"
    ; var strCLodopInstallB = "
    (若此前已安装过,可点这里直接再次启动)"
    ; var strCLodopUpdate = "
    Web打印服务CLodop需升级!点击这里执行升级"
    ; var strLodop7FontTag = "
    Web打印服务Lodop7"
    ; var strLodop7HrefX86 = "点击这里下载安装(下载后解压,点击lodop文件开始执行)"; var strLodop7HrefARM = "点击这里下载安装(下载后解压,点击lodop文件开始执行)"; var strLodop7Install_X86 = strLodop7FontTag + "未安装启动," + strLodop7HrefX86; var strLodop7Install_ARM = strLodop7FontTag + "未安装启动," + strLodop7HrefARM; var strLodop7Update_X86 = strLodop7FontTag + "需升级," + strLodop7HrefX86; var strLodop7Update_ARM = strLodop7FontTag + "需升级," + strLodop7HrefARM; var strInstallOK = ",成功后请刷新本页面或重启浏览器。"; var LODOP; try { var isWinIE = (/MSIE/i.test(navigator.userAgent)) || (/Trident/i.test(navigator.userAgent)); var isWinIE64 = isWinIE && (/x64/i.test(navigator.userAgent)); var isLinuxX86 = (/Linux/i.test(navigator.platform)) && (/x86/i.test(navigator.platform)); var isLinuxARM = (/Linux/i.test(navigator.platform)) && (/aarch/i.test(navigator.platform)); if (needCLodop() || isLinuxX86 || isLinuxARM) { try { LODOP = window.getCLodop(); } catch (err) {} if (!LODOP && LoadJsState !== "complete") { if (!LoadJsState) alert("未曾加载Lodop主JS文件,请先调用loadCLodop过程."); else alert("网页还没下载完毕,请稍等一下再操作."); return; } var strAlertMessage; if (!LODOP) { if (isLinuxX86) strAlertMessage = strLodop7Install_X86; else if (isLinuxARM) strAlertMessage = strLodop7Install_ARM; else strAlertMessage = strCLodopInstallA + (CLodopIsLocal ? strCLodopInstallB : ""); document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML; return; } else { if (isLinuxX86 && LODOP.CVERSION < "7.0.4.3") strAlertMessage = strLodop7Update_X86; else if (isLinuxARM && LODOP.CVERSION < "7.0.4.3") strAlertMessage = strLodop7Update_ARM; else if (CLODOP.CVERSION < "6.5.7.7") strAlertMessage = strCLodopUpdate; if (strAlertMessage) document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML; } } else { //==如果页面有Lodop插件就直接使用,否则新建:== if (oOBJECT || oEMBED) { if (isWinIE) LODOP = oOBJECT; else LODOP = oEMBED; } else if (!CreatedOKLodopObject) { LODOP = document.createElement("object"); LODOP.setAttribute("width", 0); LODOP.setAttribute("height", 0); LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;"); if (isWinIE) LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA"); else LODOP.setAttribute("type", "application/x-print-lodop"); document.documentElement.appendChild(LODOP); CreatedOKLodopObject = LODOP; } else LODOP = CreatedOKLodopObject; //==Lodop插件未安装时提示下载地址:== if ((!LODOP) || (!LODOP.VERSION)) { document.body.innerHTML = (isWinIE64 ? strLodop64Install : strLodopInstall) + strInstallOK + document.body.innerHTML; return LODOP; } if (LODOP.VERSION < "6.2.2.6") { document.body.innerHTML = (isWinIE64 ? strLodop64Update : strLodopUpdate) + strInstallOK + document.body.innerHTML; } } //===如下空白位置适合调用统一功能(如注册语句、语言选择等):======================= //=============================================================================== return LODOP; } catch (err) { alert("getLodop出错:" + err); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189

    小案例

    DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Documenttitle>
        <script src="LodopFuncs.js">script>
    head>
    
    <body>
        <a href="JavaScript:Preview1()">打印预览a>
    
    
        <script>
            var LODOP; //声明为全局变量   
            var P_ID = '',
                loop = 1,
                c = 0,
                t = null;
                
            async function Preview1() {
                LODOP = getLodop();
    
                const printData = [1, 2];
                var count = 2, loop = 1;
                while (count >= 1) {
                    const resp = await singlePrint(printData[count - 1]);
                    if(resp == 'error') {
                        console.log('超时,未响应,中止打印')
                        break;
                    }
                    loop++;
                    count--;
                }
    
    
            };
    
            function AddPrintContent(printData) {
                LODOP.ADD_PRINT_TEXT(0, 0, 100, 20, "郭德强" + printData);
            };
    
            function singlePrint(printData) {
                LODOP.PRINT_INIT('测试1');
                LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS", true);
                LODOP.SET_PRINT_PAGESIZE(1, "200mm", "200mm"); // 设置固定纸张大小, 以及设置打印的顺序
                AddPrintContent(printData);
    
    
                return new Promise((reslove, reject) => {
                    if (LODOP.CVERSION) {
                        console.log('step1')
                        LODOP.On_Return = function (TaskID, Value) {
                            console.log('当前的P_ID', Value) // 0表示不成功 1表示成功
                            // 产生了JOB
                            P_ID = Value;
                            // 如果正常产生了JOB码, 那么解析来就是去监听对应的打印状态
                            if (P_ID && P_ID != '0') {
                                c = 0;
                                waitFor(reslove)
                            }
                        };
                        LODOP.PRINTA();
                    } else {
                        console.log('step2')
                        console.log(LODOP.PRINTA());
                    }
                })
            }
            //获得该JOB是否已经打印成功
            function waitFor(reslove) {
                console.log('exe watifor')
                c = c + 1;
                console.log(`正在处理${loop}`)
                console.log(`正等待(JOB代码是"+${P_ID}+")打印结果:"+${c}+"秒`)
                t = setTimeout(() => waitFor(reslove), 2000);
                LODOP.On_Return_Remain = true;
                LODOP.On_Return = function (TaskID, Value) {
                    console.log(`TaskID ${TaskID},  TaskID1 ${TaskID1}, TaskID2 ${TaskID2}, `)
                    if (TaskID == TaskID1) {
                        if (Value == 1) {
                            clearTimeout(t)
                            console.log(`${TaskID1}打印成功`)
                            c = 0;
                            reslove('success');
                        }
                    } else if (TaskID == TaskID2) {
                        if (Value == 0) {
                            clearTimeout(t)
                            c = 0;
                            console.log(`${TaskID2}打印任务被删除!`)
                            reslove('success');
                        };
                    };
                };
                TaskID1 = LODOP.GET_VALUE("PRINT_STATUS_OK", P_ID);
                TaskID2 = LODOP.GET_VALUE("PRINT_STATUS_EXIST", P_ID);
    
                if (c > 15) {
                    clearTimeout(t);
                    c = 0;
                    alert("打印超过15秒没捕获到成功状态!");
                    reslove('error')
                };
    
            }
    
    
    
        script>
    body>
    
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
  • 相关阅读:
    有哪些好用的实时网络流量监控软件
    上半年绩效差,「营销分析报告」无从下手,这套模板领导一看就懂
    pytorch 训练过程-visdom可视化
    低功耗引擎Cliptrix为什么可以成为IOT的高效能工具
    Outlook导入导出功能灰色,怎么解决
    OrbbecSDK_ros关于imu数据的发布
    如何完美解决前端数字计算精度丢失与数字格式化问题?
    线程池实现原理
    Java核心知识经典面试题来啦(基础语法篇)
    三位球形模型应用
  • 原文地址:https://blog.csdn.net/QQ_hoverer/article/details/134322772