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

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

第一步获取打印机资源

渲染端代码(vue里面)
// 因使用了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

// 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)调用打印

    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}
    在这里插入图片描述

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Web_Lys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值