位置: IT常识 - 正文

electron实现打印功能,支持静默打印、无感打印(electron静默打印)

编辑:rootadmin
electron实现打印功能,支持静默打印、无感打印 electron实现打印功能,支持静默打印、无感打印实现思路

推荐整理分享electron实现打印功能,支持静默打印、无感打印(electron静默打印),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:electron如何打包,electron 调用打印机,electron 打印pdf,electron 打印小票,electron 打印小票,electron 打印,electron 调用打印机,electron 打印插件,内容如对您有帮助,希望把文章链接给更多的朋友!

业务上目前有两种打印的方法:

webview标签:electron提供webview用于在一个独立的 frame 和进程里显示外部 web 内容。但是在Electron >= 5中是禁用该标签的,所以就直接放弃它。webContent.print方法:webCompent是主进程用来渲染和控制网页的对象,而它的print方法是用来打印渲染进程中的网页内容。这里我们选择这个方法。

总体思路大概为:

在页面点击打印按钮,发布订阅去创建一个隐藏的新窗口,窗口内容就是我们要打印的内容。利用新窗口展示的路径的hash和打印页面路由相互匹配实现指定打印内容。在打印页面初始化后,需要窗口去掉标题的按钮,防止乱入到打印页面。然后在根据路由传递的参数查找数据渲染页面。 再然后发布printHandlePrint事件进行打印并设置静默打印和去除边距。最后打印完成发布destroyPrintWindow事件销毁新窗口。实现1、创建打印方法

使用ipcMain.handle向主进程订阅打印相关事件。其中printHandlePrint订阅就是调用打印机的方法。最重要的是openPrintWindow订阅,它的内部去调用了openPrintWindow方法,它的用处就是用于创建一个新的BrowserWindow窗口,将要打印的内容放进新窗口中,这样我们就可以实现打印指定内容的功能。destroyPrintWindow订阅作用于销毁创建的新窗口。

可以看到openPrintWindow会接受两个参数,第一个参数是事件对象,第二个参数是发布事件时传递的参数,而这个参数最终会通过路由的方式传递到打印的新窗口中。实现渲染进程和渲染进程的伪通信。

方法写好之后记得要在app.whenReady()后调用这个方法。

// printHandle.tslet win: BrowserWindow;export function usePrintHandle() {  // 获取系统打印机详情  ipcMain.handle("getPrinters", async (event) => {    return await event.sender.getPrintersAsync(); });  // 调用打印机打印  ipcMain.handle(    "printHandlePrint",    async (event, options: WebContentsPrintOptions) => {      return new Promise((resolve) => {        event.sender.print(          options,         (success: boolean, failureReason: string) => {            resolve({ success, failureReason });         }       );     });   } );  // 创建打印界面  ipcMain.handle("openPrintWindow", (_, id) => {    // id 用于传递的参数    openPrintWindow(id); });  // 销毁打印界面  ipcMain.handle("destroyPrintWindow", () => {    if (win) win.destroy(); });}​// index.tsapp.whenReady().then(()=>{  usePrintHandle();})2、创建新的BrowserWindow窗口

首先这个创建新窗口的函数会在openPrintWindow订阅中触发,也就是在点击了打印按钮时触发。所以会判断时候存在这个新窗口,如果存在就要隐藏并销毁掉,这样可以保证我们每次点击打印按钮时都会是最新的隐藏的窗口。

electron实现打印功能,支持静默打印、无感打印(electron静默打印)

然后需要在ready-to-show事件中将新窗口隐藏掉,这样做的好处是这个新窗口一直都是隐藏的,从而实现无感打印。

最后有一个问题就是如何将打印的数据添加到新的窗口中,可以通过新窗口实例对象的loadURL方法,这个方法传递一个我们要展示内容的路径。从printURLCustom方法中可以看到路径就是项目打包根页面,而后面的hash就是我们路由的hash模式路由。 所以我们可以写一个print组件,然后为这个组件增加print路由。这样我们打开的新窗口显示就是print组件的内容。

