Electron实现静默打印小票的流程详解
作者:彷徨的耗子
很多情况下程序中使用的打印都是用户无感知的,并且想要灵活的控制打印内容,往往需要借助打印机给我们提供的api再进行开发,这种开发方式非常繁琐,并且开发难度较大,本文给大家介绍了Electron实现静默打印小票的流程,感兴趣的朋友可以参考下
Electron实现静默打印小票
静默打印流程
1.渲染进程通知主进程打印
//渲染进程 data是打印需要的数据 window.electron.ipcRenderer.send('handlePrint', data)
2.主进程接收消息,创建打印页面
//main.ts /* 打印页面 */ let printWindow: BrowserWindow | undefined /** * @Author: yaoyaolei * @Date: 2024-06-07 09:27:22 * @LastEditors: yaoyaolei * @description: 创建打印页面 */ const createPrintWindow = () => { return new Promise<void>((resolve) => { printWindow = new BrowserWindow({ ...BASE_WINDOW_CONFIG, title: 'printWindow', webPreferences: { preload: join(__dirname, '../preload/index.js'), sandbox: false, nodeIntegration: true, contextIsolation: false } }) printWindow.on('ready-to-show', () => { //打印页面创建完成后不需要显示,测试时可以调用show查看页面样式(下面有我处理的样式图片) // printWindow?.show() resolve() }) printWindow.webContents.setWindowOpenHandler((details: { url: string }) => { shell.openExternal(details.url) return { action: 'deny' } }) if (is.dev && process.env['ELECTRON_RENDERER_URL']) { printWindow.loadURL(`${process.env['ELECTRON_RENDERER_URL']}/print.html`) } else { printWindow.loadFile(join(__dirname, `../renderer/print.html`)) } }) } ipcMain.on('handlePrint', (_, obj) => { //主进程接受渲染进程消息,向打印页面传递数据 if (printWindow) { printWindow!.webContents.send('data', obj) } else { createPrintWindow().then(() => { printWindow!.webContents.send('data', obj) }) } })
3.打印页面接收消息,拿到数据渲染页面完成后通知主进程开始打印
<!doctype html> <html> <head> <meta charset="UTF-8" /> <title>打印</title> <style> </style> </head> <body> </body> <script> window.electron.ipcRenderer.on('data', (_, obj) => { //这里是接受的消息,处理完成后将html片段放在body里面完成后就可以开始打印了 //样式可以写在style里,也可以内联 console.log('event, data: ', obj); //这里自由发挥 document.body.innerHTML = '处理的数据' //通知主进程开始打印 window.electron.ipcRenderer.send('startPrint') }) </script> </html>
这个是我处理完的数据样式,这个就是print.html
4.主进程接收消息开始打印,并且通知渲染进程打印状态
ipcMain.on('startPrint', () => { printWindow!.webContents.print( { silent: true, margins: { marginType: 'none' } }, (success) => { //通知渲染进程打印状态 if (success) { mainWindow.webContents.send('printStatus', 'success') } else { mainWindow.webContents.send('printStatus', 'error') } } ) })
完毕~
以上就是Electron实现静默打印小票的流程详解的详细内容,更多关于Electron静默打印小票的资料请关注脚本之家其它相关文章!