electron + vue項(xiàng)目實(shí)現(xiàn)打印小票功能及實(shí)現(xiàn)代碼
一 需求:
公司項(xiàng)目需要通過(guò)electron調(diào)用系統(tǒng)打印機(jī),實(shí)現(xiàn)打印小票的功能。
二、分析:
electron打印大概有兩種:
第一種:通過(guò)window的webcontent對(duì)象,使用此種方式需要單獨(dú)開(kāi)出一個(gè)打印的窗口,可以將該窗口隱藏,但是通信調(diào)用相對(duì)復(fù)雜。
第二種:使用頁(yè)面的webview元素調(diào)用打印,可以將webview隱藏在調(diào)用的頁(yè)面中,通信方式比較簡(jiǎn)單。
兩個(gè)對(duì)象調(diào)用打印方法的使用方式都一樣。
本文是通過(guò)第二種方法實(shí)現(xiàn)靜默打印。
三、實(shí)現(xiàn)過(guò)程:
1、要實(shí)現(xiàn)打印功能,首先要知道我們的設(shè)備上有哪些打印機(jī)。方法是:在渲染線程通過(guò)electron的ipcRenderer對(duì)象發(fā)送事件到主線程獲取。(本文的渲染線程可以當(dāng)做為一個(gè)print.vue文件)
(1)主線程(electron.js)偽代碼如下:
//引入electron import electron from 'electron'; //創(chuàng)建一個(gè)瀏覽器對(duì)象 const window = new electron.BrowserWindow({ width, height, frame: false, show: false, backgroundColor: '#4b5b79', minWidth: 1024, minHeight: 768, webPreferences: { webSecurity: false }, }); //在主線程下,通過(guò)ipcMain對(duì)象監(jiān)聽(tīng)渲染線程傳過(guò)來(lái)的getPrinterList事件 electron.ipcMain.on('getPrinterList', (event) => { //主線程獲取打印機(jī)列表 const list = window.webContents.getPrinters(); //通過(guò)webContents發(fā)送事件到渲染線程,同時(shí)將打印機(jī)列表也傳過(guò)去 window.webContents.send('getPrinterList', list); });
===============================================================================
(2)渲染線程(print.vue文件)偽代碼如下:
<template> </template> <script> //引入ipcRenderer對(duì)象,該對(duì)象和主線程的ipcMain通訊 import { ipcRenderer } from 'electron'; //渲染線程主動(dòng)發(fā)送getPrinterList事件到主線程請(qǐng)求打印機(jī)列表 ipcRenderer.send('getPrinterList'); //監(jiān)聽(tīng)主線程獲取到打印機(jī)列表后的回調(diào) ipcRenderer.once('getPrinterList', (event, data) => { //data就是打印機(jī)列表 this.printList = data; }); </script> //獲取打印機(jī)列表完成
2、(重頭戲來(lái)了)獲取打印機(jī)列表后,就需要通過(guò)electron自帶的標(biāo)簽實(shí)現(xiàn)小票排版。 是什么?可以把它當(dāng)做標(biāo)簽,它里面顯示的是你需要打印的內(nèi)容。
(1)使用之前,需要新建一個(gè)print.html文件,把你要打印的內(nèi)容通過(guò)print.html顯示出來(lái)。我們項(xiàng)目的需求是將要打印的內(nèi)容通過(guò)canvas畫(huà)出后,再將canvas轉(zhuǎn)成圖片資源(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樣式是用來(lái)設(shè)置打印機(jī)打印出來(lái)的樣式,例如設(shè)置小票外邊距樣式 @page { margin: 0px; } </style> </head> <body id='bd'> </body> <script> //引入ipcRenderer對(duì)象 const {ipcRenderer} = require('electron') //監(jiān)聽(tīng)渲染線程傳過(guò)來(lái)的webview-print-render事件 ipcRenderer.on('webview-print-render', (event, deviceInfo) => { // 動(dòng)態(tài)創(chuàng)建一個(gè)img標(biāo)簽,然后插入到<body>中。deviceInfo是渲染線程傳過(guò)來(lái)的數(shù)據(jù) let html = ''; html = `<img src="${deviceInfo.imgSource}" width="${deviceInfo.imgWidth}px" height="${deviceInfo.imgHeight}px">`; document.getElementById('bd').innerHTML = html; //當(dāng)圖片插入到頁(yè)面后,通過(guò)ipcRenderer對(duì)象的sendToHost方法和渲染線程通訊,告訴渲染線程打印的內(nèi)容已經(jīng)準(zhǔn)備完畢,請(qǐng)開(kāi)始打印操作 ipcRenderer.sendToHost('webview-print-do'); }); </script> </html>
(2)html文件創(chuàng)建完成后,將print.html引入到。該需要顯式的定義在print.vue文件中,但需要將它用v-show="false"隱藏,不能用v-if,因?yàn)槲覀冃枰膁om節(jié)點(diǎn)存在于頁(yè)面上,只是不展示而已。
<script> mounted() { //當(dāng)vue節(jié)點(diǎn)渲染完成后,獲取<webview>節(jié)點(diǎn) const webview = this.$refs.printWebview; //監(jiān)聽(tīng)<webview>里面的消息,也就是監(jiān)聽(tīng)print.html里面的ipcRenderer.sendToHost發(fā)送的事件,當(dāng)該事件發(fā)送成功后就會(huì)進(jìn)入下面的回調(diào)事件中執(zhí)行打印操作。 webview.addEventListener('ipc-message', (event) => { if (event.channel === 'webview-print-do') { //如果收到<webview>傳過(guò)來(lái)的事件,名為"webview-print-do",就執(zhí)行 webview.print打印方法,打印<webview>里面的內(nèi)容。 webview.print( { //是否是靜默打印 silent: true, printBackground: true, //打印機(jī)的名稱,就是本文一開(kāi)始獲得的打印機(jī)列表其中一個(gè) deviceName: 'xxx', }, (data) => { //這個(gè)回調(diào)是打印后的回調(diào)事件,data為true就是打印成功,為false就打印失敗 console.log('webview success', data); }, ); } }); }, </script>
到這里本electron調(diào)用打印機(jī)的功能就實(shí)現(xiàn)了。
總結(jié)
以上所述是小編給大家介紹的electron + vue項(xiàng)目實(shí)現(xiàn)打印小票功能及實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
vue項(xiàng)目中使用websocket的實(shí)現(xiàn)
本文主要介紹了vue項(xiàng)目中使用websocket的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Vue?3?中動(dòng)態(tài)賦值?ref?的應(yīng)用示例解析
Vue3引入了Composition?API,其中ref是核心概念,允許開(kāi)發(fā)者聲明響應(yīng)式狀態(tài),本文通過(guò)一個(gè)具體示例,探討了在Vue3中如何使用ref進(jìn)行動(dòng)態(tài)賦值,尤其是在處理DOM相關(guān)操作時(shí)的應(yīng)用,通過(guò)ref動(dòng)態(tài)賦值,可以有效管理組件內(nèi)的狀態(tài),提高代碼的可維護(hù)性和清晰度2024-09-09vue實(shí)現(xiàn)聯(lián)動(dòng)選擇
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)聯(lián)動(dòng)選擇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Vue報(bào)錯(cuò):TypeError:Cannot create property '
這篇文章主要介紹了Vue報(bào)錯(cuò):TypeError:Cannot create property 'xxx' on string 'xxxx'問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Vue中UI組件庫(kù)之Vuex與虛擬服務(wù)器初識(shí)
這篇文章主要介紹了Vue中UI組件庫(kù)之Vuex與虛擬服務(wù)器初識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05Vue前端登錄token信息驗(yàn)證功能實(shí)現(xiàn)
最近公司新啟動(dòng)了個(gè)項(xiàng)目,用的是vue框架在做,下面這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)token登錄驗(yàn)證的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12vue3中使用@vueuse/core中的圖片懶加載案例詳解
這篇文章主要介紹了vue3中使用@vueuse/core中的圖片懶加載案例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03基于axios 的responseType類型的設(shè)置方法
今天小編就為大家分享一篇基于axios 的responseType類型的設(shè)置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10