而openPrintWindow订阅的参数会作为路由的query参数拼接到路径上面,print组件就可以拿到点击组件打印传递的参数。

// router.ts{path: "/print",name: "打印",component: () => import("@renderer/views/print/index.vue")},// path.ts/** * 获取真正的地址 * * @param {string} devPath 开发环境路径 * @param {string} proPath 生产环境路径 * @param {string} [hash=""] hash值 * @param {string} [search=""] search值 * @return {*} {string} 地址 */function getUrl(  devPath: string,  proPath: string,  hash: string = "",  search: string = ""): string {  const url = isDev    ? new URL(`http://localhost:${process.env.PORT}`)   : new URL("file://");  url.pathname = isDev ? devPath : proPath;  url.hash = hash;  url.search = search;  return url.href;}export const printURLCustom = (id) =>  getUrl("",join(__dirname, "..", "renderer", "index.html"),`#/print?id=${id}`);​// printHandle.tslet win: BrowserWindow;const otherWindowConfig: BrowserWindowConstructorOptions = {  height: 595,  useContentSize: true,  width: 1140,  autoHideMenuBar: true,  minWidth: 842,  frame: false,  show: false,  webPreferences: {    contextIsolation: false,    nodeIntegration: true,    webSecurity: false,    // 如果是开发模式可以使用devTools    devTools: process.env.NODE_ENV === "development",    // 在macos中启用橡皮动画    scrollBounce: process.platform === "darwin", },};export function openPrintWindow(id) {  if (win) {    win.hide(); /*测试*/    win.destroy();    return; }  win = new BrowserWindow({    titleBarStyle: "hidden",    ...Object.assign(otherWindowConfig, {}), });  win.loadURL(printURLCustom(id));  win.setMenu(null);  win.on("ready-to-show", () => {    win.hide(); });  win.on("closed", () => {    win = null; });}​3、创建点击打印组件

这里是通过ipcRenderer渲染进程携带参数发布openPrintWindow事件。这里需要注意的是ipcRenderer要使用commonjs引入,否则会报错TypeError: path.join is not a function. 但是浏览器不支持commonjs,所以非常不建议在浏览器上跑这个项目。

<template> <div @click=print>打印</div></template><script lang="ts" setup>  const { ipcRenderer } = require("electron"); // 浏览器环境报错  const onPrint = async () => { await ipcRenderer.invoke("openPrintWindow", 123123); // 创建新窗口并传递数据 };</script>4、创建打印组件

在打印新窗口时虽然设置了frame:false,但是标题的关闭、最小化这些按钮还存在,导致打印也会把按钮打印到页面。我没有找到完美的解决办法,所以直接删除了DOM。

参数可以通过route.query拿到点击打印按钮传递的参数。

通过ipcRenderer渲染进程发布printHandlePrint事件,传递参数为的打印机配置。其中启用了静默打印和去除打印页面边距。

静默打印是指用默认的打印机打印出所有页并且不希望弹出对话框进行设置,所以在打印的时候要设置好系统默认打印机。

最后在打印完成时发布destroyPrintWindow事件,销毁掉打印新窗口。

<template> <div>我要被打印了</div></template><script lang="ts" setup>  import { useRoute } from "vue-router";  import { ref, onMounted } from "vue";    const { ipcRenderer } = require("electron"); // 浏览器环境报错    const route = useRoute();  const id = route.query.id as string; // 接收参数​  onMounted(async () => {    const windowTitle = window.document.querySelector(".window-title ");    windowTitle && windowTitle.remove(); // 删除顶部标题关闭按钮    // await getDataApi(id); // 获取数据    try {      await ipcRenderer.invoke("printHandlePrint", {        silent: true, // 静默打印        margins: { marginType: "none" }, // 网页的边距     });   } catch (error) {   } finally {      await ipcRenderer.invoke("destroyPrintWindow"); // 打印完成销毁新窗口   } });</script>

