electron + vue項目實現(xiàn)打印小票功能及實現(xiàn)代碼
一 需求:
公司項目需要通過electron調(diào)用系統(tǒng)打印機,實現(xiàn)打印小票的功能。
二、分析:
electron打印大概有兩種:
第一種:通過window的webcontent對象,使用此種方式需要單獨開出一個打印的窗口,可以將該窗口隱藏,但是通信調(diào)用相對復雜。
第二種:使用頁面的webview元素調(diào)用打印,可以將webview隱藏在調(diào)用的頁面中,通信方式比較簡單。
兩個對象調(diào)用打印方法的使用方式都一樣。
本文是通過第二種方法實現(xiàn)靜默打印。
三、實現(xiàn)過程:
1、要實現(xiàn)打印功能,首先要知道我們的設備上有哪些打印機。方法是:在渲染線程通過electron的ipcRenderer對象發(fā)送事件到主線程獲取。(本文的渲染線程可以當做為一個print.vue文件)
(1)主線程(electron.js)偽代碼如下:
//引入electron
import electron from 'electron';
//創(chuàng)建一個瀏覽器對象
const window = new electron.BrowserWindow({
width,
height,
frame: false,
show: false,
backgroundColor: '#4b5b79',
minWidth: 1024,
minHeight: 768,
webPreferences: { webSecurity: false },
});
//在主線程下,通過ipcMain對象監(jiān)聽渲染線程傳過來的getPrinterList事件
electron.ipcMain.on('getPrinterList', (event) => {
//主線程獲取打印機列表
const list = window.webContents.getPrinters();
//通過webContents發(fā)送事件到渲染線程,同時將打印機列表也傳過去
window.webContents.send('getPrinterList', list);
});
===============================================================================
(2)渲染線程(print.vue文件)偽代碼如下:
<template>
</template>
<script>
//引入ipcRenderer對象,該對象和主線程的ipcMain通訊
import { ipcRenderer } from 'electron';
//渲染線程主動發(fā)送getPrinterList事件到主線程請求打印機列表
ipcRenderer.send('getPrinterList');
//監(jiān)聽主線程獲取到打印機列表后的回調(diào)
ipcRenderer.once('getPrinterList', (event, data) => {
//data就是打印機列表
this.printList = data;
});
</script>
//獲取打印機列表完成
2、(重頭戲來了)獲取打印機列表后,就需要通過electron自帶的標簽實現(xiàn)小票排版。 是什么?可以把它當做標簽,它里面顯示的是你需要打印的內(nèi)容。
(1)使用之前,需要新建一個print.html文件,把你要打印的內(nèi)容通過print.html顯示出來。我們項目的需求是將要打印的內(nèi)容通過canvas畫出后,再將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樣式是用來設置打印機打印出來的樣式,例如設置小票外邊距樣式
@page {
margin: 0px;
}
</style>
</head>
<body id='bd'>
</body>
<script>
//引入ipcRenderer對象
const {ipcRenderer} = require('electron')
//監(jiān)聽渲染線程傳過來的webview-print-render事件
ipcRenderer.on('webview-print-render', (event, deviceInfo) => {
// 動態(tài)創(chuàng)建一個img標簽,然后插入到<body>中。deviceInfo是渲染線程傳過來的數(shù)據(jù)
let html = '';
html = `<img src="${deviceInfo.imgSource}"
width="${deviceInfo.imgWidth}px"
height="${deviceInfo.imgHeight}px">`;
document.getElementById('bd').innerHTML = html;
//當圖片插入到頁面后,通過ipcRenderer對象的sendToHost方法和渲染線程通訊,告訴渲染線程打印的內(nèi)容已經(jīng)準備完畢,請開始打印操作
ipcRenderer.sendToHost('webview-print-do');
});
</script>
</html>
(2)html文件創(chuàng)建完成后,將print.html引入到。該需要顯式的定義在print.vue文件中,但需要將它用v-show="false"隱藏,不能用v-if,因為我們需要的dom節(jié)點存在于頁面上,只是不展示而已。
<script>
mounted() {
//當vue節(jié)點渲染完成后,獲取<webview>節(jié)點
const webview = this.$refs.printWebview;
//監(jiān)聽<webview>里面的消息,也就是監(jiān)聽print.html里面的ipcRenderer.sendToHost發(fā)送的事件,當該事件發(fā)送成功后就會進入下面的回調(diào)事件中執(zhí)行打印操作。
webview.addEventListener('ipc-message', (event) => {
if (event.channel === 'webview-print-do') {
//如果收到<webview>傳過來的事件,名為"webview-print-do",就執(zhí)行 webview.print打印方法,打印<webview>里面的內(nèi)容。
webview.print(
{
//是否是靜默打印
silent: true,
printBackground: true,
//打印機的名稱,就是本文一開始獲得的打印機列表其中一個
deviceName: 'xxx',
},
(data) => {
//這個回調(diào)是打印后的回調(diào)事件,data為true就是打印成功,為false就打印失敗
console.log('webview success', data);
},
);
}
});
},
</script>
到這里本electron調(diào)用打印機的功能就實現(xiàn)了。
總結(jié)
以上所述是小編給大家介紹的electron + vue項目實現(xiàn)打印小票功能及實現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!
相關(guān)文章
VUE element上傳動態(tài)設置action路徑和參數(shù)的坑及解決
這篇文章主要介紹了VUE element上傳動態(tài)設置action路徑和參數(shù)的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
Vue中的transition封裝組件的實現(xiàn)方法
這篇文章主要介紹了Vue中的transition封裝組件的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08
基于uniapp+vue3自定義增強版table表格組件「兼容H5+小程序+App端」
uv3-table:一款基于uniapp+vue3跨端自定義手機端增強版表格組件,支持固定表頭/列、邊框、斑馬紋、單選/多選,自定義表頭/表體插槽、左右固定列陰影高亮顯示,支持編譯兼容H5+小程序端+App端,H5+小程序+App端,多端運行一致2024-05-05
vue刷新頁面后params參數(shù)丟失的原因和解決方法
這篇文章主要給大家介紹了vue刷新頁面后params參數(shù)丟失的原因和解決方法,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2023-12-12
vue.config.js中configureWebpack與chainWebpack區(qū)別及說明
這篇文章主要介紹了vue.config.js中configureWebpack與chainWebpack區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
vue中watch監(jiān)聽路由傳來的參數(shù)變化問題
這篇文章主要介紹了vue中watch監(jiān)聽路由傳來的參數(shù)變化,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07

