electron + vue项目实现打印小票功能及实现代码


Posted in Javascript onNovember 25, 2018

一 需求:

公司项目需要通过electron调用系统打印机,实现打印小票的功能。

二、分析:

electron打印大概有两种:

第一种:通过window的webcontent对象,使用此种方式需要单独开出一个打印的窗口,可以将该窗口隐藏,但是通信调用相对复杂。

第二种:使用页面的webview元素调用打印,可以将webview隐藏在调用的页面中,通信方式比较简单。

两个对象调用打印方法的使用方式都一样。

本文是通过第二种方法实现静默打印。

三、实现过程:

1、要实现打印功能,首先要知道我们的设备上有哪些打印机。方法是:在渲染线程通过electron的ipcRenderer对象发送事件到主线程获取。(本文的渲染线程可以当做为一个print.vue文件)

(1)主线程(electron.js)伪代码如下:

//引入electron
import electron from 'electron';

//创建一个浏览器对象
const window = new electron.BrowserWindow({
  width,
  height,
  frame: false,
  show: false,
  backgroundColor: '#4b5b79',
  minWidth: 1024,
  minHeight: 768,
  webPreferences: { webSecurity: false },
 });
 
//在主线程下,通过ipcMain对象监听渲染线程传过来的getPrinterList事件
electron.ipcMain.on('getPrinterList', (event) => {
  //主线程获取打印机列表
  const list = window.webContents.getPrinters();
  
  //通过webContents发送事件到渲染线程,同时将打印机列表也传过去
  window.webContents.send('getPrinterList', list);
});

===============================================================================

(2)渲染线程(print.vue文件)伪代码如下:

<template>
</template>
<script>
  //引入ipcRenderer对象,该对象和主线程的ipcMain通讯
  import { ipcRenderer } from 'electron';
  
  //渲染线程主动发送getPrinterList事件到主线程请求打印机列表
  ipcRenderer.send('getPrinterList'); 
  
  //监听主线程获取到打印机列表后的回调
   ipcRenderer.once('getPrinterList', (event, data) => {
    //data就是打印机列表
    this.printList = data;
   });
</script>

//获取打印机列表完成

2、(重头戏来了)获取打印机列表后,就需要通过electron自带的标签实现小票排版。 是什么?可以把它当做标签,它里面显示的是你需要打印的内容。

(1)使用之前,需要新建一个print.html文件,把你要打印的内容通过print.html显示出来。我们项目的需求是将要打印的内容通过canvas画出后,再将canvas转成图片资源(base64),然后放到里面显示,伪代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
 <style>
 //@page样式是用来设置打印机打印出来的样式,例如设置小票外边距样式
  @page {
   margin: 0px;
  }
 </style>
</head>
<body id='bd'>
</body>
<script>
  //引入ipcRenderer对象
 const {ipcRenderer} = require('electron')
 
 //监听渲染线程传过来的webview-print-render事件
 ipcRenderer.on('webview-print-render', (event, deviceInfo) => {
  // 动态创建一个img标签,然后插入到<body>中。deviceInfo是渲染线程传过来的数据
  let html = '';
  html = `<img src="${deviceInfo.imgSource}"
   width="${deviceInfo.imgWidth}px"
   height="${deviceInfo.imgHeight}px">`;
  document.getElementById('bd').innerHTML = html;
  
  //当图片插入到页面后,通过ipcRenderer对象的sendToHost方法和渲染线程通讯,告诉渲染线程打印的内容已经准备完毕,请开始打印操作
  ipcRenderer.sendToHost('webview-print-do');
 });
</script>
</html>

(2)html文件创建完成后,将print.html引入到。该需要显式的定义在print.vue文件中,但需要将它用v-show="false"隐藏,不能用v-if,因为我们需要的dom节点存在于页面上,只是不展示而已。

<script>
mounted() {
  //当vue节点渲染完成后,获取<webview>节点
  const webview = this.$refs.printWebview;
  
  //监听<webview>里面的消息,也就是监听print.html里面的ipcRenderer.sendToHost发送的事件,当该事件发送成功后就会进入下面的回调事件中执行打印操作。
  webview.addEventListener('ipc-message', (event) => {
   if (event.channel === 'webview-print-do') {
    //如果收到<webview>传过来的事件,名为"webview-print-do",就执行 webview.print打印方法,打印<webview>里面的内容。
    webview.print(
     {
      //是否是静默打印
      silent: true,
      printBackground: true,
      //打印机的名称,就是本文一开始获得的打印机列表其中一个
      deviceName: 'xxx',
     },
     (data) => {
      //这个回调是打印后的回调事件,data为true就是打印成功,为false就打印失败
      console.log('webview success', data);
     },
    );
   }
  });
},
</script>

到这里本electron调用打印机的功能就实现了。

总结

以上所述是小编给大家介绍的electron + vue项目实现打印小票功能及实现代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
JS 容错处理代码, 屏蔽错误信息
Mar 09 Javascript
JQuery中对Select的option项的添加、删除、取值
Aug 25 Javascript
JavaScript动态添加列的方法
Mar 25 Javascript
初步了解javascript面向对象
Nov 09 Javascript
JavaScript中的ajax功能的概念和示例详解
Oct 17 Javascript
微信小程序学习(4)-系统配置app.json详解
Jan 12 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
Aug 16 jQuery
浅谈React深度编程之受控组件与非受控组件
Dec 26 Javascript
微信小程序实现日历效果
Dec 28 Javascript
EasyUI 数据表格datagrid列自适应内容宽度的实现
Jul 18 Javascript
Layui动态生成select下拉选择框不显示的解决方法
Sep 24 Javascript
Openlayers学习之加载鹰眼控件
Sep 28 Javascript
vue组件实践之可搜索下拉框功能
Nov 25 #Javascript
详解离线安装npm包的几种方法
Nov 25 #Javascript
vue将单页面改造成多页面应用的方法
Nov 25 #Javascript
vue下拉菜单组件(含搜索)的实现代码
Nov 25 #Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
Nov 25 #Javascript
详解Vue CLI 3.0脚手架如何mock数据
Nov 23 #Javascript
详解js静态检查工具eslint配置文件
Nov 23 #Javascript
You might like
php Ubb代码编辑器函数代码
2012/07/05 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
用Mootools获得操作索引的两种方法分享
2011/12/12 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
javascript数组去重小结
2016/03/07 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
2017/12/29 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
Python整型运算之布尔型、标准整型、长整型操作示例
2017/07/21 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
python递归法解决棋盘分割问题
2019/07/17 Python
Django中自定义admin Xadmin的实现代码
2019/08/09 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
python从zip中删除指定后缀文件(推荐)
2019/12/05 Python
python 实现单例模式的5种方法
2020/09/23 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
技能比武方案
2014/05/21 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
春秋淹城导游词
2015/02/11 职场文书
家长高考寄语
2015/02/27 职场文书
体育教师研修感悟
2015/11/18 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书