如有错误,请在底部留言。

本文链接地址:https://www.jiuchutong.com/zhishi/282763.html 转载请保留说明!

上一篇:neoDVDstd.exe - neoDVDstd是什么进程 有什么用

下一篇:kencapi.exe是什么进程 kencapi进程查询(kscreensaverapp.exe是什么)

  • 京东免费上门取件还收运费吗(京东免费上门取件怎么操作)

    京东免费上门取件还收运费吗(京东免费上门取件怎么操作)

  • gb是多少流量(1500gb是多少流量)

    gb是多少流量(1500gb是多少流量)

  • 小米8支持快充吗(小米8支持快充多少w)

    小米8支持快充吗(小米8支持快充多少w)

  • 快手号注销了还能用吗(快手号注销了还能重新申请账号么)

    快手号注销了还能用吗(快手号注销了还能重新申请账号么)

  • 天翼云盘网络开小差(天翼云盘网络设置)

    天翼云盘网络开小差(天翼云盘网络设置)

  • 手机开机慢的解决办法(手机开机太慢)

    手机开机慢的解决办法(手机开机太慢)

  • 苹果x屏幕全面失灵(苹果x怎么调全面屏)

    苹果x屏幕全面失灵(苹果x怎么调全面屏)

  • 苹果6s建议升级ios13吗(苹果6s建议升级ios12吗)

    苹果6s建议升级ios13吗(苹果6s建议升级ios12吗)

  • 登录环境异常多久解封(登录环境异常多久解除)

    登录环境异常多久解封(登录环境异常多久解除)

  • 腾讯课堂静音老师知道吗(腾讯课堂静音播放)

    腾讯课堂静音老师知道吗(腾讯课堂静音播放)

  • boss注销账户多久能重注册(boss注销账号几个工作日)

    boss注销账户多久能重注册(boss注销账号几个工作日)

  • qq等级一个星星多少天(qq等级一个星星一个月亮是多少级)

    qq等级一个星星多少天(qq等级一个星星一个月亮是多少级)

  • 华为支付保护怎么关闭(华为支付保护怎么没有互联丰收)

    华为支付保护怎么关闭(华为支付保护怎么没有互联丰收)

  • 荣耀play3解锁方式(荣耀play3锁屏密码忘记了怎样解锁)

    荣耀play3解锁方式(荣耀play3锁屏密码忘记了怎样解锁)

  • 苹果11自带什么耳机(苹果11自带什么相机)

    苹果11自带什么耳机(苹果11自带什么相机)

  • 荔枝vip和爱奇艺vip怎么通用(荔枝会员和爱奇艺会员哪个好)

    荔枝vip和爱奇艺vip怎么通用(荔枝会员和爱奇艺会员哪个好)

  • 网速快下载慢怎么回事(网好下载速度慢)

    网速快下载慢怎么回事(网好下载速度慢)

  • 火车上信号不好怎么办(火车上信号不好咋办)

    火车上信号不好怎么办(火车上信号不好咋办)

  • word的视图方式包括(word的视图方式有哪五种)

    word的视图方式包括(word的视图方式有哪五种)

  • 淘宝帮买是什么意思啊(淘宝的帮买是怎么回事)

    淘宝帮买是什么意思啊(淘宝的帮买是怎么回事)

  • 电脑上wps怎么发送到qq(电脑上wps怎么发给微信好友)

    电脑上wps怎么发送到qq(电脑上wps怎么发给微信好友)

  • qq语音消息自动转文字(qq语音消息自动转文字为什么要钱)

    qq语音消息自动转文字(qq语音消息自动转文字为什么要钱)

  • 微信接视频怎么调美颜(微信接视频怎么录视频)

    微信接视频怎么调美颜(微信接视频怎么录视频)

  • 手机网页UI设计尺寸是多少(手机端网页界面设计)

    手机网页UI设计尺寸是多少(手机端网页界面设计)

  • ppt如何改为兼容模式(如何让ppt兼容)

    ppt如何改为兼容模式(如何让ppt兼容)

  • wps段落设置在哪(wps段落设置在哪里找)

    wps段落设置在哪(wps段落设置在哪里找)

  • qq怎么关闭可能感兴趣(qq怎么关闭可能认识好友推荐)

    qq怎么关闭可能感兴趣(qq怎么关闭可能认识好友推荐)

  • iphonexsmax支持无线充电吗(iPhonexsmax支持无线)

    iphonexsmax支持无线充电吗(iPhonexsmax支持无线)

  • 华为p30pro的屏幕录制的设置在哪儿(华为p30pro的屏幕易碎吗)

    华为p30pro的屏幕录制的设置在哪儿(华为p30pro的屏幕易碎吗)

  • 浅谈VMD---变分模态分解(变分模态分解gnss)

    浅谈VMD---变分模态分解(变分模态分解gnss)

  • 税务师继续教育怎么做
  • 民办非企业免税额度
  • 营业费用和营业收入的关系
  • 自然人扣缴是什么意思
  • 银行存款缴纳所得税费用会计分录
  • 出口旧设备最新政策
  • 房屋租赁收入怎么做账
  • 发票报销的条件是什么?
  • 核定征收企业有利润如何注销税务登记
  • 房地产公司苗木账务处理
  • 购入固定资产会影响营业利润吗
  • 年末转出未交增值税的视频
  • 购买原材料的费用
  • 人力资源外包服务规范
  • 单位收到社保补缴通知书后怎么办
  • 个人投资理财需要注意什么
  • 个体工商户地税没有申报罚款多少
  • 税收楔子是什么意思
  • 全额抵扣有哪些
  • 建筑总包会计分录
  • 减免税款交企业所得税吗
  • 预提费用和待摊费用是根据以下哪项原则设置的会计科目
  • 多计提企业所得税费用会计分录
  • 机械租赁税怎么开
  • 搬运费没有发票能入成本吗?
  • 无法收回的款项摘要怎么写
  • 苹果手机14pro max
  • 红字发票记账如何记账
  • linux禁用root用户
  • 酒店采购布草如何入账
  • linux sed -s
  • php statement
  • 2020年前端面试
  • php gzip压缩
  • php制作验证码
  • 表单建模
  • 基于javaweb是什么意思
  • php 后期静态绑定
  • 标书中组织结构是什么意思
  • 商品流通企业库存商品的核算方法有以下几种
  • 哪些计入管理费用哪些计入资本公积
  • 存货资产减值损失借贷方向
  • 应收账款计入营业收入
  • 招待费专票不可以抵扣
  • 赠送商品入什么科目
  • 工业销售产值是销售收入吗
  • 增值税发票开错冲红重开如何做会计分录?
  • 租赁存在的原因有哪些
  • 事业单位应交增值税明细科目
  • 工程违约金账务处理规定
  • 在固定资产下的折旧年限
  • 本年利润的会计科目
  • 案例分析应收账款管理存在的问题
  • 往来款做其他应收还是其他应付
  • 请问linux
  • 如何确定我的学生学到了问题,尤其是核心素养方面
  • windows7个性化菜单
  • WinXP创建一键静音快捷键(在喇叭消失的情况下实用)
  • win7同步中心怎么关掉
  • 虚拟机安装win7一直卡在完成安装
  • win7桌面图标跑到最下面怎么办
  • xp系统怎么设置网络传输文件
  • windows7一键还原在哪
  • win8.1 应用商店是不是不能用了
  • vps如何搭建ss
  • win10电脑开机蓝屏怎么进入安全模式
  • Win10专业版21h2
  • shell source不起作用
  • jqueryui easyui
  • android substrate
  • net命令用法
  • mark一下怎么用
  • node.js开发实战
  • python t()
  • jquery实现自动轮播
  • python的redis
  • android简单app实例
  • 安卓登录界面布局设计
  • 专项扣除赡养老人是什么意思
  • 车船使用税2021
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设