Vue使用lodop实现打印小结


Posted in Javascript onJuly 06, 2019

一. Lodop与C-Lodop的区别

Lodop打印控件是浏览器插件,与浏览器紧密结合来实现本地打印,是一种内嵌到浏览器里交互方式。(适用浏览器:ie系列、火狐51版及历史版本、谷歌44版及历史版本。(新版火狐及谷歌不再支持np插件,也不能使用lodop))

C-Lodop打印服务是以提供服务方式解决web打印,摆脱了对浏览器的依赖,解决了新版谷歌(45版及后续版本)、64位火狐、edge等浏览器不再支持Lodop插件方式的情况,C-Lodop打印服务支持所有浏览器。

既然C-Lodop可以替代Lodop并且支持所有浏览器,实际开发过程中可以直接使用C-Lodop进行完成打印需求

二.vue中使用Lodop

1 把官方提供的LodopFuncs.js文件保存到某个目录下,如myProject\src\assets\LodopFuncs.js

2 修改LodopFuncs.js文件, 在文件最底部添加一行代码 export { getLodop }; //导出getLodop

3 在打印事件处理函数所在文件里 import 该 module 在打印事件函数中调用getLodop获取LODOP对象变量,按照官方教程书写自己的打印函数,通过 PRINT、PREVIEW、PRINT_DESIGN进行输出。

三.实例代码

1. LodopFuncs.js由于选择了C-Lodop打印服务,也就不再需要进行对各浏览器进行判断了,也不再需要各种提示下载哪个版本的控件了

改写后的lodopFuncs.js如下图所示,项目需求中引入了element的组件,提醒用户点击确认后下载打印控件 (win32NT.exe既支持32位也支持64位的系统,也就不用对用户操作系统进行判断了直接下载安装后刷新页面使用就好)

Vue使用lodop实现打印小结

2. template模板代码

小提示: 注意id放置位置,引用的是documnet.getElmentById('tableId').innerHTML

Vue使用lodop实现打印小结

示例: 进行getLodop的引用 import getLodop from '你的LodopFuncs.js 的路径'

Vue使用lodop实现打印小结

打印报表的方法进行代码编写,主要程序就三行代码 let LODOP = getLodop()//调用getLodop获取LODOP对象

LODOP.PRINT_INIT("")

 LODOP.ADD_PRINT_TEXT(50, 231, 260, 39, "打印内容")

 LODOP.PREVIEW()

但实际项目需求中,需要对用户进行判断,判断用户是否已安装打印服务,如果没有安装要提示用户下载安装,已安装好可以提示直接安装

打印的样式根据项目的需求也会有不同,有的是打印表格,有的是文本 有的是图片,用户根据官方文档操作写样式,字体大小,横竖版设置等等

四.附源码

import { MessageBox } from 'element-ui'

// ====页面动态加载C-Lodop云打印必须的文件CLodopfuncs.js====
var head = document.head || document.getElementsByTagName('head')[0] || document.documentElement
var oscript = document.createElement('script')
// 让本机的浏览器打印(更优先一点):
oscript = document.createElement('script')
oscript.src = 'http://localhost:8000/CLodopfuncs.js?priority=2'
head.insertBefore(oscript, head.firstChild)
// 加载双端口(8000和18000)避免其中某个端口被占用:
oscript = document.createElement('script')
oscript.src = 'http://localhost:18000/CLodopfuncs.js?priority=1'
head.insertBefore(oscript, head.firstChild)

// 下载loadLodop
function loadLodop() {
 window.open('../../static/Lodop/CLodop_Setup_for_Win32NT.exe')
}

// ====获取LODOP对象的主过程:====
function getLodop() {
 var LODOP
 try {
 LODOP = getCLodop()
 if (!LODOP && document.readyState !== 'complete') {
  MessageBox.alert('C-Lodop打印控件还没准备好,请稍后再试!')
  return
 }
 return LODOP
 } catch (err) {
 MessageBox({
  title: '温馨提示',
  type: 'warning',
  showCancelButton: true,
  message: '您还未安装打印控件,点击确定下载打印控件,安装成功后刷新页面即可进行打印',
  callback: res => {
  if (res === 'confirm') {
   loadLodop()
  }
  }
 })
 }
}

