1.业务场景

公司有做一个Electron+Vue的收银产品,收银以后需要将订单信息通过小票打印出来,记录一下做这个需求遇到的一些问题跟bug

2.解决思路

通过webview或者新窗口将需要打印的内容渲染,然后通过webcontents.print这个api将页面内容输出到小票机然后静默打印

3.代码实现

3.1  渲染进程触发打印

这个代码使用vue3+electron实现,但是为了方便项目的维护以及解决前期web页面更新客户端也需要更新的问题,客户端代码跟webPage被我架构成了两个项目,所以这里的ipc是通过window来暴露出来。点击打印的时候将配置以及需要打印的数据传到主进程。

// 处理点击打印的事件
const handlePrint = () => {const { ipcRenderer } = window.require('electron')ipcRenderer.invoke("my-print", JSON.stringify({option: {silent: true,deviceName: store.state?.config?.defaultLittlePrinter,printBackground: true,margins: {marginType: "none"},scaleFactor: 80,},data: {orderDetail: state.orderDetail}}));
}

3.2 主进程接收事件并处理

主进程接收这个my-print 的事件之后开始创建窗口

ipcMain.handle('my-print', (event, params) => {this.createPrintWindow(JSON.parse(params))
});

创建窗口的createPrintWindow代码

createPrintWindow(params) {// 实例化一个窗口出来this.printWindow = new BrowserWindow({width: 150,minHeight: 100,frame: false,skipTaskbar: true,transparent: true,resizable: false,show: false,  //不要让窗口显示出来webPreferences: {contextIsolation: false,webviewTag: true,nodeIntegration: true,webSecurity: false,}})// 让窗口去加载webPage里面的某个路由this.printWindow.loadURL("http://localhost:3001/#/print")// 页面加载完成了就可以执行打印的流程了this.printWindow.once('ready-to-show', async () => {setTimeout(() => {this.printWindow.webContents.send('getPrinterData', params.data.orderDetail);}, 100);setTimeout(() => {this.printWindow.webContents.print(params.option, (success: boolean, failureReason: string) => {this.printWindow.destroy()this.printWindow = null})}, 1000);})}

被加载的那个locahost:3001/print 代码

<script setup>
import { ref } from "vue"
import { useStore } from "vuex"
const store = useStore()
const orderDetail = ref()
const { ipcRenderer } = window.require("electron")
ipcRenderer.once("getPrinterData", (event, data) => {orderDetail.value = data
});
</script>

这里直接用了两个定时器来保证加载页面时数据能被接收到以及打印时页面能被渲染完成,虽然是笨方法,但是主要还是实现功能为主。一开始想的是mainWindow页面跟printWindow的页面都是一个项目可以直接使用vuex来保存,但是创建了新窗口之后,新窗口的vuex是重新实例化出来的,获取不到值,然后就直接通过ipc传到主进程再打印时将数据传回Print页面。不过怎么传数据不是很重要,你甚至可以通过localStorage,数据库等持久化一个数据打印之后再删除都行。

4.bug

NOTICE:之前使用的electron版本是19.0,反复尝试调用print这个api都会报错,后面换成了最新的19.0.8版本bug被修复,另外,我还发现electron17的版本里面窗口的拉伸会失效或者鬼畜。

这里的两个setTimeout 很是碍眼,哪天有空了优化成promise

为什么使用BrowserWindow来实现而不是使用webview?webview你还需要去再写一个html的静态文件来当作你打印的结构,直接使用BrowserWindow我直接打印vue的结构更简单

补充一下,项目里面的打印机列表是通过配置来管理的,打印小票直接就给主进程传小票机的名字进行静默打印。

记一次Electron+vue实现动态打印小票相关推荐

  1. 记一次 解决 vue 兼容ie11 的问题

    记一次 解决 vue 兼容ie11 的问题 参考文章: (1)记一次 解决 vue 兼容ie11 的问题 (2)https://www.cnblogs.com/qq735675958/p/117757 ...

  2. editor修改样式 vue_手摸手Electron + Vue实战教程(三)

    系列文章: 手摸手Electron + Vue实战教程(一) 手摸手Electron + Vue实战教程(二) ❝ 上一篇我们已经完成了左侧菜单栏的基本样式功能,这一篇我们就主要来开发右侧的Markd ...

  3. 手把手教Electron+vue的使用

    .现如今前端框架数不胜数,尤其是angular.vue吸引一大批前端开发者,在这个高新技术快速崛起的时代,自然少不了各种框架的结合使用.接下来是介绍electron+vue的结合使用. 2.Elect ...

  4. android仿微信图片编辑器,electron/vue可编辑框contenteditable|仿微信截图

    基于Electron+vue实现div可编辑contenteditable插入表情|electron-vue截图功能 为了避免使用 vue 手动建立起 electron 应用程序.electron-v ...

  5. Electron + Vue 实现输入法自动刷字数

    思路:循环使用 robotjs 库模拟键盘点击,从而实现输入法刷自动刷字数的功能. 安装依赖 npm i robotjs Vue 代码 在 Vue 中编写一个文本域用来聚焦输入法焦点. 思路:当我们按 ...

  6. 【PPic】基于Electron+Vue+iView的图床应用设计

    其实这个应用并不是那么的特别需求,一来本人写blog越来越少,二来开发工作也是越做越少,再者目前的编辑器几乎都支持直接剪切板上传图片,使图床应用的场景越来越少.不过本人本着不想丢弃技术的内心想法,以及 ...

  7. electron vue点击按钮关闭_electron+vue制做桌面应用--自定义标题栏最大/小化和关闭...

    上一篇:electron+vue制做桌面应用--自定义标题栏中咱们介绍了如何使用electon制做自定义样式的标题栏 接下来,咱们介绍一下标题栏上的最大化.最小化和关闭按钮如何实现vue 首先查阅el ...

  8. Electron+Vue的开发经验

    搭建Electron+vue项目以及运行和打包过程中遇到的问题 搭建Electron+Vue项目 安装Vue脚手架与创建vue项目 运行过程中的问题 Q1:启动项目用时长且报如下错误 Q2:在使用no ...

  9. Electron Vue 打包错误: InvalidConfigurationError: ‘build‘ in the application package.json

    Electron Vue electron-builder 打包错误: InvalidConfigurationError: 'build' in the application package.js ...

最新文章

  1. 软件开发 理想_我如何在12个月内找到理想的软件工作
  2. 负载均衡服务器性能,服务器负载均衡:确保应用服务的高性能与高可用
  3. 怎么通过python挣外快_利用Python爬虫轻松挣外快的几个方法(值得收藏)
  4. Linux管事器战略 Web站点的悄然八要素
  5. apps-privacy-policy
  6. c语言match,LeetCode第10题: isMatch(C语言)
  7. 贷款杠杆为什么非去不可?危险比你想象的要恐怖
  8. kaggle(04)---avazu_ctr_predictor(baseline)
  9. Java笔记-对称加密AES的使用
  10. ASP.NET Core和Blazor Code Venture:配置Azure AD身份验证
  11. C# list删除 另外list里面的元素_[Python]列表(list)操作
  12. cent os7 安装dubbo-admin 管理控制台
  13. oracle 表列统计信息,Oracle中收集表与列统计信息
  14. php cc攻击代码,PHP DDOS的UDP攻击,TCP攻击,和CC攻击的核心代码
  15. 抖音短视频去水印网址 视频消重后,火山还是鉴别出来了
  16. win7免费升级win10(正版)!!!
  17. php dingo和jwt,DingoApi 中使用 JWT
  18. lhgdialog弹出框组件 参数详解
  19. Atcoder题解与视频集
  20. 阔别两年的重逢丨CIMT2019中图仪器精彩重现

热门文章

  1. 信息与计算科学要学c语言吗,学“数学与应用数学”和“信息与计算科学”哪个好?...
  2. 『津津乐道播客』#124. 小众爱好之滑翔伞运动
  3. hbuilder项目,直接调试真机运行可以,打包后安装在手机上就不行了,
  4. 延迟补偿在C/S架构游戏协议设计和优化中的应用
  5. openssl 的 tls 命令和相关使用心得
  6. python股票趋势线_在Python中自动检测股票价格的高低并绘制趋势线
  7. java 判断zip文件编码_如何使用UTF-8编码打开java程序生成的zip文件
  8. 从0基础开发搜索引擎(一)-----实战项目
  9. 用wegame启动lol显示服务器维护,wegame启动不了英雄联盟(wegame点启动又弹回界面)...
  10. python笑傲江湖_PHP 2019年继续笑傲江湖