1. 程式人生 > >lodop實現列印的功能(下)

lodop實現列印的功能(下)

下文都是重點,先碼程式碼,再講原因:

jsp頁面引入lodopfuncs.js檔案

    <%--新增列印lodop.js--%>
    <script src="${ctxPath }/resources/js/clodop/LodopFuncs.js"></script>
注意:這個目錄就是我們專案中的地址,引用要能找到.


給出一個事件觸發列印事件,這個只是相當於處理資料邏輯,真正的列印執行在print方法中,createPage是拼接頁面列印效果.

此時,因為我們專案中使用的是一個事件同時執行兩個列印任務.所以我們把不同的列印任務所需的印表機型號(或者返回序號index放入了localstorage中),此時獲取到localstorage中的印表機序號

    var LODOP;
    var storage=window.localStorage;

    function rePrintOrder(orderId) {
    
        var row = $(".easyui-datagrid").datagrid("getSelected");
        if(row==null){
            alert("請選中您要列印的訂單資訊");
            return;
        }
        var username=row.userName;
        var paymentType=row.paymentType.value;
        var money=row.paymentPrice;
        var details=[];
        /*ajax根據orderId獲取到所有的商品結果集*/
        var url='${ctxPath}/order/orderDetailList.html';
        $.ajax({
            url: url,
            data: {id: orderId},
            success: function (rsData) {
                if (rsData.message.code != "0") {
                    syscore.alert('提示', rsData.message.mess, 'error');
                    return;
                }
               var goodsList=rsData.result.data;
                console.log(goodsList);
                for(var i=0;i<goodsList.length;i++){
                    details.push(goodsList[i]);
                }
                CreatePrintPage3(username,paymentType,money,details);
                LODOP.PRINT();
            }
        });
    }

建立拼接列印頁面:
 function CreatePrintPage3(username,paymentType,money,details) {
        console.log(details);

        var opTimeFmt = syscore.formatDate(new Date(), 'yyyy-MM-dd hh:mm:ss');
        LODOP=getLodop();

        LODOP.PRINT_INIT("訂單資訊列印");

        //設定pos紙印表機 5830  選擇印表機5830

        LODOP.SET_PRINTER_INDEX(storage.getItem("orderPrint"));

        // 設定基本樣式
        LODOP.SET_PRINT_STYLE("FontSize",10);
        // 離紙張頂端5px、距左邊5px、寬190px、高10px
        LODOP.ADD_PRINT_TEXT(10, 10, 360, 20, "******* 牛牛的店 *******");
        //新增列印內容
        LODOP.ADD_PRINT_TEXT(30,10,360,20,"收款員: "+username);
        LODOP.ADD_PRINT_TEXT(50,10,360,20,"時間:"+opTimeFmt);
        LODOP.ADD_PRINT_TEXT(70,10,360,20,"商品名稱       "+" 數量  "+"價格");
        var height=70;
        //頁面美觀,商品名稱大於9位的取9位
        for(var i=0;i<details.length;i++){
            height+=20;
            var goodsName=details[i].goodsName;
            if(goodsName.length<9){
                LODOP.ADD_PRINT_TEXT(height,10,360,20,goodsName+"  "+details[i].amount+"    "+details[i].salePrice);
            }else{
                goodsName=goodsName.substring(0,8);
                LODOP.ADD_PRINT_TEXT(height,10,360,20,goodsName+"  "+details[i].amount+"    "+details[i].salePrice);
            }
        }
        height+=20;
        LODOP.ADD_PRINT_TEXT(height,10,360,20,"支付方式:  ");
        height+=20;
        if(paymentType=="銀行卡"){
            LODOP.ADD_PRINT_TEXT(height,10,360,20,"銀行卡:"+money);
        }else{
            LODOP.ADD_PRINT_TEXT(height,10,360,20,"銀行卡:  0.00");
        }
        height+=20;
        if(paymentType=="現金"){
            LODOP.ADD_PRINT_TEXT(height,10,360,20,"現金:"+money);
        }else{
            LODOP.ADD_PRINT_TEXT(height,10,360,20,"現金:  0.00");
        }
        height+=20;
        if(paymentType=="一卡通"){
            LODOP.ADD_PRINT_TEXT(height,10,360,20,"一卡通:"+money);
        }else{
            LODOP.ADD_PRINT_TEXT(height,10,360,20,"一卡通:  0.00");
        }
        height+=20;
        if(paymentType=="銀行卡"){
            LODOP.ADD_PRINT_TEXT(height,10,360,20,"第三方支付:"+money);
        }else{
            LODOP.ADD_PRINT_TEXT(height,10,360,20,"第三方支付:  0.00");
        }

        LODOP.ADD_PRINT_TEXT(height+20,10,360,20,"===========結束==========");

        // 如果要把水印往下一點,則取消下面這一行的註釋
        //LODOP.ADD_PRINT_TEXT(125, 5, 360, 20, "");
        LODOP.ADD_PRINT_BARCODE(5, 280, 100, 100);
        LODOP.SET_PRINT_PAGESIZE(1, 1000, 150, 20);
    };


