electron打印大概有两种:
第一种:通过window的webcontent对象,使用此种方式需要单独开出一个打印的窗口,可以将该窗口隐藏,但是通信调用相对复杂。
第二种:使用页面的webview元素调用打印,可以将webview隐藏在调用的页面中,通信方式比较简单。
两个对象调用打印方法的使用方式都一样。
本文是通过第二种方法实现静默打印。
注意: 渲染进程通信需要使用ipcRenderer,页面只能通过require引入ipcRenderer,必须得支持node,如果你的electron版本 > 6.0的话使用webview需要配置webviewTag。我的配置如下
new BrowserWindow({ webPreferences: { // 允许使用node nodeIntegration: true, contextIsolation: false, // 允许使用remote enableRemoteModule: true, // 允许跨域 webSecurity: false, // 允许使用webview webviewTag: true } })
1. 首先获取打印机列表
在需要获取打印机列表的页面请求获取
const { ipcRenderer } = require("electron") // 发送给主进程消息ipcRenderer.send('allPrint') ipcRenderer.once('printName',(event,data)=>{ console.log(data) // data就是返回的打印机数据列表})
主进程 main.js 中2
// 监听渲染进程发送的消息ipcMain.on('allPrint',()=>{ // 获取到打印机列表 const printers = win.webContents.getPrinters() // 把获取的打印机列表发送给渲染进程 win.webContents.send('printName',printers)})
由于我是再page1渲染进程中又打开的子渲染进程page2 (若只有page1渲染进程可以跳过这一步)
// 监听获取打印机列表中发送给page2ipcRenderer.on('printName',(event, data)=>{ page2Win.webContents.send('printName', data)})
2.页面引用webview
<template> <el-button @click="printView">开始打印</el-button> <webview ref="printWebview" :src="url" nodeintegration hidden></template><script> import { defineComponent, reactive, toRefs, onMounted, ref, unref} from "vue" import config from "@/common/lib/config" const { ipcRenderer } = require("electron") export default defineComponent({ setup(){ let data = reactive({ url: process.env.CVE_ENV === 'development' ? config.dev_url.print : config.pro_url.print }) const printWebview = ref(null) onMounted(()=>{ getPrint() }) const printView = () =>{ unref(printWebview).print({ //是否是静默打印 silent: true, printBackground: true, deviceName: '你的获取的打印机列表的打印机名称', }) } //获取打印机列表 const getPrint = () => { ipcRenderer.send('allPrint') ipcRenderer.once('printName',(event,data)=>{ console.log(data) //data就是返回的打印机数据列表 }) } return { ...toRefs(data), printWebview, printView } } })</script>
当然看完上面的你可能不知道webview引入的页面从哪里来,接着往下看
3.配置vite.config.js
export default defineConfig({ // publicDir, resolve: { // 目录别名配置 alias: { "@": path.resolve(__dirname, "src") }, }, build:{ rollupOptions: { // 多页应用配置 input: { main: path.resolve(__dirname, 'index.html'), // 主应用入口 // 这里这个打印页面需要再vite中配置多页面应用 settle: path.resolve(__dirname, 'projects/settle/index.html'), // 结算中心 print: path.resolve(__dirname, 'projects/settle/print.html') // 小票打印页面 }, external: ['electron'], // 告诉 Rollup 不要去打包 electron } }, optimizeDeps: { exclude: ['electron'], // 告诉 Vite 不要转换 electron }, plugins: [ vue({ script: { refSugar: true } }) ]})
然后再你的根目录下创建projects文件夹,再projects文件夹下面创建settle文件夹 settle文件夹下面创建print.html 这个入口文件地址和你vite配置的多页应用入口文件地址对应就行
附上我上面使用webview开发环境和编译后的环境地址
// 开发环境运行地址 dev_url: { print: `http://localhost:${process.env.CVE_PORT || 3000}/projects/settle/print.html`, }, // 生产环境运行地址 pro_url:{ print: "app://./projects/settle/print.html" }
最后附上print.html内容
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>电子小票</title></head><body id='bd'> 张三</body><script> //引入ipcRenderer对象 const {ipcRenderer} = require('electron') //监听渲染线程传过来的webview-print-render事件 ipcRenderer.on('webview-print-render', (event, deviceInfo) => { console.log(deviceInfo) //当图片插入到页面后,通过ipcRenderer对象的sendToHost方法和渲染线程通讯,告诉渲染线程打印的内容已经准备完毕,请开始打印操作 ipcRenderer.sendToHost('webview-print-do') })</script></html>
原网址: 访问
创建于: 2023-08-09 19:11:33
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论