electron+react調(diào)用打印機(jī)進(jìn)行打印

原創(chuàng)文章番挺,轉(zhuǎn)載請注明出處

  • 首先主進(jìn)程獲取打印機(jī)列表傳遞給渲染進(jìn)程
  • 其次渲染進(jìn)程展示打印機(jī)列表,并選擇打印機(jī)
  • 選擇完打印機(jī)后,執(zhí)行打印箱季,或多個打印

獲取打印機(jī)列表(渲染進(jìn)程)

        try {
            ipcRenderer.send('getPrinterList')
            ipcRenderer.on('printerList', function (e, data) {
                if (data.length <= 0) {
                    Message.error('打印服務(wù)異常,請嘗試重啟電腦')
                    return;
                }
                if (localStorage.getItem('printName')) {
                    for (let i = 0; i < data.length; i++) {
                        const element = data[i];
                        if (element.name == localStorage.getItem('printName')) {
                            that.setState({
                                printIndex: i
                            })
                        }
                    }
                }
                that.setState({
                    printList: data
                })
            })
        } catch (error) {
             console.log(error)
        }

獲取打印機(jī)列表(主進(jìn)程)

// 在主線程下,通過ipcMain對象監(jiān)聽渲染線程傳過來的getPrinterList事件棍掐,返回打印機(jī)列表 
  // 需要注意 electron 版本是3.0.0
  ipcMain.on('getPrinterList', (event) => {
    //主線程獲取打印機(jī)列表
    const list = mainWindow.webContents.getPrinters();
    //通過webContents發(fā)送事件到渲染線程藏雏,同時將打印機(jī)列表也傳過去
    event.sender.send('printerList', list);
  });

調(diào)用打印機(jī)打印

  <span className="Y-cursor-pointer Y-margin-horizontal-right-15" onClick={this.onPrint.bind(this, record)}>打印條碼</span>

  // 調(diào)用打印機(jī)打印
    onPrint(record) {
        let that = this
        // if (!localStorage.getItem('printName') && !this.state.printName) {
        //     Message.error('請先設(shè)置打印機(jī)')
        //     return;
        // }

        httpUrl('GET', host + 'api/business/web/order/print-order-detail?partsOrderKid=' + record.partsOrderKid, null, '', res => {
            if (res) {
                res.packageCount = record.partsCount
                res.printName = localStorage.getItem('printName') || this.state.printName
                try {
                    if (res.packageCount >= 1) {
                        for (let i = 0; i < res.packageCount; i++) {
                            res.packageCountPre = i + 1;
                            // ipcRenderer.send('print', res)  // 異步
                            // 同步打印,一張一張打印作煌,創(chuàng)建一個任務(wù)
                            const replay = ipcRenderer.send('print', res)
                            // console.log(replay)
                            if (replay) {
                                continue;
                            }
                        }
                        let kids = [record.partsOrderKid]
                        httpUrl('PUT', host + 'order/web/admin/update-parts-order-print', { kids }, '', res => {
                            Message.success('打印成功')
                            that.partsBusinessOrderList()
                        })
                    }
                } catch (error) {
                    if (error) {
                        Message.error('暫不支持打印')
                    }
                }
            }
        })
    }

主進(jìn)程執(zhí)行打印

// 監(jiān)聽渲染進(jìn)程打印按鈕點(diǎn)擊
  ipcMain.on('print', (event, args) => {
    print(event, args)
  })

// 打印 通過webContent
function print(event, args) {
  let win = new BrowserWindow({
    show: false
  }) // 新建窗口不打開掘殴,實(shí)現(xiàn)靜默打印
  // win.openDevTools() //打開調(diào)試
  var url = 'print.html'
  for (const key in args) {
    // console.log('key:' + key + ',val:' + args[key])
    if (url.indexOf('?') <= 0) {
      url += '?' + key + '=' + args[key]
    } else {
      url += '&' + key + '=' + args[key]
    }
  }
  win.loadURL(path.join(__dirname, url)) // 加載print頁面并將參數(shù)傳入
  win.webContents.on('did-finish-load', () => { // 頁面加載完畢執(zhí)行打印操作
    // if (args.packageCountPre == args.packageCount) {
    //   event.sender.send('printResult', true)
    // }
    // 執(zhí)行打印 靜默打印赚瘦,傳入打印機(jī)名稱
    win.webContents.print({
      silent: true,
      deviceName: args.deviceName, //'KM-118'
    }, function (success, errorType) {
      if (errorType) throw errorType
      // console.log('success:' + success)
      // console.log('errorType:' + errorType)
      event.returnValue = success // 同步打印 將打印結(jié)果返回給渲染進(jìn)程
      if(args.packageCountPre == args.packageCount){
        win.close(); // 打印完成 關(guān)閉窗口
      }
    })
  })
}