export default getLodop
<template>
 <div class="umess table-dialog">
 <!-- 表格组 -->
 <div class="umess table-main">
  <div class="title">{{ tabName }}</div>
  <!-- 导入导出 -->
  <div class="btn-top-list">
  <el-button type="primary" plain @click="exportReport">导出报表</el-button>
  <el-button type="primary" plain @click="printReport">打印报表</el-button>
  </div>
  <!-- 表格组 -->
  <div id="tableId" class="table-box">
  <table class="utable">
   <caption><b><font face="黑体" size="3">{{ tabName }}</font></b></caption>
   <thead>
   <tr v-for="(tr,index) in tableHead" :key="index">
    <td v-for="(item,i) in tr" :key="i" :colspan="item.cols" :rowspan="item.rows" :min-width="item.width">{{ item.value }}</td>
   </tr>
   </thead>
   <tbody>
   <tr v-for="(item,index) in tableBody" :key="index">
    <td v-for="(td, i) in item" :key="i" :colspan="td.cols" :rowspan="td.rows">
    <div class="td1">{{ td.value }}</div>
    </td>
   </tr>
   </tbody>
  </table>
  </div>
 </div>
 <!-- end -->
 </div>
</template>

<script>
import { tableHead, tableResolve } from '../excelTem/reportOne.js'
import getLodop from '@/api/lodop'
export default {
 data() {
 return {
  tabId: '',
  tabName: '',
  tableHead: tableHead,
  tableBody: []
 }
 },
 mounted() {

 },
 methods: {
 // 打印报表
 printReport() {
  const LODOP = getLodop()
  if (LODOP) {
  var strBodyStyle = '<style>'
  strBodyStyle += 'table { border-top: 1 solid #000000; border-left: 1 solid #000000; border-collapse:collapse; border-spacing:0;}'
  strBodyStyle += 'caption { line-height:2em; }'
  strBodyStyle += 'td { border-right: 1 solid #000000; border-bottom: 1 solid #000000; text-align:center; padding:2px 3px; font-size:11px;}'
  strBodyStyle += '</style>' //设置打印样式
   var strFormHtml = strBodyStyle + '<body>' + document.getElementById('tableId').innerHTML + '</body>' //获取打印内容
  LODOP.PRINT_INIT('') //初始化
  LODOP.SET_PRINT_PAGESIZE(2, 0, 0, 'A4') //设置横向
  LODOP.ADD_PRINT_HTM('1%', '1%', '98%', '98%', strFormHtml) //设置打印内容
  LODOP.SET_PREVIEW_WINDOW(2, 0, 0, 800, 600, '') //设置预览窗口模式和大小
  LODOP.PREVIEW()
  }
 }
 }
}
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
非常不错的功能强大代码简单的管理菜单美化版
Jul 09 Javascript
简单的js分页脚本
May 21 Javascript
js工具方法弹出蒙版
May 08 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
Dec 13 Javascript
node.js中的emitter.emit方法使用说明
Dec 10 Javascript
微信小程序 地图定位简单实例
Oct 14 Javascript
js实现带简单弹性运动的导航条
Feb 22 Javascript
JS模拟实现ECMAScript5新增的数组方法
Mar 20 Javascript
js实现下拉框效果(select)
Mar 28 Javascript
vue中如何引入jQuery和Bootstrap
Apr 10 jQuery
vue 实现剪裁图片并上传服务器功能
Mar 01 Javascript
es6函数之箭头函数用法实例详解
Apr 25 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
Jul 06 #Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
Jul 06 #Javascript
vue router总结 $router和$route及router与 router与route区别
Jul 05 #Javascript
基于vue实现圆形菜单栏组件
Jul 05 #Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
Jul 05 #Javascript
vue中实现Monaco Editor自定义提示功能
Jul 05 #Javascript
VueCli3.0中集成MockApi的方法示例
Jul 05 #Javascript
You might like
php自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
javascript调试说明
2010/06/07 Javascript
javascript学习笔记(七) js函数介绍
2012/06/19 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
Vue中CSS动画原理的实现
2019/02/13 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
vue实现登录拦截
2020/06/29 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
对Python 语音识别框架详解
2018/12/24 Python
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
基于django传递数据到后端的例子
2019/08/16 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
python简单实现最大似然估计&amp;scipy库的使用详解
2020/04/15 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
2014年小学工作总结
2014/11/26 职场文书
业务内勤岗位职责
2015/04/13 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL