Electron實(shí)現(xiàn)靜默打印小票的流程詳解
Electron實(shí)現(xiàn)靜默打印小票
靜默打印流程

1.渲染進(jìn)程通知主進(jìn)程打印
//渲染進(jìn)程 data是打印需要的數(shù)據(jù)
window.electron.ipcRenderer.send('handlePrint', data)
2.主進(jìn)程接收消息,創(chuàng)建打印頁面
//main.ts
/* 打印頁面 */
let printWindow: BrowserWindow | undefined
/**
* @Author: yaoyaolei
* @Date: 2024-06-07 09:27:22
* @LastEditors: yaoyaolei
* @description: 創(chuàng)建打印頁面
*/
const createPrintWindow = () => {
return new Promise<void>((resolve) => {
printWindow = new BrowserWindow({
...BASE_WINDOW_CONFIG,
title: 'printWindow',
webPreferences: {
preload: join(__dirname, '../preload/index.js'),
sandbox: false,
nodeIntegration: true,
contextIsolation: false
}
})
printWindow.on('ready-to-show', () => {
//打印頁面創(chuàng)建完成后不需要顯示,測試時(shí)可以調(diào)用show查看頁面樣式(下面有我處理的樣式圖片)
// printWindow?.show()
resolve()
})
printWindow.webContents.setWindowOpenHandler((details: { url: string }) => {
shell.openExternal(details.url)
return { action: 'deny' }
})
if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
printWindow.loadURL(`${process.env['ELECTRON_RENDERER_URL']}/print.html`)
} else {
printWindow.loadFile(join(__dirname, `../renderer/print.html`))
}
})
}
ipcMain.on('handlePrint', (_, obj) => {
//主進(jìn)程接受渲染進(jìn)程消息,向打印頁面?zhèn)鬟f數(shù)據(jù)
if (printWindow) {
printWindow!.webContents.send('data', obj)
} else {
createPrintWindow().then(() => {
printWindow!.webContents.send('data', obj)
})
}
})
3.打印頁面接收消息,拿到數(shù)據(jù)渲染頁面完成后通知主進(jìn)程開始打印
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>打印</title>
<style>
</style>
</head>
<body>
</body>
<script>
window.electron.ipcRenderer.on('data', (_, obj) => {
//這里是接受的消息,處理完成后將html片段放在body里面完成后就可以開始打印了
//樣式可以寫在style里,也可以內(nèi)聯(lián)
console.log('event, data: ', obj);
//這里自由發(fā)揮
document.body.innerHTML = '處理的數(shù)據(jù)'
//通知主進(jìn)程開始打印
window.electron.ipcRenderer.send('startPrint')
})
</script>
</html>
這個(gè)是我處理完的數(shù)據(jù)樣式,這個(gè)就是print.html


4.主進(jìn)程接收消息開始打印,并且通知渲染進(jìn)程打印狀態(tài)
ipcMain.on('startPrint', () => {
printWindow!.webContents.print(
{
silent: true,
margins: { marginType: 'none' }
},
(success) => {
//通知渲染進(jìn)程打印狀態(tài)
if (success) {
mainWindow.webContents.send('printStatus', 'success')
} else {
mainWindow.webContents.send('printStatus', 'error')
}
}
)
})

完畢~
以上就是Electron實(shí)現(xiàn)靜默打印小票的流程詳解的詳細(xì)內(nèi)容,更多關(guān)于Electron靜默打印小票的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vant-ui組件庫中如何修改NavBar導(dǎo)航欄的樣式
這篇文章主要介紹了vant-ui組件庫中如何修改NavBar導(dǎo)航欄的樣式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
vue 登錄滑動(dòng)驗(yàn)證實(shí)現(xiàn)代碼
這篇文章主要介紹了vue 登錄滑動(dòng)驗(yàn)證實(shí)現(xiàn)代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
el-tooltip配合el-button禁用時(shí)顯示提示的問題
這篇文章主要介紹了el-tooltip配合el-button禁用時(shí)顯示提示的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
深入理解vue.js雙向綁定的實(shí)現(xiàn)原理
vue.js是MVVM結(jié)構(gòu)的,同類的還有AngularJs;至于MVC、MVP、MVVM的比較網(wǎng)上已經(jīng)有很多了,這樣不再重復(fù)。這篇文章將給大家深入的介紹vue.js雙向綁定的實(shí)現(xiàn)原理,有需要的朋友們可以參考借鑒,下面跟著小編一起來看看吧。2016-12-12
vue Element UI 解決表格數(shù)據(jù)不更新問題及解決方案
在使用Vue和ElementUI開發(fā)后臺(tái)管理系統(tǒng)時(shí),可能會(huì)遇到表格數(shù)據(jù)不更新的問題,這通常是因?yàn)閂ue的響應(yīng)式系統(tǒng)未檢測到數(shù)據(jù)變化或數(shù)據(jù)更新后未正確觸發(fā)視圖的重新渲染,本文給大家介紹vue Element UI 解決表格數(shù)據(jù)不更新問題,感興趣的朋友一起看看吧2024-10-10
為vue項(xiàng)目自動(dòng)設(shè)置請求狀態(tài)的配置方法
這篇文章主要介紹了vue項(xiàng)目自動(dòng)設(shè)置請求狀態(tài)的配置方法,本文通過示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06