創(chuàng)建多個任務(wù)進(jìn)行打印

<div style={{ background: '#3080fe', border: '1px solid #3080fe', color: '#ffffff' }} className="Y-cursor-pointer Y-padding-vertical-both-8 Y-padding-horizontal-both-20" onClick={this.morePrint.bind(this)}> 批量打印</div>

    // 創(chuàng)建多個任務(wù)
    morePrint() {
        // console.log(this.state.addData)
        let data = this.state.addData
        let j = 1;
        let arr = []
        for (let i = 0; i < data.length; i++) {
            const item = data[i];
            // onPrint
            // var res = await axios.post('')
            this.axiosGet(item).then((valid) => {
                if (valid) {
                    console.log('同步執(zhí)行完畢');
                    j++;
                }
            })
            arr.push(item.partsOrderKid)
            if (j = data.length) {
                let kids = arr
                httpUrl('PUT', host + 'order/web/admin/update-parts-order-print', { kids }, '', res => {
                    Message.success('打印成功')
                    that.partsBusinessOrderList()
                })
            }
        }
    }
    axiosGet(record) {
        let headers = {
            'Content-Type': 'application/json;charset=UTF-8',
            'Authorization': localStorage.getItem("token")
        }
        return axios({
            method: 'GET',
            headers: headers,
            url: host + 'order/business/print-order-detail?partsOrderKid=' + record.partsOrderKid,
            data: null,
        }).then(ret => {
            // console.log(ret)
            let flag = false
            let res = ret.data.data.data
            if (res) {
                res.packageCount = record.partsCount
                res.printName = localStorage.getItem('printName') || this.state.printName
                // console.log(res)
                try {
                    if (res.packageCount >= 1) {
                        for (let i = 0; i < res.packageCount; i++) {
                            res.packageCountPre = i + 1;
                            // ipcRenderer.send('print', res)  // 異步
                            const replay = ipcRenderer.send('print', res)
                            flag = replay;
                            // console.log(replay)
                            if (replay && res.packageCountPre < res.packageCount) {
                                flag = false;
                                continue;
                            }
                        }
                    }
                } catch (error) {
                    if (error) {
                        Message.error('暫不支持打印')
                    }
                }
                if (res.packageCountPre == res.packageCount && flag) {
                    return true;
                }
            }
        })
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奏寨,隨后出現(xiàn)的幾起案子起意,更是在濱河造成了極大的恐慌,老刑警劉巖病瞳,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揽咕,死亡現(xiàn)場離奇詭異,居然都是意外死亡套菜,警方通過查閱死者的電腦和手機(jī)心褐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笼踩,“玉大人逗爹,你說我怎么就攤上這事『坑冢” “怎么了掘而?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長于购。 經(jīng)常有香客問我袍睡,道長,這世上最難降的妖魔是什么肋僧? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任斑胜,我火速辦了婚禮,結(jié)果婚禮上嫌吠,老公的妹妹穿的比我還像新娘止潘。我一直安慰自己,他們只是感情好辫诅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布凭戴。 她就那樣靜靜地躺著,像睡著了一般炕矮。 火紅的嫁衣襯著肌膚如雪么夫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天肤视,我揣著相機(jī)與錄音档痪,去河邊找鬼。 笑死邢滑,一個胖子當(dāng)著我的面吹牛腐螟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遭垛,長吁一口氣:“原來是場噩夢啊……” “哼尼桶!你這毒婦竟也來了操灿?” 一聲冷哼從身側(cè)響起锯仪,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趾盐,沒想到半個月后庶喜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡救鲤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年久窟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片本缠。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡斥扛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丹锹,到底是詐尸還是另有隱情稀颁,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布楣黍,位于F島的核電站匾灶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏租漂。R本人自食惡果不足惜阶女,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哩治。 院中可真熱鬧秃踩,春花似錦、人聲如沸业筏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驾孔。三九已至芍秆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翠勉,已是汗流浹背妖啥。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留对碌,地道東北人荆虱。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怀读。 傳聞我的和親對象是個殘疾皇子诉位,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354