注意:print_init一定要在set屬性的最上面,相當於初始化一個列印任務.set_print_index(index);方法是獲取到本機中指定列印序號index的印表機.

下面就是我們看一下,獲取到指定印表機的序號:

    /*=======================設定標籤印表機 開始==========================*/
    function SelectAsDefaultPrinter4tag() {
        LODOP = getLodop();
        if (LODOP.CVERSION) {
            LODOP.On_Return = function (TaskID, Value) {
                if (Value >= 0) {
                    //將選擇的tag印表機序號存入cookie中
                    if (Value >= 0) {
                        //將選擇的tag印表機序號存入cookie中
                        if (!window.localStorage) {
                            syscore.alert('提示','該瀏覽器不支援localstorage','info');
                            return false;
                        } else {
                            storage.setItem("tagPrint", Value);
                            console.log(storage.getItem("tagPrint"));
                        }
                        syscore.alert('提示','選擇成功','info');
                    } else {
                        syscore.alert('提示','選擇失敗','info');
                    }
                }
                ;
                LODOP.SELECT_PRINTER();
                return;
            };
            if (LODOP.SELECT_PRINTER() >= 0)
                syscore.alert('提示','選擇成功','info'); else syscore.alert('提示','選擇失敗','info');
        }
        ;
    }
    /*=======================設定標籤印表機 結束==========================*/

設定預設印表機,會在頁面有一個彈窗,我們選擇印表機後,會返回該印表機在本地的列印序號.


這樣我們的localstorage就記錄住了,以後就不需要再選擇印表機了.

畫重點:

看lodopfuncs.js中的內容:

var CreatedOKLodop7766=null;

//====判斷是否需要安裝CLodop雲列印伺服器:====
function needCLodop(){
    try{
        var ua=navigator.userAgent;
        if (ua.match(/Windows\sPhone/i) !=null) return true;
        if (ua.match(/iPhone|iPod/i) != null) return true;
        if (ua.match(/Android/i) != null) return true;
        if (ua.match(/Edge\D?\d+/i) != null) 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==null)&&(verIE==null)&&(x64!==null))
            return true; else
        if ( verFF !== null) {
            verFF = verFF[0].match(/\d+/);
            if ((verFF[0]>= 41)||(x64!==null)) return true;
        } else
        if ( verOPR !== null) {
            verOPR = verOPR[0].match(/\d+/);
            if ( verOPR[0] >= 32 ) return true;
        } else
        if ((verTrident==null)&&(verIE==null)) {
            var verChrome=ua.match(/Chrome\D?\d+/i);
            if ( verChrome !== null ) {
                verChrome = verChrome[0].match(/\d+/);
                if (verChrome[0]>=41) return true;
            };
        };
        return false;
    } catch(err) {return true;};
};

//====頁面引用CLodop雲列印必須的JS檔案:====
if (needCLodop()) {
    var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
    var oscript = document.createElement("script");
    oscript.src ="http://localhost:8000/CLodopfuncs.js?priority=1";
    head.insertBefore( oscript,head.firstChild );

    //引用雙埠(8000和18000)避免其中某個被佔用:
    oscript = document.createElement("script");
    oscript.src ="http://localhost:18000/CLodopfuncs.js?priority=0";
    head.insertBefore( oscript,head.firstChild );
};

