electron 连接打印机打印pdf文件

news/2024/11/8 22:42:28/

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

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

 选择

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


http://www.ppmy.cn/news/484322.html

相关文章

保证水库大坝安全需要做好哪方面的监测

水库安全监测是保证水库大坝安全的重要手段是确保水库大坝安全运行的基础也是做好水库安全管理的重要技术保障。根据《水库大坝安全管理条例》《水库大坝安全监测技术规范》等有关规定,对坝体变形、渗透、应力应变等进行监测,以掌握坝体、坝基和库岸的运…

三网话费充值优惠接口API分享

话费充值接口文档 接口版本:1.0 ―、引言 文档概述 本文档提供话费充值接口规范说明,提供一整套的完整的接入示例(http 接口)供商户参 考,可以帮助商户开发人员快速完成接口开发与联调,实现与话费充值系统的交易互联。 公司官网…

【Flutter——复选框实例代码超详细讲解!】

Flutter——复选框实例代码超详细讲解! 文章目录 Flutter——复选框实例代码超详细讲解!代码实现效果代码实例代码结构总结 代码实现效果 代码实例 import package:flutter/material.dart; // 导入 Flutter 的核心库void main() {runApp(const MyApp())…

.Net6 WebAPI 手动开启gRPC服务

文章目录 .Net6 WebAPI 手动开启gRPC服务引用包开启服务配置gRPC通道完整代码 总结新建一个Service.cs类,继承自生成的类后,重写处理方法(如果没有生成就先编译一下工程文件)必须重写proto中定义的所有方法 .Net6 WebAPI 手动开启…

Linux基础服务1——Openssh

文章目录 一、基本简介二、登录示例2.1 当前用户登录2.2 指定用户登录 三、ssh主机密钥四、ssh免密登录五、服务端配置文件5.1 连接端口号5.2 限制只能使用普通用户登录5.3 密钥登录 六、SSH安全注意事项 一、基本简介 常见远程登录工具: telnet,认证明文…

汇川MD500主控板资料

原理图PCB图BOM 欢迎大家一起学习 链接:https://pan.baidu.com/s/1jSUonZusru8LUz10O0QEdQ?pwdgeid 提取码:geid

如何查看自己的分区是固态还是机械

第一步 点击管理 第二步 点击磁盘管理 第三步 查看自己之前的分区 ps:因为一般系统是装在固态的,所以和系统一起的就是装在固态里,其余的就是装在机械盘里了。(有其他情况除外)

数据库服务器到底是用机械硬盘还是固态硬盘

数据库服务器到底是用机械硬盘还是固态硬盘 答案是:固态硬盘 //1.固态硬盘已经便宜了//2.做了RAID5,之后有了数据安全保障,不放心的话 就做RAID1,更何况现在都是数据库集群,所以不担心数据丢失的问题了//3.固态硬盘…