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 相关文章推荐
JavaScript 匿名函数(anonymous function)与闭包(closure)
Oct 04 Javascript
js控制输入框获得和失去焦点时状态显示的方法
Jan 30 Javascript
在JavaScript中使用对数Math.log()方法的教程
Jun 15 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
Dec 10 Javascript
JavaScript的函数式编程基础指南
Mar 19 Javascript
任意Json转成无序列表的方法示例
Dec 09 Javascript
微信小程序获取用户openId的实现方法
May 23 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
Jul 23 Javascript
微信小程序wx:for循环的实例详解
Oct 07 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
Jul 10 Javascript
详解如何在Javascript和Sass之间共享变量
Nov 13 Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 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 加密与解密的斗争
2009/04/17 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
JS 文件大小判断的实现代码
2010/04/07 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
python sys模块sys.path使用方法示例
2013/12/04 Python
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
对Python中range()函数和list的比较
2018/04/19 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
Python中使用socks5设置全局代理的方法示例
2020/04/15 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
芬兰汽车配件商店:Autonvaraosat24
2017/01/30 全球购物
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
仓库主管的岗位职责
2013/12/04 职场文书
亲子活动总结
2014/04/26 职场文书
2015元旦标语横幅
2014/12/09 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
离婚协议书的范本
2015/01/27 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL
python神经网络Xception模型
2022/05/06 Python