web打印插件-CLODOP

1,016 阅读1分钟

web打印插件-CLODOP

<div class="container-div">
    <div id="print" style="font-family:黑体;">
        <div id="printContet" media='print' class="pdf-wrapper">
        </div>
    </div>
</div>

<script type="text/javascript">
    var CreatedOKLodopObject, CLodopIsLocal, CLodopJsState;
    var LODOP;
    var $;
    var ids = ys.request("ids");
    var printContents = []
    $(function () {
        getForm()
    });
    //打印方法
    function htmlToPDF(printDiv, filesName) {
        html2canvas(printDiv, {
            foreignObjectRendering: true, // 是否在浏览器支持的情况下使用ForeignObject渲染
            useCORS: true, // 是否尝试使用CORS从服务器加载图像
            async: false, // 是否异步解析和呈现元素
            // 以下字段必填
            background: "#ffffff", // 一定要添加背景颜色,否则出来的图片,背景全部都是透明的
            dpi: 300, // 处理模糊问题
            onrendered: function (canvas) {
                document.getElementById("printImageBox").appendChild(canvas);
                //printDiv.appendChild(canvas);

                var contentWidth = canvas.width;
                var contentHeight = canvas.height;

                //一页pdf显示html页面生成的canvas高度;
                var pageHeight = contentWidth / 592.28 * 841.89;
                //未生成pdf的html页面高度
                var leftHeight = contentHeight;
                //页面偏移
                var position = 0;
                //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
                var imgWidth = 595.28;
                var imgHeight = 592.28 / contentWidth * contentHeight;

                var pageData = canvas.toDataURL('image/png', 1.0)

                var pdf = new jsPDF('', 'pt', 'a4');

                //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
                //当内容未超过pdf一页显示的范围,无需分页
                if (leftHeight < pageHeight) {
                    pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight);
                } else {
                    while (leftHeight > 0) {
                        pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
                        leftHeight -= pageHeight;
                        position -= 841.89;
                        //避免添加空白页
                        if (leftHeight > 0) {
                            pdf.addPage();
                        }
                    }
                }
                pdf.save(filesName);
            }
        })
    }

    //==判断是否需要CLodop(那些不支持插件的浏览器):==
    function needCLodop() {
        try {
            var ua = navigator.userAgent;
            if (ua.match(/Windows\sPhone/i))
                return true;
            if (ua.match(/iPhone|iPod|iPad/i))
                return true;
            if (ua.match(/Android/i))
                return true;
            if (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;
        }
    }

    //==加载引用CLodop的主JS,用双端口8000和18000(以防其中一个被占):==
    function loadCLodop() {
        if (CLodopJsState == "loading" || CLodopJsState == "complete") return;
        CLodopJsState = "loading";
        var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
        var JS1 = document.createElement("script");
        var JS2 = document.createElement("script");
        JS1.src = "http://localhost:8000/CLodopfuncs.js?priority=1";
        JS2.src = "http://localhost:18000/CLodopfuncs.js";
        JS1.onload = JS2.onload = function () { CLodopJsState = "complete"; }
        JS1.onerror = JS2.onerror = function (evt) { CLodopJsState = "complete"; }
        head.insertBefore(JS1, head.firstChild);
        head.insertBefore(JS2, head.firstChild);
        CLodopIsLocal = !!((JS1.src + JS2.src).match(/\/\/localho|\/\/127.0.0./i));
    }

    if (needCLodop()) { loadCLodop(); }//加载

    //==获取LODOP对象主过程,判断是否安装、需否升级:==
    function getLodop(oOBJECT, oEMBED) {
        var strHtmInstall = "<font color='#FF00FF'>打印控件未安装!点击这里<a href='/lib/lodop/install_lodop32.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
        var strHtmUpdate = "<font color='#FF00FF'>打印控件需要升级!点击这里<a href='/lib/lodop/install_lodop32.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
        var strHtm64_Install = "<font color='#FF00FF'>打印控件未安装!点击这里<a href='/lib/lodop/install_lodop64.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
        var strHtm64_Update = "<font color='#FF00FF'>打印控件需要升级!点击这里<a href='/lib/lodop/install_lodop64.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
        var strHtmFireFox = "<font color='#FF00FF'>(注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)</font>";
        var strHtmChrome = "<font color='#FF00FF'>(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)</font>";
        var strCLodopInstall_1 = "<font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='/lib/lodop/CLodop_Setup_for_Win32NT.exe' target='_self'>下载执行安装</a>";
        var strCLodopInstall_2 = "(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)";
        var strCLodopInstall_3 = ",成功后请刷新本页面。</font>";
        var strCLodopUpdate = "<font color='#FF00FF'>Web打印服务CLodop需升级!点击这里<a href='/lib/lodop/CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>,升级后请刷新页面。</font>";
        var LODOP;
        try {
            var ua = navigator.userAgent;
            var isIE = !!(ua.match(/MSIE/i)) || !!(ua.match(/Trident/i));
            if (needCLodop()) {
                try {
                    LODOP = getCLodop();
                } catch (err) { }
                if (!LODOP && CLodopJsState !== "complete") {
                    if (CLodopJsState == "loading") {
                        layer.alert("网页还没下载完毕,请稍等一下再操作.")
                    } else {
                        layer.alert("没有加载CLodop的主js,请先调用loadCLodop过程.")
                    }
                    return false;
                }
                if (!LODOP) {
                    layer.alert(strCLodopInstall_1 + (CLodopIsLocal ? strCLodopInstall_2 : "") + strCLodopInstall_3);
                    return false;
                } else {
                    if (CLODOP.CVERSION < "4.1.0.4") {
                        layer.alert(strCLodopUpdate);
                    }
                    if (oEMBED && oEMBED.parentNode) {
                        oEMBED.parentNode.removeChild(oEMBED); //清理旧版无效元素
                    }
                    if (oOBJECT && oOBJECT.parentNode) {
                        oOBJECT.parentNode.removeChild(oOBJECT);
                    }
                }
            } else {
                var is64IE = isIE && !!(ua.match(/x64/i));
                //==如果页面有Lodop就直接使用,否则新建:==
                if (oOBJECT || oEMBED) {
                    if (isIE) {
                        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 (isIE) {
                        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)) {
                    if (ua.indexOf('Chrome') >= 0) {
                        layer.alert(strHtmChrome);
                    }
                    if (ua.indexOf('Firefox') >= 0) {
                        layer.alert((is64IE ? strHtm64_Install : strHtmInstall) + strHtmFireFox);
                    }
                    return LODOP;
                }
            }
            if (LODOP.VERSION < "6.2.2.6") {
                if (!needCLodop()) {
                    layer.alert(is64IE ? strHtm64_Update : strHtmUpdate);
                }
            }
            //===如下空白位置适合调用统一功能(如注册语句、语言选择等):==


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

    function getForm() {
        ys.ajax({
            url: '@Url.Content("~/OrderManage/Order/GetPrintOrder")' + '?ids=' + ids,
            type: 'post',
            success: function (obj) {
                if (obj.Tag == 1) {
                    var data = obj.Result;
                    for (i in data) {
                        //$("#printTable").remove();
                        // 将数据转换成打印html
                        var content = printGoodsTemplate(data[i],i);
                        // 多组数据多页打印
                        printContents.push(content)
                        $("#printContet").append(content);
                    }
                }
                else {
                    ys.msgError(obj.Message);
                }
            }
        });
    }
    // 打印
    function saveForm(index) {
        LODOP = getLodop();
        for(let i = 0; i < printContents.length; i ++) {
            LODOP.NewPageA(); 
            // LODOP.NewPage();强制分页,前面的自动分页会覆盖后面的页面,和后面页面内容同时输出。
            // LODOP.NewPageA();强制分页,前面的自动分页,后面的页面会在自动分页的后面添加新页面。
            LODOP.ADD_PRINT_HTM(20, "5%", "90%", "100%", document.getElementById("printTable" + i).innerHTML);
            
        }
        LODOP.PREVIEW();
    }
    //打印模板
    function printGoodsTemplate(data,index) {
        var dataContet = "" +
            "<div id='printTable" + index + "'>" +
            "<div media='print' style='font-family:黑体; font-size:10px;margin-top: 22px; padding: 5px;'>" +
            "<div style='width:100%;margin:0 auto;text-align: center;'>" +
            "<h2 style='font-weight:bold' media='print'>" + "浙江元通汽车零部件有限公司" + "</h2>" +
            "<h3 style='padding:12px 0px 34px 0;'>拣货单</h3>" +
            /*"		    <div style='float:right;    font-size: 14px;font-weight: 800;'>1/1</div>" + */
            "		</div>" +
            "<div style='margin: 10px 0;width:100%;overflow:hidden'>" +
            "	<div style='width:50%;float:left'>送货客户:<span id=''>" + isNullOrUndef(data.CustomerName) + "</span></div>" +
            "	<div style='width:25%;float:left'>出库日期:<span id=''>" + ys.formatDate(new Date(), "yyyy-MM-dd") + "</span></div>" +
            "	<div style='width:25%;float:left'>订单号:<span id=''>" + isNullOrUndef(data.Id) + "</span></div>" +
            "</div>" +
            "<div style='margin: 10px 0'>" +
            "	<div>备注:<span id=''>" + isNullOrUndef(data.OrderRemark) + "</span></div>" +
            "</div>" +
            "		<table border='1' cellspacing='0' cellpadding='0' border-collapse='separate' style='width:100%;table-layout:fixed;font-size:12px' id='printtable2'>" +
            "		    <tr height='30px;'>" +
            "		        <td style='text-align:center;margin: 0; padding: 0;font-weight:bold;width:55px'>序号</td>" +
            "		        <td style='text-align:center;margin: 0; padding: 0;font-weight:bold;width:120px'>备件号</td>" +
            "		        <td style='text-align:center;margin: 0; padding: 0;font-weight:bold;'>备件名</td>" +
            "		        <td style='text-align:center;margin: 0; padding: 0;font-weight:bold;'>规格</td>" +
            "		        <td style='text-align:center;margin: 0; padding: 0;font-weight:bold;width:55px'>数量</td>" +
            "		        <td style='text-align:center;margin: 0; padding: 0;font-weight:bold;width:55px'>单位</td>" +
            "		        <td style='text-align:center;margin: 0; padding: 0;font-weight:bold;width:80px'>品牌</td>" +
            "		    </tr>";
        for (let i = 0; i < data.Details.length; i++) {
            dataContet += "<tr height='30px;'>" +
                "<td style='text-align:center; margin: 0; padding: 0'>" + (i+1) + "</td>" +
                "<td style='text-align:center; margin: 0; padding: 0;word-wrap:break-word;overflow:hidden;'>" + isNullOrUndef(data.Details[i].ProductCode) + "</td>" +
                "<td style='text-align:center; margin: 0; padding: 0;word-wrap:break-word;overflow:hidden;'>" + isNullOrUndef(data.Details[i].ProductName) + "</td>" +
                "<td style='text-align:center; margin: 0; padding: 0;word-wrap:break-word;overflow:hidden;'>" + isNullOrUndef(data.Details[i].Spec) + "</td>" +
                "<td style='text-align:center; margin: 0; padding: 0'>" + isNullOrUndef(data.Details[i].Count) + "</td>" +
                "<td style='text-align:center; margin: 0; padding: 0'>" + isNullOrUndef(data.Details[i].Unit) + "</td>" +
                "<td style='text-align:center; margin: 0; padding: 0'>" + isNullOrUndef(data.Details[i].ProductBrand) + "</td>" +
                "</tr>";
        }
        dataContet += "</table>" +
            "  <div>" +
            "	    <div style='margin: 10px 0'>" +
            "	      	<span>送货地址:</span><span id='qtyTranPlanBillCount'>" + isNullOrUndef(data.ReceviceAddress) + " " + isNullOrUndef(data.ReceviceManPhone) + "</span>" +
            "	    </div>" +
            " 	</div>" +
            "  <div class=''>" +
            "	    <div style='width:18%;float:left'>" +
            "	      	<span>开单员: </span><span id='qtyTranPlanBillCount'>" + "" + "</span>" +
            "	    </div>" +
            "	    <div style='width:18%;float:left'>" +
            "	      	<span>发货员: </span><span id='qtyOrderCount'></span>" +
            "	    </div>" +
            "	    <div style='width:23%;float:left'>" +
            "	      	<span>配送领料员: </span><span id='qtyBrandCount'></span>" +
            "	    </div>" +
            "	    <div style='width:18%;float:left'>" +
            "	      	<span>客户签收: </span><span id='qtyDrawSum'></span>" +
            "	    </div>" +
            "	    <div style='width:23%;float:left'>" +
            "	      	<span>签收日期: </span><span id='amtDrawSum'></span>" +
            "	    </div>" +
            " 	</div>" +
            " </div>";

        return dataContet;
    }
    //去空
    function isNullOrUndef(str) {
        if ((str == null || str == undefined || str == "") && str != 0) {
            return "";
        }
        return str;
    }
</script>

QQ浏览器截图20220221155808.png