//====獲取LODOP物件的主過程:====
function getLodop(oOBJECT,oEMBED){
    // 取系統上下文
    var curWwwPath=window.document.location.href;
    var pathName=window.document.location.pathname;
    var pos=curWwwPath.indexOf(pathName);
    var localhostPath=curWwwPath.substring(0,pos);

    var strHtmInstall="<br><font color='#FF00FF'>列印控制元件未安裝!點選這裡<a href='"+localhostPath+"/pos-web/resources/js/clodop/install_lodop32.exe' target='_self'>執行安裝</a>,安裝後請重新整理頁面或重新進入。</font>";
    var strHtmUpdate="<br><font color='#FF00FF'>列印控制元件需要升級!點選這裡<a href='"+localhostPath+"/pos-web/resources/js/clodop/install_lodop32.exe' target='_self'>執行升級</a>,升級後請重新進入。</font>";
    var strHtm64_Install="<br><font color='#FF00FF'>列印控制元件未安裝!點選這裡<a href='"+localhostPath+"/pos-web/resources/js/clodop/install_lodop64.exe' target='_self'>執行安裝</a>,安裝後請重新整理頁面或重新進入。</font>";
    var strHtm64_Update="<br><font color='#FF00FF'>列印控制元件需要升級!點選這裡<a href='"+localhostPath+"/pos-web/resources/js/clodop/install_lodop64.exe' target='_self'>執行升級</a>,升級後請重新進入。</font>";
    var strHtmFireFox="<br><br><font color='#FF00FF'>(注意:如曾安裝過Lodop舊版附件npActiveXPLugin,請在【工具】->【附加元件】->【擴充套件】中先卸它)</font>";
    var strHtmChrome="<br><br><font color='#FF00FF'>(如果此前正常,僅因瀏覽器升級或重安裝而出問題,需重新執行以上安裝)</font>";
    var strCLodopInstall="<br><font color='#FF00FF'>CLodop雲列印服務(localhost本地)未安裝啟動!點選這裡<a href='"+localhostPath+"/pos-web/resources/js/clodop/CLodop_Setup_for_Win32NT.exe' target='_self'>執行安裝</a>,安裝後請重新整理頁面。</font>";
    var strCLodopUpdate="<br><font color='#FF00FF'>CLodop雲列印服務需升級!點選這裡<a href='"+localhostPath+"/pos-web/resources/js/clodop/CLodop_Setup_for_Win32NT.exe' target='_self'>執行升級</a>,升級後請重新整理頁面。</font>";
    var LODOP;
    try{
        var isIE = (navigator.userAgent.indexOf('MSIE')>=0) || (navigator.userAgent.indexOf('Trident')>=0);
        if (needCLodop()) {
            try{ LODOP=getCLodop();} catch(err) {};
            if (!LODOP && document.readyState!=="complete") {alert("C-Lodop沒準備好,請稍後再試!"); return;};
            if (!LODOP) {
                if (isIE) document.write(strCLodopInstall); else
                    document.body.innerHTML=strCLodopInstall+document.body.innerHTML;
                return;
            } else {
                /*修改clodop的版本號判斷,不使用最新版的clodop一樣可以實現列印功能*/
                if (CLODOP.CVERSION<"2.0.5.3") {
                    if (isIE) document.write(strCLodopUpdate); else
                        document.body.innerHTML=strCLodopUpdate+document.body.innerHTML;
                };
                if (oEMBED && oEMBED.parentNode) oEMBED.parentNode.removeChild(oEMBED);
                if (oOBJECT && oOBJECT.parentNode) oOBJECT.parentNode.removeChild(oOBJECT);
            };
        } else {
            var is64IE  = isIE && (navigator.userAgent.indexOf('x64')>=0);
            //=====如果頁面有Lodop就直接使用,沒有則新建:==========
            if (oOBJECT!=undefined || oEMBED!=undefined) {
                if (isIE) LODOP=oOBJECT; else  LODOP=oEMBED;
            } else if (CreatedOKLodop7766==null){
                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 (isIE) LODOP.setAttribute("classid","clsid:2105C259-1E0C-4534-8141-A753534CB4CA");
                else LODOP.setAttribute("type","application/x-print-lodop");
                document.documentElement.appendChild(LODOP);
                CreatedOKLodop7766=LODOP;
            } else LODOP=CreatedOKLodop7766;
            //=====Lodop外掛未安裝時提示下載地址:==========
            if ((LODOP==null)||(typeof(LODOP.VERSION)=="undefined")) {
                if (navigator.userAgent.indexOf('Chrome')>=0)
                    document.body.innerHTML=strHtmChrome+document.body.innerHTML;
                if (navigator.userAgent.indexOf('Firefox')>=0)
                    document.body.innerHTML=strHtmFireFox+document.body.innerHTML;
                if (is64IE) document.write(strHtm64_Install); else
                if (isIE)   document.write(strHtmInstall);    else
                    document.body.innerHTML=strHtmInstall+document.body.innerHTML;
                return LODOP;
            };
        };
        /*修改lodop的版本號判斷,在6.2以下的版本中都可以使用*/
        if (LODOP.VERSION<"6.2.0.4") {
            if (!needCLodop()){
                if (is64IE) document.write(strHtm64_Update); else
                if (isIE) document.write(strHtmUpdate); else
                    document.body.innerHTML=strHtmUpdate+document.body.innerHTML;
            };
            return LODOP;
        };
        //===如下空白位置適合呼叫統一功能(如註冊語句、語言選擇等):===

        //===========================================================
        return LODOP;
    } catch(err) {alert("getLodop出錯:"+err);};
};


東西比較多,就一點點來拆分讀取程式碼:

獲取lodop物件的主過程的函式,我們要修改自己放置安裝包的絕對路徑.這個絕對路徑需要我們自己去修改的,就像我貼的第一張圖片的路徑一樣.引用能夠找到該檔案.

菜鳥一個,之後有新發現,會持續更新.