Browse Source

获取打印机列表
Signed-off-by: Caner <40012261+Canees@users.noreply.github.com>

Caner 3 years ago
parent
commit
31e55abec4
5 changed files with 71 additions and 439 deletions
  1. 19 6
      main.js
  2. 1 1
      package.json
  3. 40 7
      src/pages/print/App.vue
  4. 0 414
      src/pages/print/app-rem.vue
  5. 11 11
      yarn.lock

+ 19 - 6
main.js

@@ -55,7 +55,7 @@ class InitWin {
     // 在窗口内要展示的内容index.html 就是打包生成的index.html
     obj.loadFile('dist/index.html')
     // 开启调试工具
-    obj.webContents.openDevTools()
+    // obj.webContents.openDevTools()
     // 事件监听
     obj.on('close', () => {
       // 回收BrowserWindow对象
@@ -84,7 +84,7 @@ class InitWin {
       }
     })// 创建一个窗口
     obj.loadFile('dist/print.html')
-    // print.webContents.openDevTools()
+    obj.webContents.openDevTools()
     obj.on('close', () => {
       // 回收BrowserWindow对象
       this.printWin = null
@@ -92,6 +92,20 @@ class InitWin {
     return obj
   }
 
+  /**
+   * 发送打印机列表
+   * @param {Obj} win 窗口对象
+   * @param {String} eventName 需要发送事件名称
+   */
+  async getPrintList(win) {
+    try {
+      const list = await win.webContents.getPrintersAsync()
+      win.webContents.send('getPrintList', list)
+    } catch (error) {
+      console.log('请升级electron版本')
+    }
+  }
+
   /**
    * 事件监听
    */
@@ -107,12 +121,11 @@ class InitWin {
       })
 
       // 监听打开print
-      ipcMain.on('openPrint', (event, data) => {
+      ipcMain.on('openPrint', async (event, data) => {
         // TODO: 页面数据生成PDF
 
-        // TODO: 数据回传打印组件
-
-        // 显示打印组件
+        // 回传打印机列表
+        await this.getPrintList(this.printWin)
         this.printWin.show()
         console.log('open', data)
       })

+ 1 - 1
package.json

@@ -18,7 +18,7 @@
     "@electron-forge/maker-zip": "^6.0.0-beta.63",
     "axios": "^0.24.0",
     "echarts": "^5.3.2",
-    "electron": "^17.2.0",
+    "electron": "^19.0.4",
     "eslint": "^8.15.0",
     "eslint-config-airbnb-base": "^15.0.0",
     "eslint-plugin-import": "^2.26.0",

+ 40 - 7
src/pages/print/App.vue

@@ -203,8 +203,8 @@ export default {
       // 打印机列表
       deviceName: [
         {
-          value: 'test',
-          label: 'test'
+          label: '11111111111111111111111111111111111',
+          value: 0
         }
       ],
       // 工作表的页数
@@ -322,7 +322,7 @@ export default {
       ],
       // 选定数据
       selectData: {
-        deviceName: 'test', // 目标打印机
+        deviceName: '', // 目标打印机
         pagesPerSheet: 1, // 工作表的页数
         copies: 1, // 份数
         Landscape: 0, // 布局
@@ -336,14 +336,32 @@ export default {
     }
   },
   methods: {
-
     // 关闭打印
     close() {
-      const electron = window.$electron || null
-      if (electron) {
-        electron.ipcRenderer.send('closePrint', false)
+      const { ipcRenderer } = window.$electron || null
+      if (ipcRenderer) {
+        ipcRenderer.send('closePrint', false)
       }
     }
+  },
+  mounted() {
+    const { ipcRenderer } = window.$electron || null
+    if (ipcRenderer) {
+      ipcRenderer.on('getPrintList', (event, list) => {
+        const arr = []
+        let isDefault = ''
+        for (let k = 0; k < list.length; k++) {
+          const el = list[k]
+          if (el.isDefault) isDefault = el.name
+          arr.push({
+            value: el.name,
+            label: el.displayName
+          })
+        }
+        this.deviceName = arr
+        this.selectData.deviceName = isDefault
+      })
+    }
   }
 }
 </script>
@@ -384,6 +402,21 @@ export default {
       background: rgb(241, 243, 244);
       border: none;
     }
+    /deep/ .ivu-select-item{
+      width: 200px;
+      overflow: hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+    }
+    /deep/ .ivu-select-selection .ivu-select-selected-value{
+      width: 200px;
+    }
+    /deep/ .ivu-select-selection{
+      &>div{
+        display: flex;
+        align-items: center;
+      }
+    }
     /deep/ .ivu-input-number-handler-wrap{
       border:none;
       background: none;

+ 0 - 414
src/pages/print/app-rem.vue

@@ -1,414 +0,0 @@
-<template>
-  <div id="app">
-    <div class="left">
-      test
-    </div>
-    <div>
-      <div class="right">
-        <div>
-          <span>打印</span>
-          <div>2张纸</div>
-        </div>
-        <div>
-          <span>目标打印机</span>
-          <div>
-            <Select
-              v-model="model"
-              prefix="md-print"
-            >
-              <Option
-                v-for="item in List"
-                :key="item.value"
-                :value="item.value"
-              >
-                {{ item.label }}
-              </Option>
-            </Select>
-          </div>
-        </div>
-        <div>
-          <span>页面</span>
-          <div>
-            <Select
-              v-model="model"
-            >
-              <Option
-                v-for="item in List"
-                :key="item.value"
-                :value="item.value"
-              >
-                {{ item.label }}
-              </Option>
-            </Select>
-          </div>
-        </div>
-        <div>
-          <span>份数</span>
-          <div>
-            <InputNumber
-              v-model="model1"
-              :max="10"
-              :min="1"
-            />
-          </div>
-        </div>
-        <div>
-          <span>布局</span>
-          <div>
-            <Select
-              v-model="model"
-            >
-              <Option
-                v-for="item in List"
-                :key="item.value"
-                :value="item.value"
-              >
-                {{ item.label }}
-              </Option>
-            </Select>
-          </div>
-        </div>
-        <div>
-          <!--  -->
-          <Collapse simple>
-            <Panel hide-arrow>
-              更多设置
-              <Icon type="ios-arrow-forward" />
-              <template #content>
-                <div>
-                  <span>纸质尺寸</span>
-                  <div>
-                    <Select
-                      v-model="model"
-                    >
-                      <Option
-                        v-for="item in List"
-                        :key="item.value"
-                        :value="item.value"
-                      >
-                        {{ item.label }}
-                      </Option>
-                    </Select>
-                  </div>
-                </div>
-                <div>
-                  <span>每个工作表的页数</span>
-                  <div>
-                    <Select
-                      v-model="model"
-                    >
-                      <Option
-                        v-for="item in List"
-                        :key="item.value"
-                        :value="item.value"
-                      >
-                        {{ item.label }}
-                      </Option>
-                    </Select>
-                  </div>
-                </div>
-                <div>
-                  <span>边距</span>
-                  <div>
-                    <Select
-                      v-model="model"
-                    >
-                      <Option
-                        v-for="item in List"
-                        :key="item.value"
-                        :value="item.value"
-                      >
-                        {{ item.label }}
-                      </Option>
-                    </Select>
-                  </div>
-                </div>
-                <div>
-                  <span>打印质量</span>
-                  <div>
-                    <Select
-                      v-model="model"
-                    >
-                      <Option
-                        v-for="item in List"
-                        :key="item.value"
-                        :value="item.value"
-                      >
-                        {{ item.label }}
-                      </Option>
-                    </Select>
-                  </div>
-                </div>
-                <div>
-                  <span>缩放</span>
-                  <div>
-                    <Select
-                      v-model="model"
-                    >
-                      <Option
-                        v-for="item in List"
-                        :key="item.value"
-                        :value="item.value"
-                      >
-                        {{ item.label }}
-                      </Option>
-                    </Select>
-                  </div>
-                </div>
-                <div class="resetStyle">
-                  <span>选项</span>
-                  <div>
-                    <CheckboxGroup
-                      v-model="checkAllGroup"
-                    >
-                      <Checkbox label="双面打印" />
-                      <Checkbox label="页面页脚" />
-                      <Checkbox label="背景图形" />
-                    </CheckboxGroup>
-                  </div>
-                </div>
-                <div>
-                  使用系统对话框进行打印...(Ctrl+Shift+P)
-                  <Icon type="md-share-alt" />
-                </div>
-              </template>
-            </Panel>
-          </Collapse>
-        </div>
-      </div>
-      <div class="right-bottom">
-        <Button type="primary">
-          打印
-        </Button>
-        <Button @click="close">
-          取消
-        </Button>
-      </div>
-    </div>
-  </div>
-</template>
-<script>
-export default {
-  data() {
-    return {
-      model: 'test',
-      model1: 1,
-      checkAllGroup: [],
-      List: [
-        {
-          value: 'test',
-          label: 'test'
-        }
-      ]
-    }
-  },
-  methods: {
-    close() {
-      const electron = window.$electron || null
-      console.log(electron)
-      if (electron) {
-        electron.ipcRenderer.send('closePrint', false)
-      }
-    }
-  }
-}
-</script>
-<style lang="less" scoped>
-#app {
-  font-family: Avenir, Helvetica, Arial, sans-serif;
-  text-align: center;
-  margin: 0;
-  padding: 0;
-  overflow: hidden;
-  display: flex;
-  font-size: 0.15rem;
-  color: black;
-  .left{
-    width: 5.6rem;
-    background: rgb(218, 220, 224);
-    overflow: auto;
-  }
-  .right{
-    width: 4.1rem;
-    height: 7rem;
-    padding-top: 0.2rem;
-    overflow-y:overlay;
-    // 修改图标
-    /deep/ .ivu-icon-ios-arrow-up:before{
-      content:"\f343";
-      font-size: 0.17rem;
-    }
-    /deep/ .ivu-icon-ios-arrow-down:before {
-      content: "\f33d";
-      font-size:  0.17rem;
-    }
-    /deep/ .ivu-input-number-input,
-    /deep/ .ivu-input-number,
-    /deep/ .ivu-select-selection{
-      background: rgb(241, 243, 244);
-      border: none;
-    }
-    /deep/ .ivu-input-number-handler-wrap{
-      width: 0.22rem;
-      border:none;
-      background: none;
-      &>a{
-        border: none;
-      }
-      .ivu-input-number-handler{
-        height: 0.16rem;
-      }
-      .ivu-input-number-handler-down-inner,
-      .ivu-input-number-handler-up-inner{
-        width: 0.12rem;
-        height: 0.12rem;
-        line-height: 0.12rem;
-        font-size: 0.14rem;
-        right: 0.05rem;
-      }
-    }
-    /deep/ .ivu-icon-md-print:before {
-      font-size: 0.2rem;
-    }
-
-    /deep/ .ivu-select-single .ivu-select-selection .ivu-select-placeholder,
-    /deep/ .ivu-select-single .ivu-select-selection .ivu-select-selected-value{
-      height: 0.3rem;
-      line-height: 0.3rem;
-      font-size: 0.14rem;
-    }
-    /deep/ .ivu-select-single .ivu-select-selection{
-      height: 0.32rem;
-    }
-    /deep/ .ivu-select-item{
-      padding: 0.07rem 0.16rem;
-      clear: both;
-      color: #515a6e;
-      font-size: 0.14rem!important;
-    }
-    /deep/ .ivu-checkbox-wrapper{
-      font-size: 0.14rem;
-      margin-right: 0.08rem;
-    }
-    /deep/ .ivu-checkbox-inner{
-      width: 0.16rem;
-      height: 0.16rem;
-      border-radius: 0.02rem;
-      border: 0.01rem solid #dcdee2;
-    }
-    /deep/ .ivu-checkbox-checked .ivu-checkbox-inner:after{
-      width: 0.04rem;
-      height: 0.08rem;
-      top: 0.02rem;
-      left: 0.05rem;
-    }
-    /deep/ .ivu-input-number-input-wrap{
-      height: 0.32rem;
-    }
-    /deep/ .ivu-input-number-input{
-      height: 0.32rem;
-      line-height: 0.32rem;
-      padding: 0 0.07rem;
-      border-radius: 0.04rem;
-    }
-    /deep/ .ivu-input-number{
-      font-size: 0.14rem;
-      width: 0.8rem;
-      height: 0.32rem;
-      line-height: 0.32rem;
-      border-radius: 0.04rem;
-    }
-    /deep/ .ivu-collapse{
-      border-bottom: none;
-      .ivu-collapse-header{
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        padding: 0.2rem 0.15rem 0.2rem 0.2rem;
-        height: auto;
-        line-height: normal;
-      }
-      .ivu-collapse-header:hover{
-        background: rgba(232, 233, 233, 1);
-      }
-      .ivu-collapse-content{
-        padding: 0;
-      }
-      .ivu-collapse-content-box>div{
-        display: flex;
-        align-items: center;
-        margin-top: 0.2rem;
-        text-align: left;
-        padding: 0 0.2rem;
-        &>span:first-child{
-          display: inline-block;
-          width: 1.5rem;
-        }
-        &>div:last-child{
-          flex: 1;
-        }
-        &:last-child{
-          font-size: 0.13rem;
-          justify-content: space-between;
-          margin-top: 0.4rem;
-          cursor: pointer;
-        }
-        .ivu-checkbox-group-item{
-          display: block;
-          margin-bottom: 0.2rem;
-        }
-      }
-      .ivu-collapse-content-box .resetStyle{
-        align-items: flex-start;
-      }
-    }
-    &>div:first-child span:first-child{
-      font-size: 0.16rem;
-    }
-    &>div:first-child > div:last-child{
-      text-align: right;
-      font-size: 0.14rem;
-    }
-    &>div:not(:last-child){
-      display: flex;
-      align-items: center;
-      margin-bottom: 0.2rem;
-      text-align: left;
-      padding: 0 0.2rem;
-      &>span:first-child{
-        display: inline-block;
-        width: 1.5rem;
-      }
-      &>div:last-child{
-        flex: 1;
-      }
-    }
-  }
-  .right-bottom{
-    height: 0.6rem;
-    display: flex;
-    align-items: center;
-    padding: 0 0.2rem;
-    justify-content: flex-end;
-    &>button:last-child{
-      margin-left: 0.1rem;
-    }
-    /deep/ .ivu-btn{
-      height: 0.32rem;
-      padding: 0 0.15rem;
-      font-size: 0.14rem;
-      border-radius: 0.04rem;
-    }
-  }
-}
-</style>
-<style>
-html,
-body {
-  padding: 0;
-  margin: 0;
-  user-select: none;
-  overflow: hidden;
-}
-/*  */
-</style>

+ 11 - 11
yarn.lock

@@ -509,7 +509,7 @@
     "@electron-forge/template-base" "6.0.0-beta.63"
     fs-extra "^10.0.0"
 
-"@electron/get@^1.13.0", "@electron/get@^1.6.0", "@electron/get@^1.9.0":
+"@electron/get@^1.14.1", "@electron/get@^1.6.0", "@electron/get@^1.9.0":
   version "1.14.1"
   resolved "https://registry.npmmirror.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40"
   integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==
@@ -736,10 +736,10 @@
   resolved "https://registry.npmmirror.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da"
   integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==
 
-"@types/node@^14.6.2":
-  version "14.18.12"
-  resolved "https://registry.npmmirror.com/@types/node/-/node-14.18.12.tgz#0d4557fd3b94497d793efd4e7d92df2f83b4ef24"
-  integrity sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==
+"@types/node@^16.11.26":
+  version "16.11.41"
+  resolved "https://registry.npmmirror.com/@types/node/-/node-16.11.41.tgz#88eb485b1bfdb4c224d878b7832239536aa2f813"
+  integrity sha512-mqoYK2TnVjdkGk8qXAVGc/x9nSaTpSrFaGFm43BUH3IdoBV0nta6hYaGmdOvIMlbHJbUEVen3gvwpwovAZKNdQ==
 
 "@types/responselike@*", "@types/responselike@^1.0.0":
   version "1.0.0"
@@ -1687,13 +1687,13 @@ electron-to-chromium@^1.4.84:
   resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz#abfe376a4d70fa1e1b4b353b95df5d6dfd05da3a"
   integrity sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==
 
-electron@^17.2.0:
-  version "17.3.1"
-  resolved "https://registry.npmmirror.com/electron/-/electron-17.3.1.tgz#083b6bd034eb1ee7d75378316d6460348eb62605"
-  integrity sha512-C5E3uvXo1cmI+xYtbiMCW8AAGhBL0HbLA6cqD7FJmBoPtY88W/3A/km5z8oPGORyBNgSe7tSoHx4a6jWJIR+og==
+electron@^19.0.4:
+  version "19.0.4"
+  resolved "https://registry.npmmirror.com/electron/-/electron-19.0.4.tgz#a88d5e542868c4abd7704228ec62c553605605a0"
+  integrity sha512-roRYr1VNAWIhjD9n8qZdmhROtrzsFpuZEXrjWAw+GqPbZlrUInmvFCviRDC2Lt+VBsTNRpTfPpfzXSlLL4reEw==
   dependencies:
-    "@electron/get" "^1.13.0"
-    "@types/node" "^14.6.2"
+    "@electron/get" "^1.14.1"
+    "@types/node" "^16.11.26"
     extract-zip "^1.0.3"
 
 element-resize-detector@^1.2.0: