electron实现打印功能,支持静默打印、无感打印
实现思路
业务上目前有两种打印的方法:
- webview标签:electron提供webview用于在一个独立的 frame 和进程里显示外部 web 内容。但是在Electron >= 5中是禁用该标签的,所以就直接放弃它。
- webContent.print方法:webCompent是主进程用来渲染和控制网页的对象,而它的print方法是用来打印渲染进程中的网页内容。这里我们选择这个方法。
总体思路大概为:
- 在页面点击打印按钮,发布订阅去创建一个隐藏的新窗口,窗口内容就是我们要打印的内容。利用新窗口展示的路径的hash和打印页面路由相互匹配实现指定打印内容。
- 在打印页面初始化后,需要窗口去掉标题的按钮,防止乱入到打印页面。然后在根据路由传递的参数查找数据渲染页面。 再然后发布
printHandlePrint
事件进行打印并设置静默打印和去除边距。最后打印完成发布destroyPrintWindow
事件销毁新窗口。
实现
1、创建打印方法
使用ipcMain.handle
向主进程订阅打印相关事件。其中printHandlePrint
订阅就是调用打印机的方法。最重要的是openPrintWindow
订阅,它的内部去调用了openPrintWindow方法,它的用处就是用于创建一个新的BrowserWindow
窗口,将要打印的内容放进新窗口中,这样我们就可以实现打印指定内容的功能。destroyPrintWindow
订阅作用于销毁创建的新窗口。
可以看到openPrintWindow
会接受两个参数,第一个参数是事件对象,第二个参数是发布事件时传递的参数,而这个参数最终会通过路由的方式传递到打印的新窗口中。实现渲染进程和渲染进程的伪通信。
方法写好之后记得要在app.whenReady()后调用这个方法。
// printHandle.ts
let win: BrowserWindo