Electron实现静默打印小票

Electron实现静默打印小票

静默打印流程

1.渲染进程通知主进程打印

js 复制代码
//渲染进程 data是打印需要的数据
window.electron.ipcRenderer.send('handlePrint', data)

2.主进程接收消息,创建打印页面

js 复制代码
//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.打印页面接收消息,拿到数据渲染页面完成后通知主进程开始打印

js 复制代码
<!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,5.主进程接收消息开始打印,并且通知渲染进程打印状态

js 复制代码
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')
      }
    }
  )
})

完毕~

相关推荐
Boilermaker199219 分钟前
【Java EE】SpringIoC
前端·数据库·spring
中微子30 分钟前
JavaScript 防抖与节流:从原理到实践的完整指南
前端·javascript
天天向上10241 小时前
Vue 配置打包后可编辑的变量
前端·javascript·vue.js
芬兰y1 小时前
VUE 带有搜索功能的穿梭框(简单demo)
前端·javascript·vue.js
好果不榨汁1 小时前
qiankun 路由选择不同模式如何书写不同的配置
前端·vue.js
小蜜蜂dry1 小时前
Fetch 笔记
前端·javascript
拾光拾趣录1 小时前
列表分页中的快速翻页竞态问题
前端·javascript
小old弟1 小时前
vue3,你看setup设计详解,也是个人才
前端
Lefan1 小时前
一文了解什么是Dart
前端·flutter·dart
Patrick_Wilson1 小时前
青苔漫染待客迟
前端·设计模式·架构