前言:该文章需要一定的electron基础同学。如需了解更多相关信息,请移步electron官方文档。
一、需求:
公司项目需要通过electron调用系统打印机,实现打印小票的功能。
二、分析:
electron打印大概有两种:
第一种:通过window的webcontent对象,使用此种方式需要单独开出一个打印的窗口,可以将该窗口隐藏,但是通信调用相对复杂。
第二种:使用页面的webview元素调用打印,可以将webview隐藏在调用的页面中,通信方式比较简单。
两个对象调用打印方法的使用方式都一样。
本文是通过第二种方法实现静默打印。
三、实现过程:
1、要实现打印功能,首先要知道我们的设备上有哪些打印机。方法是:在渲染线程通过electron的ipcRenderer对象发送事件到主线程获取。(本文的渲染线程可以当做为一个print.vue文件)
(1)主线程(electron.js)伪代码如下:
1 | //引入electron |
//创建一个浏览器对象
1 | const window = new electron.BrowserWindow({ |
(2)渲染线程(print.vue文件)伪代码如下:
1 | <template> |
2、(重头戏来了)获取打印机列表后,就需要通过electron自带的”webview”标签实现小票排版。”webview”是什么?可以把它当做”iframe”标签,它里面显示的是你需要打印的内容。
(1)使用”webview”之前,需要新建一个print.html文件,把你要打印的内容通过print.html显示出来。我们项目的需求是将要打印的内容通过canvas画出后,再将canvas转成图片资源(base64),然后放到”webview”里面显示,伪代码如下:
1 | <html lang="en"> |
复制代码
(2)html文件创建完成后,将print.html引入到《webview src=”./xxxx/print.html”》。该”webview”需要显式的定义在print.vue文件中,但需要将它用v-show=”false”隐藏,不能用v-if,因为我们需要”webview”的dom节点存在于页面上,只是不展示而已。
1 | <template> |
到这里本electron调用打印机的功能就实现了。但本文章有很多细节没有讲到,只是大概的给了一个思路,如果写的有不对之处,还望见谅。
作者:ding1379
链接:https://juejin.im/post/5bf8b580e51d4522143b7b03
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。