vue使用Clodop插件打印

news2024/11/16 0:16:58

一、前往lodop官网,下载插件,http://www.lodop.net/index.html 

 这里下载的window64位的,将插件安装好,运行,会看到

点击‘去了解C-Lodop>>’,会跳转至使用说明页面,在这个页面里,可以打印测试页面,以验证插件正常连接打印机。

 引入项目

第一种、可以直接将script标签放入vue的head中,在项目运行时自动加载。

第二种、也可以将js文件下载至本地,通过import引入,前提是将CLODOP对象export出来。

这里使用第三种方法,即动态加载方法,根据当前系统的环境及文件状态加载

代码:CLodopfuncs.js

var CreatedOKLodopObject, CLodopIsLocal, CLodopJsState

// ==判断是否需要CLodop(那些不支持插件的浏览器):==
function needCLodop () {
  console.log('检测当前环境,判断是否需要CLodop(那些不支持插件的浏览器)')
  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 () {
  console.log('可以加载CLodop,开始加载js,端口为8000和18000')
  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' }
  // 加入header
  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对象主过程,判断是否安装、需否升级:==

export function getLodop (oOBJECT, oEMBED) {
  var strHtmInstall = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop32.zip' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>"
  var strHtmUpdate = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop32.zip' target='_self'>执行升级</a>,升级后请重新进入。</font>"
  var strHtm64_Install = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop64.zip' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>"
  var strHtm64_Update = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop64.zip' target='_self'>执行升级</a>,升级后请重新进入。</font>"
  var strHtmFireFox = "<br><br><font color='#FF00FF'>(注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)</font>"
  var strHtmChrome = "<br><br><font color='#FF00FF'>(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)</font>"
  var strCLodopInstall_1 = "<br><font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='CLodop_Setup_for_Win32NT.zip' target='_self'>下载执行安装</a>"
  var strCLodopInstall_2 = "<br>(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)"
  var strCLodopInstall_3 = ',成功后请刷新本页面。</font>'
  var strCLodopUpdate = "<br><font color='#FF00FF'>Web打印服务CLodop需升级!点击这里<a href='CLodop_Setup_for_Win32NT.zip' 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') alert('网页还没下载完毕,请稍等一下再操作.'); else alert('没有加载CLodop的主js,请先调用loadCLodop过程.')
        return
      }
      if (!LODOP) {
        document.body.innerHTML = strCLodopInstall_1 + (CLodopIsLocal ? strCLodopInstall_2 : '') + strCLodopInstall_3 + document.body.innerHTML
        return
      } else {
        if (CLODOP.CVERSION < '4.0.9.9') {
          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 && !!(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) { document.body.innerHTML = strHtmChrome + document.body.innerHTML }
        if (ua.indexOf('Firefox') >= 0) { document.body.innerHTML = strHtmFireFox + document.body.innerHTML }
        document.body.innerHTML = (is64IE ? strHtm64_Install : strHtmInstall) + document.body.innerHTML
        return LODOP
      }
    }
    if (LODOP.VERSION < '6.2.2.6') {
      if (!needCLodop()) { document.body.innerHTML = (is64IE ? strHtm64_Update : strHtmUpdate) + document.body.innerHTML }
    }
    // ===如下空白位置适合调用统一功能(如注册语句、语言选择等):==
    LODOP.SET_LICENSES('', '13528A153BAEE3A0254B9507DCDE2839', 'EDE92F75B6A3D917F65910', '')
    // =======================================================
    return LODOP
  } catch (err) {
    alert('getLodop出错:' + err)
  }
}

在项目中引入:

<template>
  <div id="print_page">
    <!-- 按钮 -->
    <div><el-button type="success" @click="print_f()">打印预览欠费单</el-button></div>
  </div>
</template>

<script>
import {getLodop} from '../../../../static/js/CLodopfuncs'

