首页 > 语言 > JavaScript > 正文

electron + vue项目实现打印小票功能及实现代码

2024-05-06 15:27:46
字体:
来源:转载
供稿:网友

一 需求:

公司项目需要通过electron调用系统打印机,实现打印小票的功能。

二、分析:

electron打印大概有两种:

第一种:通过window的webcontent对象,使用此种方式需要单独开出一个打印的窗口,可以将该窗口隐藏,但是通信调用相对复杂。

第二种:使用页面的webview元素调用打印,可以将webview隐藏在调用的页面中,通信方式比较简单。

两个对象调用打印方法的使用方式都一样。

本文是通过第二种方法实现静默打印。

三、实现过程:

1、要实现打印功能,首先要知道我们的设备上有哪些打印机。方法是:在渲染线程通过electron的ipcRenderer对象发送事件到主线程获取。(本文的渲染线程可以当做为一个print.vue文件)

(1)主线程(electron.js)伪代码如下:

//引入electronimport electron from 'electron';//创建一个浏览器对象const window = new electron.BrowserWindow({  width,  height,  frame: false,  show: false,  backgroundColor: '#4b5b79',  minWidth: 1024,  minHeight: 768,  webPreferences: { webSecurity: false }, }); //在主线程下,通过ipcMain对象监听渲染线程传过来的getPrinterList事件electron.ipcMain.on('getPrinterList', (event) => {  //主线程获取打印机列表  const list = window.webContents.getPrinters();    //通过webContents发送事件到渲染线程,同时将打印机列表也传过去  window.webContents.send('getPrinterList', list);});

===============================================================================

(2)渲染线程(print.vue文件)伪代码如下:

<template></template><script>  //引入ipcRenderer对象,该对象和主线程的ipcMain通讯  import { ipcRenderer } from 'electron';    //渲染线程主动发送getPrinterList事件到主线程请求打印机列表  ipcRenderer.send('getPrinterList');     //监听主线程获取到打印机列表后的回调   ipcRenderer.once('getPrinterList', (event, data) => {    //data就是打印机列表    this.printList = data;   });</script>//获取打印机列表完成

2、(重头戏来了)获取打印机列表后,就需要通过electron自带的标签实现小票排版。 是什么?可以把它当做标签,它里面显示的是你需要打印的内容。

(1)使用之前,需要新建一个print.html文件,把你要打印的内容通过print.html显示出来。我们项目的需求是将要打印的内容通过canvas画出后,再将canvas转成图片资源(base64),然后放到里面显示,伪代码如下:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> //@page样式是用来设置打印机打印出来的样式,例如设置小票外边距样式  @page {   margin: 0px;  } </style></head><body id='bd'></body><script>  //引入ipcRenderer对象 const {ipcRenderer} = require('electron')  //监听渲染线程传过来的webview-print-render事件 ipcRenderer.on('webview-print-render', (event, deviceInfo) => {  // 动态创建一个img标签,然后插入到<body>中。deviceInfo是渲染线程传过来的数据  let html = '';  html = `<img src="${deviceInfo.imgSource}"   width="${deviceInfo.imgWidth}px"   height="${deviceInfo.imgHeight}px">`;  document.getElementById('bd').innerHTML = html;    //当图片插入到页面后,通过ipcRenderer对象的sendToHost方法和渲染线程通讯,告诉渲染线程打印的内容已经准备完毕,请开始打印操作  ipcRenderer.sendToHost('webview-print-do'); });</script></html>            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选