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 相关文章推荐
jquery URL参数判断,确定菜单样式
May 31 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
Mar 19 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
May 11 Javascript
微信小程序 网络API Websocket详解
Nov 09 Javascript
Bootstrap Img 图片样式(推荐)
Dec 13 Javascript
Angular的MVC和作用域
Dec 26 Javascript
手把手搭建安装基于windows的Vue.js运行环境
Jun 12 Javascript
微信小程序movable view移动图片和双指缩放实例代码
Aug 08 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
Nov 05 Javascript
vue拖拽组件使用方法详解
Dec 01 Javascript
通过npm或yarn自动生成vue组件的方法示例
Feb 12 Javascript
vue 解决IOS10低版本白屏的问题
Nov 17 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
Symfony页面的基本创建实例详解
2015/01/26 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
2016/01/05 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
微信小程序侧边栏滑动特效(左右滑动)
2017/01/23 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
Vue中&quot;This dependency was not found&quot;问题的解决方法
2018/06/19 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
pycharm设置注释颜色的方法
2018/05/23 Python
详解python中list的使用
2019/03/15 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
体育学院毕业生自荐信
2013/11/03 职场文书
计算机数据库专业职业生涯规划书
2014/02/08 职场文书
单位承诺书格式
2014/05/21 职场文书
国际商务英语专业求职信
2014/07/08 职场文书
雷锋的故事观后感
2015/06/10 职场文书
葬礼主持词
2015/07/02 职场文书
mysql如何配置白名单访问
2021/06/30 MySQL
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS
Python实现聚类K-means算法详解
2022/07/15 Python