electron 打印内容
区分系统
- 类似unix系统的使用 npm包:unix-print
- window系统使用: pdf-to-printer
运行线程
视图线程
函数参数
两个包都提供了print函数来打印文件,配置基本一致,只是参数形式有所不同,pdf-to-printer的相对来简洁明了了一点,两个函数都会返回promise对象
unix-print的配置餐叙需要 -n或者-o 这样开头来传递配置参数
pdf-to-printer 的print函数,接受2个参数
- 第一个是文件的绝对路径
- 第二个是个json
{
copies:1//一份文件打印的文件章数,
paperSize:”A4”//A2, A3, A4, A5, A6,纸张大小
side:”simplex”//duplex, duplexshort, duplexlong, and simplex,我们选择单面打印
//其他属性…………
}
unix-print 的print函数,接受3个参数
- 第一个是文件的绝对路径
- 第二个printer对象,指向特定的打印机,如果不需要传递空值undefined
- 第三个对象是数组,接受配置信息,
参考:https://www.computerhope.com/unix/ulp.htm#co
[
`-n 1`,//一份文件打印一次
`-o media=A4`,//纸张大小
'-o sides=one-sided’,//选择单面
//其他配置信息…………
]
视图线程打印文件
首先需要根据process.platform来区分window系统和Mac系统
import { print as PrintMac } from 'unix-print'
import { print as PrintWin} from 'pdf-to-printer'
const getSys=()=>{
if(process.platform == 'darwin'){
console.log('这是mac系统');
return “Mac”
}
if(process.platform == 'win32'){
console.log('这是windows系统');
return “win”
}
if(process.platform == 'linux'){
console.log('这是linux系统');
return “Mac”
}
return;
}
Const sys=getSys();
const printer=(event,{path})=>{
if(sys==‘Mac’){
PrintMac(path, undefined, [
`-n 1`,
`-o media=A4`,
'-o sides=one-sided',
])
}
else if(sys==‘win){
PrintWin(path, {
copies:1,
paperSize:’A4’,
side: 'simplex',
})
}
}
下载文件到本地
打印需要本地文件路径,所以需要提前下载到本地,这部分比较耗费时间,所以在非视图线程执行,不卡顿页面
例如
const { BrowserWindow,app } = require('electron')
const win = new BrowserWindow({ width: 800, height: 600 })
win.loadURL(‘我们的网页http路径’)
const session = win.webContents.session
session.downloadURL(”网络地址“)
const downloadPath = path.join(
app.getPath('downloads'),
‘printFile,
`文件名字.pdf`
)
session.once('will-download', (event, item, webContents) => {
item.setSavePath(downloadPath);//存放图片的地址
item.once('done', (event, state) => {
if (state === 'completed') {
//给视图线程发送数据,视图线程收到数据后,触发上面的打印函数
win.webContents.send('download-sucss’,{path:downloadPath})
}
})
})
}
视图线程
import { ipcRenderer } from 'electron'
useEffect(() => {
ipcRenderer.on('download-sucss’, printer)
return () => {
ipcRenderer.off('download-sucss’', printer)
}
}, [])
获取电脑连接的打印机数量
如果没插上打印机的usb接口,或者打印机关机了,那就拿到空数组
我们好像忘记了,重要东西,打印东西首先得有连接打印机!!!
那如何判断有没有连接有打印机呢,在非视图线程执行一下函数可以读取连接的打印机信息,返回的是个数组
视图线程发起查看连接打印机的数量
import { ipcRenderer } from 'electron'
ipcRenderer.invoke('getPrintDeviceList')
非视图线程收到请求后,开始在后台运行,得到数量后,再通过事件printers发送给视图线程
import { ipcMain,} from 'electron'
//这里的win是个视图窗口对象
//省略部分代码........
ipcMain.on('getPrintDeviceList', (event) => {
win.webContents.contents.getPrintersAsync().then(res=>{
//通知视图线程当前连接的打印机数量,res是数组
win.webContents.send('printers', res)
})
)
参考地址:webContents | Electron
macbook调试有没有触发打印机打印任务
打开聚焦搜索,输入打印机
选择
如果有打印任务,就会看到一个或者多个这里的进度条