VUE中使用CLodop获取打印机列表并打印表格、图片等


打印如下表格(含图片)

在这里插入图片描述

1.在vue项目中,创建一个js文件,引入以下代码

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
var CreatedOKLodop7766=null

//====判断是否需要安装CLodop云打印服务器:====
export 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]>= 42)||(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]>=42) 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对象的主过程:====
export function getLodop(oOBJECT,oEMBED){<!-- -->
  var strHtmInstall="<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop32.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>"
  var strHtmUpdate="<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop32.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>"
  var strHtm64_Install="<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop64.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>"
  var strHtm64_Update="<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='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='http://www.c-lodop.com/download/CLodop_Setup_for_Win32NT_https_3.008Extend.zip' target='_self'>执行安装</a>,安装后请刷新页面。</font>"
  var strCLodopUpdate="<br><font color='#FF00FF'>CLodop云打印服务需升级!点击这里<a href='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.documentElement.innerHTML=strCLodopInstall+document.documentElement.innerHTML
        // return
      } else {<!-- -->
        if (CLODOP.CVERSION<"3.0.0.2") {<!-- -->
          if (isIE) document.write(strCLodopUpdate)
          else document.documentElement.innerHTML=strCLodopUpdate+document.documentElement.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:absoluteleft:0pxtop:-100pxwidth:0pxheight: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.documentElement.innerHTML=strHtmChrome+document.documentElement.innerHTML
        if (navigator.userAgent.indexOf('Firefox')>=0)
          document.documentElement.innerHTML=strHtmFireFox+document.documentElement.innerHTML
        if (is64IE) document.write(strHtm64_Install)
        else if (isIE)   document.write(strHtmInstall)
        else document.documentElement.innerHTML=strHtmInstall+document.documentElement.innerHTML
        return LODOP
      }
    }
    if (LODOP.VERSION<"6.0") {<!-- -->
      if (!needCLodop()){<!-- -->
        if (is64IE) document.write(strHtm64_Update)
        else if (isIE) document.write(strHtmUpdate)
        else document.documentElement.innerHTML=strHtmUpdate+document.documentElement.innerHTML
      }
      return LODOP
    }
    //===如下空白位置适合调用统一功能(如注册语句、语言选择等):===
    //LODOP.SET_LICENSES("北京XXXXX公司","8xxxxxxxxxxxxx5","","")

    //===========================================================
    return LODOP
  } catch(err) {<!-- -->alert("getLodop出错:"+err)}
}

2.在组件中引入上步骤的js文件,{ getLodop } 是上述代码中的一个方法

在这里插入图片描述

3.实例化打印对象

1
2
3
4
5
6
7
8
     this.LODOP = getLodop() // 创建一个LODOP对象
     let counter = this.LODOP.GET_PRINTER_COUNT() // 获取打印机个数
     for (let i = 0; i < counter; i++) {<!-- -->
       this.printerList.push({<!-- -->  // 将打印机存入printerList数组中
         name: this.LODOP.GET_PRINTER_NAME(i),
         value: i
       })
     }

即可得到打印机列表 如下:

在这里插入图片描述

4.准备好要打印的html,我这里是根据后端传回的数据动态生成的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
var html = ''
        for (let d = 0; d < this.orderDocuments.length; d++) {<!-- -->
          html += `
            <h4 style="text-align: center;">发货单</h4>
            <div style="margin-top: 16px;display: flex;align-items: center;justify-content: space-around;">
              <div>订单编号:${<!-- -->this.orderDocuments[d].order_sn}</div>
              <div>成团时间:${<!-- -->this.orderDocuments[d].pay_time}</div>
              <div>收件人:${<!-- -->this.orderDocuments[d].receiver_phone}</div>
              <div>收件电话:${<!-- -->this.orderDocuments[d].receiver_phone}</div>
            </div>
            <table role="table" style="float:left;margin:0;padding:0px;width:100%;border:1px solid #000;">
              <thead>
              <tr>
                <th style="border: 1px solid black" rowspan="1" type="header" name="goods_name">商品名称</th>
                <th style="border: 1px solid black" rowspan="1" type="header" name="goods_spec">规格</th>
                <th style="border: 1px solid black" rowspan="1" type="header" name="goods_price">单价(元)</th>
                <th style="border: 1px solid black" rowspan="1" type="header" name="goods_count">数量</th>
                <th style="border: 1px solid black" rowspan="1" type="header" name="goods_money">金额</th>
              </tr>
              </thead>
              <tbody class="chris-table-body">
              ${<!-- -->this.orderDocuments[d].goods.map(i => {<!-- -->
                return `<tr class="chris-table-row first last" role="row">
                    <td style="border: 1px solid black" type="body" name="goods_name">${i.goods_name}</td>
                    <td style="border: 1px solid black" type="body" name="goods_spec">${i.goods_spec}</td>
                    <td style="border: 1px solid black" type="body" name="goods_price">${i.goods_price}</td>
                    <td style="border: 1px solid black" type="body" name="goods_count">${i.goods_count}</td>
                    <td style="border: 1px solid black" type="body" name="goods_money">${i.goods_money}</td>
                </tr>`
          })}
              </tbody>
            </table>
            <div style="margin: 8px; text-align: center" class="border">
              <img :src="${this.orderDocuments[d].wpcode}" style="width: 100px;height: 100px;" alt="">
            </div>
          `
        }
        var body = '<body>' + html + '</body>'

5.生成好数据后进行打印项配置,并打印

1
2
3
4
5
6
7
8
9
10
        _this.LODOP.PRINT_INIT('打印发货单') //打印初始化
        _this.LODOP.SET_PRINTER_INDEX(_this.printer) //选择的打印机类型(注意这里是打印机下标,0开始的)
        _this.LODOP.SET_PRINT_STYLE('FontSize', 18) //设置对象风格
        // this.LODOP.ADD_PRINT_TEXT(50, 521, 130, 39, this.description) //增加纯文本项
        _this.LODOP.SET_PRINT_PAGESIZE(2, 0, 0, 'A4') //设定纸张大小
        _this.LODOP.SET_PRINT_MODE('PRINT_PAGE_PERCENT', '55%')//设置缩放
        _this.LODOP.SET_PREVIEW_WINDOW(2, 2, 0, 0, 0, '')//设置窗口
        _this.LODOP.ADD_PRINT_HTM(88, 20, 2000, 2000, body) // 增加超文本项(打印内容即为body内容)
        // _this.LODOP.PREVIEW() // 设置预览(如果使用预览,每次打印前会弹出预览窗口,根据需要决定是否使用)
        _this.LODOP.PRINT()

6.打印效果如下

在这里插入图片描述

至此,一个简单的clodop就完成了,如有补充,请留言~~