Electron无感打印 静默打印(vue3 + ts + vite)

(electron vue3 项目搭建部分 自行查找其他资源 本文只讲解Electron+vue3 如何实现静默打印)

第一步获取打印机资源

渲染端代码(vue里面)
javascript 复制代码
// 因使用了vite所以在浏览器中打开 require会报错 只能在electron中
const { ipcRenderer } = require( 'electron')
// 初始化打印
async function handleInit() {
  //  获取到当前所有打印机 (获取以后取打印机NAME 用于electron的deviceName字段)
   ipcRenderer.invoke("getPrinters").then(res=>{
        console.log(res)
   })
  // 创建要打印的窗口
  await ipcRenderer.invoke("openPrintWindow",'printId');
} 

第二步 进程端 完善

在electron文件夹目录下新增文件print.ts

typescript 复制代码
// print.ts 
import { app, BrowserWindow, shell, ipcMain, BrowserWindowConstructorOptions, WebContentsPrintOptions } from 'electron'

export const electronPrint = () => {

    let win: BrowserWindow;
    // 获取系统打印机详情
    ipcMain.handle("getPrinters", async (event) => {
        return await event.sender.getPrintersAsync();
    });
    // 调用打印机打印
    ipcMain.handle("printHandlePrint",async (event, options: WebContentsPrintOptions) => {
            console.log("调用打印了")
            return new Promise((resolve) => {
                event.sender.print(
                    options,
                    (success: boolean, failureReason: string) => {
                        console.log("打印的结果",{ success, failureReason })
                        resolve({ success, failureReason });
                    }
                );
            });
        }
    );
    // 创建打印界面
    ipcMain.handle("openPrintWindow", (_, id) => {
        // id 用于传递的参数
        openPrintWindow(id);
    });
    // 销毁打印界面
    ipcMain.handle("destroyPrintWindow", () => {
        if (win) win.destroy();
    });
    function openPrintWindow(id) {
        const otherWindowConfig: BrowserWindowConstructorOptions = {
            useContentSize: true,
            autoHideMenuBar: true,
            frame: false,
            show: false,
            webPreferences: {
                contextIsolation: false,
                nodeIntegration: true,
                webSecurity: false,
                // 如果是开发模式可以使用devTools
                devTools:true,
                // 在macos中启用橡皮动画
                scrollBounce: process.platform === "darwin",
            },
        };
        win = new BrowserWindow({
            titleBarStyle: "hidden",
            ...Object.assign(otherWindowConfig, {}),
        });
        win.loadURL('http://localhost:5173/#/print');
        win.setMenu(null);
        win.on("ready-to-show", () => {
            console.log("打印窗口已经新建出来了  隐藏处理")
            win.hide();
        });
        win.on("closed", () => {
            win = null;
        });
    }
}
在main中调用即可

第三步 渲染端(vue)调用打印

typescript 复制代码
    onMounted(async()=>{
        const { ipcRenderer } = require( 'electron')
        setTimeout(async()=>{ 
            try {
                await ipcRenderer.invoke("printHandlePrint", { 
                    deviceName:"Printer_POS_80",
                    silent: true, // 静默打印
                    pageSize:{
                        width:'72100',
                        height:'210000',
                    },
                    margins: { marginType: "printableArea" }, // 网页的边距
                });
            } catch (error) {
            } finally {
                await ipcRenderer.invoke("destroyPrintWindow"); // 打印完成销毁新窗口
            }
        },1000)
    })

常见问题总结

  1. require 报错

    解决:如图所示添加nodeIntegration字段 并且在electron中运行 (浏览器运行会报错)

  2. 打印出来内容尺寸不对

    添加pagesize字段 width eight单位是微米 查看你要打印的尺寸设置即可 要打印的页面添加样式 @page{size:auto}

相关推荐
程序员Sunday2 分钟前
Vue 3 响应式原理是什么?Proxy、ref 和 reactive 有什么区别?
前端·javascript
mldong12 分钟前
一个 npm 包,九页审批中心:Vue3 项目接上工作流引擎
前端·javascript·vue.js
高级程序源8 小时前
django校园寻物通失物招领平台32261-计算机课程设计、毕业设计
vue.js·python·mysql·小程序·django·flask·课程设计
WeiXin_DZbishe8 小时前
基于springboot宠物领养系统-计算机毕设 附源码【课程设计】94217
vue.js·spring boot·python·django·php·课程设计
架构技术专栏9 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
别动我齐刘海9 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
志尊宝10 小时前
Vue3 零基础每日笔记(071):暗黑模式与主题切换——CSS 变量 + Element Plus 暗黑方案
前端·css·笔记·vue·html·前端开发·软件开发
WeiXin_DZbishe11 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
刘发财11 小时前
前端如何生成10000页PDF文件?
前端·javascript·开源
WeiXin_DZbishe11 小时前
基于Springboot+AI的kuall音乐广场的设计与实现-计算机毕设 附源码【课程设计】12715
vue.js·人工智能·spring boot·后端·python·php·课程设计