export default {
  data () {
    return {
      //打印内容
      print_info: [{
        'RET': 100,
        'MSG': '成功',
        '停水单': '停水通知单',
        '公司名称': '客户编码:123456789',
        '地址': '地址:测试测试测试测试测试测试',
        '内容': '\n\t\t    经查,您户已有2个月以上(含2个月)未缴水费共计30.06元,表身号:。现我公司按照《城市供水条例》及我公司与您签订的《供水合同》的相关规定,对您户暂停供水,因停水给您带来的不便之处,敬请谅解。缴清水费后,请您在工作时间与电话(                )联系,给予复水。(温馨提示:未登记或已变更移动电话的用户,请及时与我司联系,以便于及时收到我司水费短信提醒。办公室电话:123456)\n\t\t ',
        '客户名称': '测试测试测试测试测试测试',
        '日期': '2023年01月05日',
        '是否打印维护': 0,
        '鸣谢': '请予合作,谢谢!'
      }, {
        'RET': 100,
        'MSG': '成功',
        '停水单': '停水通知单',
        '公司名称': '客户编码:123456789',
        '地址': '地址:测试测试测试测试测试测试',
        '内容': '\n\t\t    经查,您户已有2个月以上(含2个月)未缴水费共计176.34元,表身号:。现我公司按照《城市供水条例》及我公司与您签订的《供水合同》的相关规定,对您户暂停供水,因停水给您带来的不便之处,敬请谅解。缴清水费后,请您在工作时间与电话(                )联系,给予复水。(温馨提示:未登记或已变更移动电话的用户,请及时与我司联系,以便于及时收到我司水费短信提醒。办公室电话:123456)\n\t\t ',
        '客户名称': '测试测试测试测试测试测试',
        '日期': '2023年01月05日',
        '是否打印维护': 0,
        '鸣谢': '请予合作,谢谢!'
      }]
    }
  },
  methods: {
    // 打印欠费单
    print_f () {
      if (this.print_info.length > 0) {
        var LODOP = getLodop()
        var totalPrint = 0 // 第几个
        // 如果有预设的打印机名称,则设置,否则使用本机默认打印机
        if (!this.isEmpty(this.print_info[0].打印机名称)) {
          LODOP.SET_PRINT_MODE('WINDOW_DEFPRINTER', this.print_info[0].打印机名称)
        }
        // 循环打印
        for (var i = 0; i < this.print_info.length; i++) {
          totalPrint++
          if (totalPrint % 2 == 1) { // 节约用纸,2个信息为一张
            LODOP.PRINT_INIT('停水单') // 打印初始化
            LODOP.SET_PRINT_PAGESIZE(3, 0, 0, '148.5mm') // 设定纸张大小:纵向,宽为0,高为0,纸张类型为148.5mm,
            LODOP.ADD_PRINT_TEXT(31, 312, 228, 35, this.isEmpty(this.print_info[i].停水单) ? '' : this.print_info[i].停水单) // 增加纯文本项:距离顶部31mm,距离左边312,宽度228,高度35
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 18) // 设置第0个内容项字体为18号字体
            LODOP.ADD_PRINT_TEXT(87, 73, 657, 25, this.isEmpty(this.print_info[i].客户名称) ? '' : this.print_info[i].客户名称)
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 14)
            LODOP.ADD_PRINT_TEXT(138, 74, 646, 189, this.isEmpty(this.print_info[i].内容) ? '' : this.print_info[i].内容)
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 14)
            LODOP.ADD_PRINT_TEXT(327, 372, 346, 30, this.isEmpty(this.print_info[i].公司名称) ? '' : this.print_info[i].公司名称)
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 14)
            LODOP.ADD_PRINT_TEXT(376, 472, 248, 30, this.isEmpty(this.print_info[i].日期) ? '' : this.print_info[i].日期)
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 14)
            LODOP.ADD_PRINT_TEXT(113, 74, 657, 25, this.isEmpty(this.print_info[i].地址) ? '' : this.print_info[i].地址)
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 14)
            if (totalPrint == this.print_info.length) { // 如果已经是最后一份,则终止此循环
              // LODOP.PRINT()
              LODOP.PREVIEW() // 为防止真正打印,采用预览模式,预览模式只能预览一页,无法翻页,切会弹出‘有窗口已打开,先关闭它’提示
            }
          } else {
            var toppx = 500 // 距离顶部,同一张的第二个信息
            LODOP.ADD_PRINT_TEXT(31 + toppx, 312, 228, 35, this.isEmpty(this.print_info[i].停水单) ? '' : this.print_info[i].停水单)
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 18)
            LODOP.ADD_PRINT_TEXT(87 + toppx, 73, 657, 25, this.isEmpty(this.print_info[i].客户名称) ? '' : this.print_info[i].客户名称)
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 14)
            LODOP.ADD_PRINT_TEXT(138 + toppx, 74, 646, 189, this.isEmpty(this.print_info[i].内容) ? '' : this.print_info[i].内容)
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 14)
            LODOP.ADD_PRINT_TEXT(327 + toppx, 372, 346, 30, this.isEmpty(this.print_info[i].公司名称) ? '' : this.print_info[i].公司名称)
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 14)
            LODOP.ADD_PRINT_TEXT(376 + toppx, 472, 248, 30, this.isEmpty(this.print_info[i].日期) ? '' : this.print_info[i].日期)
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 14)
            LODOP.ADD_PRINT_TEXT(113 + toppx, 74, 657, 25, this.isEmpty(this.print_info[i].地址) ? '' : this.print_info[i].地址)
            LODOP.SET_PRINT_STYLEA(0, 'FontSize', 14)
            // LODOP.PRINT()
            LODOP.PREVIEW()// 为防止真正打印,采用预览模式
          }
        }
      }
    },
    // 是否为空转换
    isEmpty (data) {
      if (data && data.length > 0) {
        return false
      } else {
        return true
      }
    }
  }
}
</script>

<style lang='scss'>
@import './print_page.scss';
</style>

运行项目

页面仅显示一个按钮

此时打开元素查看器,可以看到CLodopfuncs.js已被加载

 

 点击打印按钮,会调用打印机

 为了防止真正打印,这里将代码改为了打印预览,实际每调用一次会打印一次,也可以边请求后台数据边打,只要有纸,可以一直打,我最多打了二百多张纸

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/806350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Facebook开源PySlowFast视频理解代码库

近年来&#xff0c;Facebook 人工智能研究&#xff08;FAIR&#xff09;一直在为视频理解研究做出重大贡献。在2019年10月的ICCV上&#xff0c;该团队推出了一个基于Python的代码库PySlowFast。FAIR现在是开源的PySlowFast&#xff0c;还有一个预先训练的模型库&#xff0c;并承…

camunda流程引擎简单上手

快速开始 参考官方的文档&#xff1a; https://docs.camunda.org/get-started/ 我下面会在关键部署简单记录一下。 下载 服务端 https://docs.camunda.org/manual/latest/installation/full/tomcat/pre-packaged/ 为了方便我们直接下载tomcat整合包&#xff0c;不用自己在…

1200*C. K-th Not Divisible by n

Example input 6 3 7 4 12 2 1000000000 7 97 1000000000 1000000000 2 1 output 10 15 1999999999 113 1000000001 1 解析&#xff1a; 将每 n 个数看成一组&#xff0c;每组缺少了一个n的倍数&#xff0c;所以按照对 n-1 整除和取模分别得出组数和余数&#xff0c;乘起来…

Hexo+GithubPages免费搭建个人博客网站

HexoGithubPages免费搭建个人博客网站 目录 一、前言二、Github配置 新建同名仓库配置Pages 三、安装Hexo四、配置hexo-deployer-git五、访问六、发布文章七、安装主题 一、前言 我之前开了好几年的云服务器了&#xff0c;实际上使用场景并不是很多&#xff0c;感觉有点浪费…

Android Studio手动下载安装SDK,图文详解

本教程适用于手动下载Android SDK&#xff0c;适合第一次安装Android Studio的同学&#xff0c;进入安卓SDK网址&#xff1a;https://www.androiddevtools.cn/。首先你需要在D盘新建一个目录Android SDK&#xff0c;存放后面下载的工具。 1、下载SDK Tools&#xff0c;解压到An…

【机器学习 | 朴素贝叶斯】朴素贝叶斯算法:概率统计方法之王,简单有效的数据分类利器

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

微信读书:长期投资(阅读摘录)

