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 相关文章推荐
pjblog修改技巧汇总
Mar 12 Javascript
jquery tools系列 expose 学习
Sep 06 Javascript
jquery模拟按下回车实现代码
Sep 20 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
Apr 02 Javascript
Js实现动态添加删除Table行示例
Apr 14 Javascript
jQuery实现鼠标划过展示大图的方法
Mar 09 Javascript
Jquery easyui开启行编辑模式增删改操作
Jan 14 Javascript
three.js快速入门【推荐】
Jan 21 Javascript
React中使用async validator进行表单验证的实例代码
Aug 17 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
Sep 27 Javascript
php结合js实现多条件组合查询
May 28 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
Jan 16 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
一个基于PDO的数据库操作类
2011/03/24 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
创建一般js对象的几种方式
2017/01/19 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
layui form.render('select', 'test2') 更新渲染的方法
2019/09/27 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
Python set集合类型操作总结
2014/11/07 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
浅谈python写入大量文件的问题
2018/11/09 Python
python中rb含义理解
2020/06/18 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
html5定制表单_动力节点Java学院整理
2017/07/11 HTML / CSS
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
总经理助理的八要求
2013/11/12 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
怎么写工作检讨书
2014/11/16 职场文书
监考失职检讨书
2015/01/26 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript