国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

electron實(shí)現(xiàn)靜默打印的示例代碼

2019-11-19 11:03:00
字體:
供稿:網(wǎng)友

前言

electron+vuecli3 實(shí)現(xiàn)設(shè)置打印機(jī),靜默打印小票功能

網(wǎng)上相關(guān)的資料比較少,這里給大家分享一下,希望大家可以少踩一些坑
github地址

必須要強(qiáng)調(diào)一下的是electron的版本必須是3.0.0不能,我嘗試了4和5都沒有實(shí)現(xiàn)

效果圖


使用

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

實(shí)現(xiàn)

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

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

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

<template> <div id="app">  <el-button type="primary" @click="showPrint">設(shè)置打印機(jī)</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: '上海市浦東新區(qū)',    tag: '家'   }, {    date: '2016-05-04',    name: '我是小仙女1',    address: '上海市浦東新區(qū)',    tag: '公司'   }, {    date: '2016-05-01',    name: '我是小仙女2',    address: '上海市浦東新區(qū)',    tag: '家'   }, {    date: '2016-05-03',    name: '我是小仙女3',    address: '上海市浦東新區(qū)',    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 每次點(diǎn)擊打印按鈕后觸發(fā)組件的print方法并將數(shù)據(jù)傳過去 this.$refs.print.print(row.name)
printer.vue 查詢打印機(jī),然后調(diào)用打印方法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()  },  // 獲取打印機(jī)列表  getPrintListHandle() {   // 改用ipc異步方式獲取列表,解決打印列數(shù)量多的時候?qū)е驴ㄋ赖膯栴}   ipcRenderer.send('getPrinterList')   ipcRenderer.once('getPrinterList', (event, data) => {    // 過濾可用打印機(jī)    this.printList = data.filter(element => element.status === 0)    // 1.判斷是否有打印服務(wù)    if (this.printList.length <= 0) {     this.$message({      message: '打印服務(wù)異常,請嘗試重啟電腦',      type: 'error'     })     this.$emit('cancel')    } else {     this.checkPrinter()    }   })  },  // 2.判斷打印機(jī)狀態(tài)  checkPrinter() {   // 本地獲取打印機(jī)   const printerName = this.$electronStore.get('printForm') || ''   const printer = this.printList.find(device => device.name === printerName)   // 有打印機(jī)設(shè)備并且狀態(tài)正常直接打印   if (printer && printer.status === 0) {    this.printDeviceName = printerName    this.printRender()   } else if (printerName === '') {    this.$message({     message: '請先設(shè)置其他打印機(jī)',     type: 'error',     duration: 1000,     onClose: () => {      this.dialogVisible = true     }    })    this.$emit('cancel')   } else {    this.$message({     message: '當(dāng)前打印機(jī)不可用,請重新設(shè)置',     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>節(jié)點(diǎn)   const webview = this.$refs.printWebview   // 發(fā)送信息到<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頁面成功后發(fā)送打印指令

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

這里用到了electron-store存取本地?cái)?shù)據(jù)

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

import ElectronStore from 'electron-store'// ElectronStore 默認(rèn)數(shù)據(jù)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)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鄄城县| 东安县| 富平县| 定陶县| 瓮安县| 若羌县| 垦利县| SHOW| 南江县| 通辽市| 永福县| 呈贡县| 石河子市| 鹤岗市| 青冈县| 台北县| 错那县| 无棣县| 怀宁县| 左云县| 班戈县| 政和县| 西乌| 鲁山县| 隆尧县| 十堰市| 邛崃市| 兴义市| 八宿县| 枣强县| 太原市| 佛教| 开封县| 纳雍县| 洪泽县| 新疆| 峨眉山市| 伊春市| 昌乐县| 铜梁县| 凤翔县|