electron 连接打印机打印pdf文件

news2024/11/24 7:26:11

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

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

 选择

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/668611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32开发环境搭建Windows VSCode集成Espressif IDF插件ESP32_IDF_V5.0开发编译环境搭建

一、安装ESP32-IDF库 下载网址:https://dl.espressif.com/dl/esp-idf/ 打开上面的网页,选择单击页面中 ESP32-IDF v5.0.2 - Offine Installer,5.0.2是当前最新版本,如果没有ESP32-IDF v5.0.2 - Offine Installer,说明…

JS获取省市区/县,layui获取省市区,layui实现省市区联动,jquery实现省市区联动

前言 通过JS方式获取省市区数据,可自己手动更改JS文件数据 非常简单 效果 实现 百度网盘链接: https://pan.baidu.com/s/1RktJgXY0NP7Eq0ohvBPOEA 提取码: 477z gitee下载链接:https://gitee.com/yuanyongqiang/common-files/blob/master/area.js 下…

超高压系列IXBX50N360HV、IXBT14N300HV、IXBH32N300高压反向导通 (BiMOSFET™) IGBT器件

器件介绍: 超高压系列3000V - 3600V反向导通 (BiMOSFET™) IGBT将MOSFET和IGBT的优势相结合。这些高压器件的饱和电压和内置二极管的正向电压降均具有正电压温度系数,因此非常适合用于并联运行。“自由”内置体二极管用作保护二极管,为器件关…

LibOS Gramine安装

文章目录 参考资料Gramine安装运行helloworld升级kernel到5.15 参考资料 Gramine Quick start Gramine安装 Gramine安装要求: Linux 内核版本至少为 5.11(启用 SGX 驱动程序) 如果是5.4.0-150-generic版本,则可以参考《Install …

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像写入相机内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像写入相机内存(C#) Baumer工业相机Baumer工业相机BGAPISDK和相机内存的技术背景Baumer工业相机通过BGAPISDK将相机图像写入相机内存功能1.引用合适的类文件2.通过BGAPISDK将相机图像写入相机内存功能…

ADManager Plus:提升企业管理效率的强大利器

导语: 在当今数字化时代,企业管理的重要性不言而喻。有效的企业管理可以提高生产力、优化业务流程,并促进组织的持续增长。而ADManager Plus作为一款功能强大的企业管理工具,为企业提供了全面的解决方案,帮助企业管理…

从0到1精通自动化测试,pytest自动化测试框架,Fixture之conftest.py与yield实现teardown(四)

目录 一、Fixture之conftest.py 1、Fixture优势 2、fixture参数传入(scope”function”) 3、conftest.py配置 二、Fixture之yield实现teardown 1、scope“module” 2、yield执行teardown 3、yield遇到异常 4、addfinalizer终结函数 一、Fixture…

【云原生•监控】基于Prometheus的云原生集群监控(理论+实践)-01

【云原生•监控】基于Prometheus的云原生集群监控(理论实践)-01 前言 「笔者已经在公有云上搭建了一套临时环境,可以先登录体验下:」 http://124.222.45.207:17000/login 账号:root/root.2020 云原生监控挑战 Prometheus 是用 Go 语言编写&am…

FreeRTOS实时操作系统(四)中断任务管理

系列文章目录 文章目录 系列文章目录前言中断优先级FreeRTOS中的中断管理一系列中断管理寄存器中断配置寄存器中断屏蔽寄存器 中断管理实战 前言 跟着正点原子学习一下中断管理,正好之间没有总结过,还有些地方不清楚。 中断优先级 中断的工作方式就不介…

Oracle的DCL、DDL、DML语言学习使用——oracle入门学习(一)

Oracle的DCL、DDL、DML语言学习使用 前言1.SQL Plus1.1 命令行SQL PLUS使用sqlplus /nologsqlplus / as sysdba 1.2 oracle自带SQL PLUS使用1.3 sys和system用户的区别 2. Oracle的体系结构3.DCL语言什么是DCL语言3.1 查看数据文件位置和表空间3.2 创建表空间3.3 删除表空间3.4…

鉴源实验室丨TBOX通讯模组AT指令测试

作者 | 李伟 上海控安安全测评部总监 来源 | 鉴源实验室 引言:上一篇文章我们讲了整车的OTA升级测试(详解车载设备FOTA测试),本篇我们介绍在车载零配件上比较少见却很实用的测试:通讯模组的AT(Attention)指…

总结Nginx的安装、配置与设置开机自启

在Ubuntu下安装Nginx有以下方法,但是如果想要安装最新版本的就必须下载源码包编译安装。 一、Nginx安装 1、基于APT源安装 sudo apt-get install nginx 安装好的文件位置: /usr/sbin/nginx:主程序 /etc/nginx:存放配置文件 /us…

高压放大器可以驱动电机吗

高压放大器可以驱动电机。事实上,高压放大器在许多应用中都是电机控制的核心部件之一。高压放大器可以将输入信号转换为高电压和高电流,从而驱动电动机。 一、高压放大器的原理 高压放大器是一种电子设备,用于将低功率信号转换为高功率信号。…

云原生之深入解析如何在Kubernetes下快速构建企业级云原生日志系统

一、概述 ELK 是三个开源软件的缩写,分别表示 Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个 FileBeat,它是一个轻量级的日志收集处理工具 (Agent),Filebeat 占用资源少,适合于在各个服务器上搜集日志后传输…

Lombok你不知道的用法

Lombok是大家经常用的一款工具,它可以帮我们减少很多重复代码的书写,但是我们对它的使用,可能更多局限于实体类的编写,比如说通过Data注解实现减少getter/setter/toString等方法的编写,其实它还有更多的注解功能&#…

美依礼芽破圈!小红书数据解读,如何拨动二次元心弦?

今年,二次元存在感爆棚。新世代下二次元群体愈发壮大,不少博主发布二次元内容、品牌也试图融入二次元圈。那么,如何与之打成一片呢?今天,通过小红书数据,我们来解读二次元的内容方向。 点赞破8亿&#xff0…

【每日一题】1595. 连通两组点的最小成本

【每日一题】1595. 连通两组点的最小成本 1595. 连通两组点的最小成本题目描述解题思路 1595. 连通两组点的最小成本 题目描述 给你两组点,其中第一组中有 size1 个点,第二组中有 size2 个点,且 size1 > size2 。 任意两点间的连接成本…

对象的构造

问题 对象中成员变量的初始值是多少&#xff1f; 成员变量的初始值 #include <stdio.h>class Test { private:int i;int j; public:int getI() { return i; }int getJ() { return j; } };Test gt;int main() {printf("gt.i %d\n", gt.getI());printf("…

UE中使用Editor Utility Widget创建编辑器工具

在UE中可以使用EditorUtilityWidget创建编辑器面板工具&#xff0c;方便平时的开发。在UE4中使用编辑器UI需要开启对应插件&#xff0c;而UE5中则默认启用&#xff0c;下面就来学习一下。 1.UI创建 1.1.在Content Browser中右键&#xff0c;找到Editor Utilities即可创建编辑…

[MySQL]不允许你不会SQL语句之查询语句

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…