微信读书&#xff1a;长期投资&#xff08;阅读摘录&#xff09; 所有投资高手的时间精力都投向了这三大块&#xff1a;行动、思考、读书。 我们把耐心发挥到了极致&#xff0c;这正是价值投资的关键特征之一。 通常在牛市中想要跑赢大盘&#xff0c;难度非常大。 实际上&am…

C语言每日一题:8.除自身以外数组的乘积。

题目&#xff1a; 题目&#xff1a; 思路一&#xff1a; &#xff08;先不考虑题目的要求循序渐进的方法&#xff09; 1.动态开辟数组&#xff0c;初始化数组内容为全1. 2.使用双for循环去给answer赋值。 3.在相同位置不去*对应的下标位置的数组值&#xff0c;而是*1&#xff…

【Linux命令200例】lsattr用于查看文件或目录的属性

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

测试开源C#人脸识别模块ViewFaceCore(5:质量检测和眼睛状态检测)

ViewFaceCore模块中的FaceQuality支持预测人脸质量&#xff0c;最初以为是预测人体体重&#xff0c;实际测试过程中才发现是评估人脸图片质量&#xff0c;主要调用Detect函数执行图片质量检测操作&#xff0c;其函数原型如下所示&#xff1a; //// 摘要:// 人脸质量评估///…

tf卡为什么显示0字节?tf卡显示0字节怎么恢复数据

我的TF卡现在显示字节为0&#xff0c;想要打开总是会弹出要求格式化的对话框&#xff0c;里面有我重要的数据。请问如何恢复里面的数据啊&#xff1f;急&#xff01;急&#xff01;急&#xff01; ——在日常使用中&#xff0c;我们可能将重要的数据存储在TF卡中。然而&#x…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第四十天 40/50【二叉树递归】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

【雕爷学编程】Arduino动手做(175)---机智云ESP8266开发板模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

flask中的蓝图

flask中的蓝图 在 Flask 中&#xff0c;蓝图&#xff08;Blueprint&#xff09;是一种组织路由和服务的方法&#xff0c;它允许你在应用中更灵活地组织代码。蓝图可以大致理解为应用或者应用中的一部分&#xff0c;可以在蓝图中定义路由、错误处理程序以及静态文件等。然后可以…

vcruntime140_1.dll无法继续执行代码重新安装方法

cruntime140_1.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它包含了一些与C运行时相关的函数和资源。在Windows系统中&#xff0c;许多应用程序和游戏都依赖于vcruntime140_1.dll文件来正常运行。当系统中缺少或损坏了vcruntime140_1.dll文件时&#xff0c;就会出…

Unity源码分享-黄金矿工游戏完整版

Unity源码分享-黄金矿工游戏完整版 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88118933

flask创建数据库连接池

flask创建数据库连接池 在Python中&#xff0c;您可以使用 Flask-SQLAlchemy 这个扩展来创建一个数据库连接池。Flask-SQLAlchemy 是一个用于 Flask 框架的 SQLAlchemy 操作封装&#xff0c;实现了 ORM(Object Relational Mapper)。ORM 主要用于将类与数据库中的表建立映射关系…

superset为何无法上传excel,csv等外部文件

superset为何无法上传excel&#xff0c;csv等外部文件 这是由于没有打开数据库的上传外部文件的权限 1.打开数据库连接设置&#xff0c;选择Allow file uploads to database 2.发现这里的上传链接都可以使用

HTML+CSS+JavaScript:实现京东官网固定导航栏

一、需求 在京东官网首页&#xff0c;只要页面滚动到京东秒杀倒计时的位置&#xff0c;顶部的导航栏就会自动出现且固定在窗口最上方&#xff0c;如下图 我们将模仿京东官网的效果&#xff0c;做一个简易的固定导航栏&#xff0c;如下图 二、代码素材 以下是缺失JS部分的代码…

你应该知道的关于PCB布线的31条建议

1、走线长度应包含过孔和封装焊盘的长度。 2、布线角度优选135角出线方式&#xff0c;任意角度出线会导致制版出现工艺问题。 图1 PCB布线的角度 3、布线避免直角或者锐角布线&#xff0c;导致转角位置线宽变化&#xff0c;阻抗变化&#xff0c;造成信号反射&#xff0c;如图2…