vue项目接入Web打印服务C-Lodop,实现用户自定义纸张大小

1,549 阅读2分钟

vue项目接入Web打印服务C-Lodop,实现用户自定义纸张大小,一般用于打印订单(如下图)。 image.png

打印预览 image.png

实现步骤:

1.安装C-Lopod控件 www.lodop.net/download.ht…

image.png

2.引入LodopFuncs.js文件
//用双端口加载主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

//==检查加载成功与否,如没成功则用http(s)再试==
//==低版本CLODOP6.561/Lodop7.043及前)用本方法==
function checkOrTryHttp() {
  if (window.getCLodop)  return true;
  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.onerror = function(e) {
    if (window.location.protocol !== 'https:')
      head.insertBefore(JS2, head.firstChild); else
      head.insertBefore(JS3, head.firstChild);
  }
  JS2.onerror = JS3.onerror=function(){
    var JSelf = document.createElement("script");
    JSelf.src = "/"+MainJS; //JSelf让其它电脑通过本机打印(仅适用CLodop自带例子)
    document.head.insertBefore(JSelf, document.head.firstChild);
  }
  head.insertBefore(JS1,head.firstChild);
}

//==加载Lodop对象的主过程:==
(function loadCLodop(){
  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 LODOP;
  try {
    LODOP = window.getCLodop();
    if (!LODOP && document.readyState !== "complete") {
      alert("C-Lodop没准备好,请稍后再试!");
      return;
    }
    //清理原例子内的object或embed元素,避免乱提示:
    if (oEMBED && oEMBED.parentNode)  oEMBED.parentNode.removeChild(oEMBED);
    if (oOBJECT && oOBJECT.parentNode)oOBJECT.parentNode.removeChild(oOBJECT);
    return LODOP;
  } catch (err) {
    alert("未安装或启动Web打印服务C-Lodop!");
  }
}

export default getLodop
3.vue文件
<template>
    <div>
        <!-- 打印部分的html,不能使用组件,需使用html标签 -->
        <table
          border="1"
          cellpadding='0'
          cellspacing='0'
          style="border-color: #CCCCCC;border-collapse:collapse;height: auto;margin-top: 20px;width: 100%;box-sizing: border-box;"
        >
          <tr>
            <th style="border-color: #CCCCCC;font-size: 14px;height: 40px;width: 5%;box-sizing: border-box">序号</th>
            <th style="border-color: #CCCCCC;font-size: 14px;height: 40px;width: 15%;box-sizing: border-box">配件编码</th>
            <th style="border-color: #CCCCCC;font-size: 14px;height: 40px;width: 10%;box-sizing: border-box">配件名称</th>
            <th style="border-color: #CCCCCC;font-size: 14px;height: 40px;width: 15%;box-sizing: border-box">车型</th>
            <th style="border-color: #CCCCCC;font-size: 14px;height: 40px;width: 10%;box-sizing: border-box">产地</th>
            <th style="border-color: #CCCCCC;font-size: 14px;height: 40px;width: 5%;box-sizing: border-box">数量</th>
            <th style="border-color: #CCCCCC;font-size: 14px;height: 40px;width: 10%;box-sizing: border-box">单价</th>
            <th style="border-color: #CCCCCC;font-size: 14px;height: 40px;width: 10%;box-sizing: border-box">钉箱费</th>
            <th style="border-color: #CCCCCC;font-size: 14px;height: 40px;width: 10%;box-sizing: border-box">总金额</th>
            <th style="border-color: #CCCCCC;font-size: 14px;height: 40px;width: 10%;box-sizing: border-box">仓位</th>
          </tr>
          <tr v-for="(item, index) in tableData" :key="index">
            <td style="border-color: #CCCCCC;padding: 5px;text-align: center;box-sizing: border-box;height: 40px;">{{index+1}}</td>
            <td style="border-color: #CCCCCC;padding: 5px;text-align: center;box-sizing: border-box;">{{item.oe_number}}</td>
            <td style="border-color: #CCCCCC;padding: 5px;text-align: center;box-sizing: border-box;">{{item.goods_title}}</td>
            <td style="border-color: #CCCCCC;padding: 5px;text-align: center;box-sizing: border-box;">{{item.order_desc}}</td>
            <td style="border-color: #CCCCCC;padding: 5px;text-align: center;box-sizing: border-box;">{{item.chandi}}</td>
            <td style="border-color: #CCCCCC;padding: 5px;text-align: center;box-sizing: border-box;">{{item.quantity}}</td>
            <td style="border-color: #CCCCCC;padding: 5px;text-align: center;box-sizing: border-box;">{{item.remark}}</td>
            <td style="border-color: #CCCCCC;padding: 5px;text-align: center;box-sizing: border-box;">{{item.boxs_price}}</td>
            <td style="border-color: #CCCCCC;padding: 5px;text-align: center;box-sizing: border-box;">{{item.remark}}</td>
            <td style="border-color: #CCCCCC;padding: 5px;text-align: center;box-sizing: border-box;">{{item.warehouse}}</td>
          </tr>
        </table>
        <el-button @click="confrimDy" type="primary">确认打印</el-button>
    </div>
</template>

<script>
import getLodop from '../../print/LodopFuncs'

export default {
    data() {
        return {
            tableData: [],
        }
    },
    methods: {
        confrimDy() {
          const LODOP = getLodop()
          // 为null时说明没获取到,没有安装或者启动插件都会导致该情况
          if (LODOP == null) return console.log('没安装或者没启动')
          // 获取表格打印内容(通过id获取节点)
          const printHtml = document.querySelector('#printbox').innerHTML
          // 打印初始化数据
          LODOP.PRINT_INITA(1, 1, 770, 200, '预览')
          LODOP.ADD_PRINT_HTM(30, 5, '100%', '80%', printHtml)
          LODOP.SET_PRINT_PAGESIZE(3, 2100, 45, '') // 纸张大小且适用内容高度
          LODOP.SET_PRINT_MODE('PRINT_PAGE_PERCENT', 'Full-Width')
          LODOP.SET_PRINT_MODE('RESELECT_PRINTER', true) // 允许重选打印机
          LODOP.SET_PRINT_MODE('RESELECT_ORIENT', true) // 允许重选纸张方向
          LODOP.SET_PRINT_MODE('RESELECT_PAGESIZE', true) // 允许重选纸张
          LODOP.SET_PRINT_MODE('RESELECT_COPIES', true) // 允许重选份数
          LODOP.PREVIEW() //打印预览
        },
    }
}
</script>