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 相关文章推荐
FF IE兼容性的修改小结
Sep 02 Javascript
轻量级 JS ToolTip提示效果
Jul 20 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
Mar 17 Javascript
jquery cookie实现的简单换肤功能适合小网站
Aug 25 Javascript
在JavaScript中实现类的方式探讨
Aug 28 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 Javascript
node.js中的http.response.end方法使用说明
Dec 14 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
Jun 07 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
May 18 Javascript
webpack4 入门最简单的例子介绍
Sep 05 Javascript
JSONP 的原理、理解 与 实例分析
May 16 Javascript
jQuery使用hide()、toggle()函数实现相机品牌展示隐藏功能
Jan 29 jQuery
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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
PHP安全技术之 实现php基本安全
2010/09/04 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
PHP类的封装与继承详解
2015/09/29 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
Javascript学习笔记二 之 变量
2010/12/15 Javascript
jQuery代码优化 遍历篇
2011/11/01 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
jQuery实现的进度条效果
2015/07/15 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
python爬取网页转换为PDF文件
2018/06/07 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
简短的公司员工自我评价分享
2013/11/13 职场文书
家具厂厂长岗位职责
2014/01/01 职场文书
入股协议书范本
2014/04/14 职场文书
小学生思想品德评语
2014/12/31 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript