亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

electron實現靜默打印的示例代碼

2019-11-19 11:03:00
字體:
來源:轉載
供稿:網友

前言

electron+vuecli3 實現設置打印機,靜默打印小票功能

網上相關的資料比較少,這里給大家分享一下,希望大家可以少踩一些坑
github地址

必須要強調一下的是electron的版本必須是3.0.0不能,我嘗試了4和5都沒有實現

效果圖


使用

git clone https://github.com/sunnie1992/electron-vue-print-demo.gitnpm installnpm run electron:serve

實現

操作思路
1.用戶點擊打印
2.查詢本地electron-store(用來向本地存儲,讀取數據)是否存打印機名稱
3.已經設置,直接打印
4.沒有設置,彈出設置打印機框
5.用戶設置好確認后打印

首頁App.vue引入了兩個組件,一個是主動設置打印機的彈出printDialog

另外一個是打印組件,打印是通過webview將需要打印的內容渲染到html頁面然后就能打印了

<template> <div id="app">  <el-button type="primary" @click="showPrint">設置打印機</el-button>  <printDialog :dialog-visible="dialogVisible" @cancel="handlePrintDialogCancel" />  <pinter ref="print" :html-data="HtmlData"></pinter>  <el-table :data="tableData" style="width: 100%">   <el-table-column prop="date" label="日期" width="180" column-key="date">   </el-table-column>   <el-table-column prop="name" label="姓名" width="180">   </el-table-column>   <el-table-column prop="address" label="地址">   </el-table-column>   <el-table-column label="操作">    <template slot-scope="scope">     <el-button type="primary" @click="doPrint(scope.row)">打印</el-button>    </template>   </el-table-column>  </el-table> </div></template><script>import { ipcRenderer } from 'electron'import printDialog from './components/PrintDialog.vue'import Pinter from './components/pinter.vue'export default { name: 'App', components: {  Pinter,  printDialog }, data() {  return {   dialogVisible: false,   HtmlData: '',   printList: [],   tableData: [{    date: '2016-05-02',    name: '我是小仙女',    address: '上海市浦東新區',    tag: '家'   }, {    date: '2016-05-04',    name: '我是小仙女1',    address: '上海市浦東新區',    tag: '公司'   }, {    date: '2016-05-01',    name: '我是小仙女2',    address: '上海市浦東新區',    tag: '家'   }, {    date: '2016-05-03',    name: '我是小仙女3',    address: '上海市浦東新區',    tag: '公司'   }]  } }, mounted() { }, methods: {  showPrint() {   this.dialogVisible = true  },  handlePrintDialogCancel() {   this.dialogVisible = false  },  doPrint(row) {   this.HtmlData = row.name   this.$refs.print.print(row.name)  } }}</script><style>#app { font-family: 'Avenir', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px;}</style>

APP.VUE 每次點擊打印按鈕后觸發組件的print方法并將數據傳過去 this.$refs.print.print(row.name)
printer.vue 查詢打印機,然后調用打印方法printRender。

<template> <div class="container">  <webview id="printWebview" ref="printWebview" :src="fullPath" nodeintegration />  <printDialog :dialog-visible="dialogVisible" @cancel="handlePrintDialogCancel" @select-print="printSelectAfter" /> </div></template><script>import { ipcRenderer } from 'electron'import path from 'path'import printDialog from './PrintDialog.vue'export default { name: 'Pinter', components: {  printDialog }, props: {  // HtmlData: {  //  type: String,  //  default: '',  // }, }, data() {  return {   printList: [],   dialogVisible: false,   printDeviceName: '',   fullPath: path.join(__static, 'print.html'),   messageBox: null,   htmlData: ''  } }, mounted() {  const webview = this.$refs.printWebview  webview.addEventListener('ipc-message', (event) => {   if (event.channel === 'webview-print-do') {    console.log(this.printDeviceName)    webview.print(     {      silent: true,      printBackground: true,      deviceName: this.printDeviceName     },     (data) => {      this.messageBox.close()      if (data) {       this.$emit('complete')      } else {       this.$emit('cancel')      }     },    )   }  }) }, methods: {  print(val) {   this.htmlData = val   this.getPrintListHandle()  },  // 獲取打印機列表  getPrintListHandle() {   // 改用ipc異步方式獲取列表,解決打印列數量多的時候導致卡死的問題   ipcRenderer.send('getPrinterList')   ipcRenderer.once('getPrinterList', (event, data) => {    // 過濾可用打印機    this.printList = data.filter(element => element.status === 0)    // 1.判斷是否有打印服務    if (this.printList.length <= 0) {     this.$message({      message: '打印服務異常,請嘗試重啟電腦',      type: 'error'     })     this.$emit('cancel')    } else {     this.checkPrinter()    }   })  },  // 2.判斷打印機狀態  checkPrinter() {   // 本地獲取打印機   const printerName = this.$electronStore.get('printForm') || ''   const printer = this.printList.find(device => device.name === printerName)   // 有打印機設備并且狀態正常直接打印   if (printer && printer.status === 0) {    this.printDeviceName = printerName    this.printRender()   } else if (printerName === '') {    this.$message({     message: '請先設置其他打印機',     type: 'error',     duration: 1000,     onClose: () => {      this.dialogVisible = true     }    })    this.$emit('cancel')   } else {    this.$message({     message: '當前打印機不可用,請重新設置',     type: 'error',     duration: 1000,     onClose: () => {      this.dialogVisible = true     }    })   }  },  handlePrintDialogCancel() {   this.$emit('cancel')   this.dialogVisible = false  },  printSelectAfter(val) {   this.dialogVisible = false   this.$electronStore.set('printForm', val.name)   this.printDeviceName = val.name   this.printRender()  },  printRender(html) {   this.messageBox = this.$message({    message: '打印中,請稍后',    duration: 0   })   // 獲取<webview>節點   const webview = this.$refs.printWebview   // 發送信息到<webview>里的頁面   webview.send('webview-print-render', {    printName: this.printDeviceName,    html: this.htmlData   })  } }}</script><style scoped>.container { position: fixed; right: -500px;}</style>

public/print.html渲染webview頁面成功后發送打印指令

 <script>  const { ipcRenderer } = require('electron')  ipcRenderer.on('webview-print-render', (event, info) => {   // 執行渲染   document.getElementById('bd').innerHTML = info.html   ipcRenderer.sendToHost('webview-print-do')  }) </script> 

這里用到了electron-store存取本地數據

background.js 引入 初始化掛載在global

import ElectronStore from 'electron-store'// ElectronStore 默認數據import electronDefaultData from './config/electron-default-data'let electronStoreapp.on('ready', async() => { // 初始化配置文件 electronStore = new ElectronStore({  defaults: electronDefaultData,  cwd: app.getPath('userData') }) global.electronStore = electronStore})

src/plugins/inject.js

注冊$electronStore

// eslint-disable-next-lineimport { remote } from 'electron'export default { /* eslint no-param-reassign: "error" */ install(Vue) {  Vue.prototype.$electronStore = remote.getGlobal('electronStore')  }}

然后你就可以在vue文件里讀取了

this.$electronStore.get('printForm') 和 this.$electronStore.set('printForm', val.name)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
另类美女黄大片| 色播久久人人爽人人爽人人片视av| 国产午夜精品一区理论片飘花| 精品国产户外野外| 亚洲欧洲在线视频| 欧美国产精品va在线观看| 国产福利成人在线| 黑人巨大精品欧美一区二区三区| 日韩欧美国产骚| 91在线播放国产| 蜜臀久久99精品久久久无需会员| 国产综合福利在线| 亚洲天堂色网站| 91久久久久久久久久| 亚洲第一网中文字幕| 亚洲欧美在线免费观看| 亚洲日本欧美日韩高观看| 久久中文字幕一区| 欧美精品videosex极品1| 国产精品欧美激情在线播放| 亚洲精品日韩激情在线电影| 成人精品一区二区三区电影黑人| 国产suv精品一区二区| 国产一区二区在线播放| 亚洲女人初尝黑人巨大| 亚洲精品一区二区三区婷婷月| 欧美大尺度电影在线观看| 欧美一区二区影院| 欧美色播在线播放| 亚洲国产私拍精品国模在线观看| 久久777国产线看观看精品| 国产日韩欧美日韩| 国产成一区二区| 久久精品99久久香蕉国产色戒| 精品亚洲aⅴ在线观看| 午夜精品一区二区三区在线视频| 亚洲国产欧美一区| 国产精品一区专区欧美日韩| 欧美日韩国产色视频| 三级精品视频久久久久| 国产成人亚洲综合91| 欧美怡春院一区二区三区| 日韩欧美在线视频观看| 亚洲女性裸体视频| 亚洲欧洲黄色网| 日韩一区二区三区xxxx| 欧美成人午夜激情在线| 国产啪精品视频网站| 日本精品在线视频| 日韩av手机在线| 国内精品久久久久影院优| 在线观看中文字幕亚洲| 欧美一区二区三区艳史| 啊v视频在线一区二区三区| 国产99视频在线观看| 日韩欧美在线国产| 国产一区二区三区视频免费| 深夜成人在线观看| 国产精品91久久久久久| 亚洲深夜福利视频| 国产成人高清激情视频在线观看| 日韩二区三区在线| 国产精品久久久久久久久久尿| 国产在线不卡精品| 亚洲福利小视频| 欧美黑人极品猛少妇色xxxxx| 国产精品久久久久久久电影| 日韩高清有码在线| 欧美激情a在线| 亚洲视频在线免费看| 日韩高清免费在线| 原创国产精品91| 91在线观看免费高清| 日韩中文字幕免费| 亚洲成人黄色网| 在线国产精品播放| 成人性教育视频在线观看| 欧美理论电影在线观看| 国产91在线高潮白浆在线观看| 亚洲最大福利视频| 欧美xxxx18国产| 国产精品久久久久久av下载红粉| 欧美噜噜久久久xxx| 亚洲天堂成人在线视频| 国产精品香蕉国产| 国产一区二区三区网站| 另类图片亚洲另类| 欧美日韩国产成人| 性欧美激情精品| 亚洲色图校园春色| 韩国视频理论视频久久| 欧美精品中文字幕一区| 久久精品福利视频| 亚洲精品一区二三区不卡| 日韩av毛片网| 97香蕉超级碰碰久久免费的优势| 成人在线中文字幕| 亚洲自拍偷拍色片视频| 亚洲国产免费av| 国产精品丝袜一区二区三区| 久操成人在线视频| 日韩精品亚洲元码| 亚洲无限av看| 欧美亚洲一区在线| 欧美激情伊人电影| 色香阁99久久精品久久久| 午夜精品福利视频| 91av福利视频| 久久成人精品视频| 亚洲第一二三四五区| 国产精品尤物福利片在线观看| 欧美日韩免费观看中文| 精品一区二区三区电影| 亚洲自拍偷拍区| 在线看欧美日韩| 国模精品视频一区二区| 亚洲一区二区三区成人在线视频精品| 国产精品爽爽爽爽爽爽在线观看| 欧美视频中文在线看| 欧美综合在线观看| 成人黄色生活片| 亚洲人成自拍网站| 欧美日韩美女在线观看| 亚洲图片制服诱惑| 中文字幕国产亚洲| 曰本色欧美视频在线| 国外色69视频在线观看| 欧美日韩国产综合视频在线观看中文| 日韩亚洲精品电影| 欧美专区在线视频| 日韩禁在线播放| 亚洲第一视频网站| 国产中文字幕日韩| 久久精品一区中文字幕| 中文字幕亚洲自拍| 国产一区二区三区三区在线观看| 国产中文字幕日韩| 亚洲网站视频福利| 国产玖玖精品视频| 成人福利在线视频| 国产乱肥老妇国产一区二| 中文字幕久热精品视频在线| 欧美精品精品精品精品免费| 欧美日韩国产一区二区| 亚洲乱码国产乱码精品精天堂| 亚洲国产精品久久久久秋霞蜜臀| 亚洲国产精品va在线| 精品日本美女福利在线观看| 正在播放亚洲1区| 91精品国产沙发| 精品中文视频在线| 亚洲网站在线看| 91久久精品国产91久久性色| 亚洲国产精品久久久久秋霞不卡| 亚洲一区中文字幕在线观看| 欧美在线一级va免费观看| 九九热精品在线| 日韩欧美精品网站| 久久国产视频网站| www高清在线视频日韩欧美| 久久久亚洲精选| 国产精品福利网站| 中文字幕亚洲欧美日韩高清| 久久综合五月天|