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.sessionsession.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调试有没有触发打印机打印任务
打开聚焦搜索,输入打印机
选择
如果有打印任务,就会看到一个或者多个这里的进度条