electron 连接打印机打印pdf文件

electron 打印内容

区分系统

  • 类似unix系统的使用 npm包:unix-print
  • window系统使用: pdf-to-printer


运行线程

视图线程

函数参数

   两个包都提供了print函数来打印文件,配置基本一致,只是参数形式有所不同,pdf-to-printer的相对来简洁明了了一点,两个函数都会返回promise对象

unix-print的配置餐叙需要 -n或者-o 这样开头来传递配置参数

pdf-to-printer 的print函数,接受2个参数

  1. 第一个是文件的绝对路径
  2. 第二个是个json
{
     copies:1//一份文件打印的文件章数,

      paperSize:”A4”//A2, A3, A4, A5, A6,纸张大小

       side:”simplex”//duplex, duplexshort, duplexlong, and simplex,我们选择单面打印

//其他属性…………
}

unix-print 的print函数,接受3个参数

  1. 第一个是文件的绝对路径
  2. 第二个printer对象,指向特定的打印机,如果不需要传递空值undefined
  3. 第三个对象是数组,接受配置信息,

参考: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调试有没有触发打印机打印任务

打开聚焦搜索,输入打印机

 选择

如果有打印任务,就会看到一个或者多个这里的进度条

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>