当前位置:   article > 正文

electron+vue 实现静默打印_vue前端实现静默打印

vue前端实现静默打印

我的electron版本:^12.0.0; vue版本:^3.2.13。

我是通过webview实现的。

实现原理:webview类似于iframe,webview是electron中的一个内嵌窗口,打印的也就是这个内嵌窗口的内容。

共需要两个文件:一个是vue文件,主要承担数据预处理工作;第二个是html文件,主要承担显示打印内容工作。两个文件直接通讯,并没有通过主进程。

唯一需要主进程和渲染进程通讯的是获取打印机列表。

开始正式开发.........................

第一步:在backgroud.js中打开webview,electron5.0后默认停用webview,所以需要在配置文件中配置为默认开启。

  1. const win = new BrowserWindow({
  2. width: 1920,
  3. height: 1080,
  4. fullscreen: true,//全屏显示
  5. webPreferences: {
  6. nodeIntegration: true,
  7. contextIsolation: false,
  8. webviewTag: true, // 允许使用 webview 标签
  9. },
  10. frame: false, //客户端窗口顶部菜单去掉
  11. });

第二步:vue.config.js中设置html加载器,如果不设置,项目启动后会报无法加载html文件。

首先使用 npm install html-loader,然后再进行配置。

  1. chainWebpack: (config) => {
  2. config.module.rule()
  3. .test(/\.html$/)
  4. .use('html-loader')
  5. .loader('html-loader')
  6. },

第三步:主进程和渲染进程通讯,获取打印机列表。

  1. //主进程
  2. import {ipcMain } from "electron";
  3. ipcMain.on("getPrintList", () => {
  4. win.webContents.send("printList", win.webContents.getPrinters());
  5. });
  1. //渲染进程
  2. import { ipcRenderer } from "electron";
  3. getPrintList() {
  4. ipcRenderer.send("getPrintList");
  5. ipcRenderer.once("printList", (event, data) => {
  6. this.printlist = data; //printList需要在data中预定义,printlist: []。返回的data就是打印机列表
  7. });
  8. },

第四步:vue文件的处理,主要工作包括:数据的预处理,引用html文件,发布打印命令。

  1. <webview
  2. :src="src"
  3. ref="webview"
  4. nodeintegration
  5. style="position: absolute;right: 200vh;top: 0;"
  6. :style="{ width: pageSize.with + 'mm', height: pageSize.height + 'mm' }"
  7. />
  8. import raw from "@/views/components/print/print.html?raw";//此处就是html文件地址
  9. import { ElMessage, ElMessageBox, ElNotification } from "element-plus";
  10. import { ipcRenderer } from "electron";
  11. data() {
  12. return {
  13. printlist: [], //上一步需要预定义的打印机列表
  14. src: "",
  15. pageSize: {
  16. with: 210,
  17. height: 297,
  18. },
  19. };
  20. },
  21. methods:{
  22. //数据处理,注意传递数据的方式:$为key,后为数据。
  23. handleData(){
  24. this.src = URL.createObjectURL(
  25. new Blob(
  26. [
  27. raw
  28. .replace("$1", "数据测试")
  29. ],
  30. {
  31. type: "text/html",
  32. }
  33. )
  34. );
  35. },
  36. //打印,自定义一个button调用函数即可进行打印
  37. print() {
  38. let webview = this.$refs.webview;//首先通过ref获取webview标签
  39. let deviceName = "";//设置默认打印机
  40. for (let index = 0; index < this.printlist.length; index++) {
  41. if (this.printlist[index].isDefault) {
  42. deviceName = this.printlist[index].name;//遍历打印机集合,将默认打印机名字赋值给deviceName
  43. }
  44. }
  45. ElMessage({
  46. message: "即将使用打印机 "+deviceName,
  47. grouping: true,
  48. type: "success",
  49. });
  50. if (this.printlist.length) {
  51. webview.print({
  52. silent: true,//静默打印设置为true
  53. deviceName: deviceName,
  54. margins: {
  55. marginType: "none",
  56. },
  57. pageRanges: [{ from: 0, to: 0 }],
  58. pageSize: "A4",
  59. });
  60. } else {
  61. message.error("请连接打印机");
  62. }
  63. },
  64. }

第五步:html文件的编写。html文件位置要放在第四步指定的位置。

  1. <!DOCTYPE html>
  2. <html lang="zh">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>Document</title>
  8. <style></style>
  9. </head>
  10. <body>
  11. <div>
  12. <!--$符进行取值-->
  13. <span>$1</span>
  14. </table>
  15. </div>
  16. </body>
  17. <style type="text/css">
  18. </style>
  19. </html>

通过以上五步,即可实现electron的静默打印。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/804755
推荐阅读
  

闽ICP备14008679号