中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

electron + vue項目實現打印小票功能及實現代碼

發布時間:2020-09-04 00:07:20 來源:腳本之家 閱讀:2068 作者:mrr 欄目:web開發

一 需求:

公司項目需要通過electron調用系統打印機,實現打印小票的功能。

二、分析:

electron打印大概有兩種:

第一種:通過window的webcontent對象,使用此種方式需要單獨開出一個打印的窗口,可以將該窗口隱藏,但是通信調用相對復雜。

第二種:使用頁面的webview元素調用打印,可以將webview隱藏在調用的頁面中,通信方式比較簡單。

兩個對象調用打印方法的使用方式都一樣。

本文是通過第二種方法實現靜默打印。

三、實現過程:

1、要實現打印功能,首先要知道我們的設備上有哪些打印機。方法是:在渲染線程通過electron的ipcRenderer對象發送事件到主線程獲取。(本文的渲染線程可以當做為一個print.vue文件)

(1)主線程(electron.js)偽代碼如下:

//引入electron
import 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>

(2)html文件創建完成后,將print.html引入到。該需要顯式的定義在print.vue文件中,但需要將它用v-show="false"隱藏,不能用v-if,因為我們需要的dom節點存在于頁面上,只是不展示而已。

<script>
mounted() {
  //當vue節點渲染完成后,獲取<webview>節點
  const webview = this.$refs.printWebview;
  
  //監聽<webview>里面的消息,也就是監聽print.html里面的ipcRenderer.sendToHost發送的事件,當該事件發送成功后就會進入下面的回調事件中執行打印操作。
  webview.addEventListener('ipc-message', (event) => {
   if (event.channel === 'webview-print-do') {
    //如果收到<webview>傳過來的事件,名為"webview-print-do",就執行 webview.print打印方法,打印<webview>里面的內容。
    webview.print(
     {
      //是否是靜默打印
      silent: true,
      printBackground: true,
      //打印機的名稱,就是本文一開始獲得的打印機列表其中一個
      deviceName: 'xxx',
     },
     (data) => {
      //這個回調是打印后的回調事件,data為true就是打印成功,為false就打印失敗
      console.log('webview success', data);
     },
    );
   }
  });
},
</script>

到這里本electron調用打印機的功能就實現了。

總結

以上所述是小編給大家介紹的electron + vue項目實現打印小票功能及實現代碼,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昌邑市| 巴东县| 兰坪| 濮阳市| 密云县| 荣成市| 晋江市| 平陆县| 永德县| 恩施市| 泾阳县| 杭州市| 禄丰县| 大庆市| 兴仁县| 天津市| 三明市| 花垣县| 壤塘县| 馆陶县| 阳高县| 依兰县| 黎川县| 郯城县| 泰来县| 元江| 边坝县| 湟源县| 凉山| 峨山| 桐城市| 怀柔区| 大竹县| 谷城县| 玉环县| 北京市| 郁南县| 河北省| 治县。| 元江| 海南省|