1.使用electron打印的理由

很多情况下程序中使用的打印都是用户无感知的。并且想要灵活的控制打印内容,往往需要借助打印机给我们提供的api再进行开发,这种开发方式非常繁琐,并且开发难度较大。

electron提供的打印api可以非常灵活的控制打印设置的显示,并且可以通过html来书写打印内容。

2.api

electron提供了两种方式进行打印,一种是直接调用打印机打印,一种是打印到pdf。

并且有两种对象可以调用打印:

第一是通过window的webcontent对象,使用此种方式需要单独开出一个打印的窗口,可以将该窗口隐藏,但是通信调用相对复杂。

另一种是使用页面的webview元素调用打印,可以将webview隐藏在调用的页面中,通信方式比较简单。

两个对象调用打印方法的使用方式都一样。

2.1 print

官网api如下

contents.print([options], [callback])

选项 Object (可选)

silent Boolean (可选) - 不询问用户打印信息,默认为 false。

printBackground Boolean (optional) - Also prints the background color and image of the web page. Default is false.

deviceName String (optional) - Set the printer device name to use. Default is ''.

callback Function (可选)

success Boolean - Indicates success of the print call.

打印配置(options)中只有简单的三个配置:

silent:打印时是否不展示打印配置(是否静默打印)

printBackground:是否打印背景

deviceName:打印机设备名称

首先要将我们使用的打印机名称配置好,并且要在调用打印前首先要判断打印机是否可用。

使用getPrinters方法可获取当前设备已经配置的打印机列表,注意配置过不是可用,只是在此设备上安装过驱动。

我们这里只管关心两个,name和status,status为0时表示打印机可用。

这里的status必须经历一次打印失败才能返回非0值,也就是说第一次获取打印机状态一定是0。但是这一次的打印虽然不能判断出错误,打印的任务已经预存在队列中了,当下一次打印机状态变为可用时,将会打印暂存的任务。

当打印机纸张用完时也是这种情况,剩余任务会暂存起来,下次打印机可用时即可以打印了。

print的第二个参数callback是用于判断打印任务是否发出的回调,而不是打印任务完成后的回调。所以一般打印任务发出,回调函数即会调用并返回参数true。这个回调并不能判断打印是否真的成功了。

2.2 printToPdf

contents.printToPDF(options, callback)

选项 Object

marginsType Integer (optional) - Specifies the type of margins to use. Uses 0 for default margin, 1 for no margin, and 2 for minimum margin.

pageSize String (optional) - Specify page size of the generated PDF. Can be A3, A4, A5, Legal, Letter, Tabloid or an Object containing height and width in microns.

printBackground Boolean (optional) - Whether to print CSS backgrounds.

printSelectionOnly Boolean (optional) - Whether to print selection only.

landscape Boolean (optional) - true for landscape, false for portrait.

callback Function - 回调函数

error Error

data Buffer

printToPdf的用法基本和print相同,但是由于print是native code提供的方法,配置项非常少,而printToPdf则扩展了很多属性。

包括可以对打印的margin,打印页眉页脚等进行配置。

配置项很多,翻了一下源码发现还有很多没有被贴进api的:

const defaultPrintingSetting = {

pageRage: [],

mediaSize: {},

landscape: false,

color: 2,

headerFooterEnabled: false,

marginsType: 0,

isFirstRequest: false,

requestID: getNextId(),

previewModifiable: true,

printToPDF: true,

printWithCloudPrint: false,

printWithPrivet: false,

printWithExtension: false,

deviceName: 'Save as PDF',

generateDraftData: true,

fitToPageEnabled: false,

scaleFactor: 1,

dpiHorizontal: 72,

dpiVertical: 72,

rasterizePDF: false,

duplex: 0,

copies: 1,

collate: true,

shouldPrintBackgrounds: false,

shouldPrintSelectionOnly: false

}

3.打印边距问题

打印的时候打印机会给纸张留一个默认边距,如果是A4这样的纸张几乎可以忽略不计了,但是打印小规格纸张如50mm*50mm,这个边距就十分明显了,严重影响了整体布局。

printToPdf方法提供了非常多的配置项,其中包括了配置打印边距的参数,但是print方法却没有该配置项。

我们可以通过一项css配置来解决这个问题,即@page:

@page {

margin: 0px;

}

通过此配置可灵活配置打印边距。

还有一个css属性@media print {}此配置是只有在打印时才生效的css,控制的是打印边距以内的css,并不能控制打印边距。

4.打印方案

使用webcontent打印,首先要有一个打印窗口,这个窗口不能随时打印随时创建,比较耗费性能。可以将它在程序运行时启动好,并做好事件监听。

此过程需和调用打印的进行做好通信:大致过程如下:

可见通信非常繁琐

使用webview进行打印可实现同样的效果但是通信方式会变得简单,因为渲染进程和webview通信不需要经过主进程,通过如下方式即可:

// In embedder page.

const webview = document.querySelector('webview')

webview.addEventListener('ipc-message', (event) => {

console.log(event.channel)

// Prints "pong"

})

webview.send('ping')

Copy

// 在访客页。

const {ipcRenderer} = require('electron')

ipcRenderer.on('ping', () => {

ipcRenderer.sendToHost('pong')

})

5.示例程序

python静默打印pdf_使用electron静默打印相关推荐

  1. python批量打印pdf_通过Dynamo批量打印PDF图纸

    最近有小伙伴留言,希望写一篇关于批量打印PDF图纸的教程,于是呢,这次就简单介绍一下批量打印pdf. 首先我在我的Dynamo节点库里简单搜了一下,发现打印pdf的节点挺多的,方式大同小异,我继续选O ...

  2. python静默打印pdf_前端静默打印实现 html pdf集合

    一.初步实现 前段时间,公司有个需求,要实现前端静默(点击按钮直接打印,不需要预览),本想着直接用window.print()来实现,让用户多点击一下按钮的事儿,无奈我们的产品: 最后只好继续要网上继 ...

  3. Python真正实现PDF按顺序静默打印

    由于工作需求,需要按照固定顺序打印大量的PDF文件. 第一时间想到的就是用Python的模块来解决.查阅了大量的文章之后,开始了我的测试之旅- 一.第一种方案.ghostscript与gsprint打 ...

  4. java中使用pdfBox打印pdf;java web打印pdf;静默打印;jar程序打包成exe文件;exe4j的使用

    java编写打印控件 web打印一直是个棘手的问题,市面上的第三方打印插件也是贵的离谱,这里给出一个可行的解决方案. SpringBoot项目的web服务,实现的功能: 获取电脑可用的打印机列表 设置 ...

  5. python标签打印工具_NiceLabel Designer 2017条码标签打印软件

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 减少开发费用 PowerForms 能够比C#或VB.NET等编程语言更快地构建应用程序.不仅降低了应用程序开发成本,而且缩短了部署时间. 只需轻松的拖放 ...

  6. python 3d打印_基于Python的结构拓扑优化与3D打印试验研究

    收稿日期:2017 -05 -22 修回日期:2017 -06 -01 第 35 卷 第 8 期 计 算 机 仿 真 2018 年 8 月 文章编号:1006 -9348( 2018) 08 -017 ...

  7. Python中的姓名和身份证的打印

    **Python中的姓名和身份证的打印** name = input("请输入姓名:") sfz = input ("请输入18位身份证号:") year = ...

  8. [附源码]计算机毕业设计Python+uniapp基于微信支付的在线打印微信小程序ah1u9(程序+lw+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于微信支付的在线打印微信小程序ah1u9(程序+lw+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: ...

  9. python打印空心长方形_Python程序打印空心半菱形星形图案

    给出一个整数N,任务是打印空心半菱形图案.示例:输出:## ## ## ## ## ##输入:7## ## ## ## ## ## ## #### ## ## ## #下半部分:对于下半部分,使用迭代 ...

最新文章

  1. java arguments_命令行中执行带参数的java程序(Command-Line Arguments)
  2. 基于框架的应用系统的质量属性
  3. linux系列(一):ls命令
  4. java day13【Collection、泛型】
  5. flink-cdc(java案例)
  6. [BZOJ2177][最小/最大(曼哈顿距离)生成树]曼哈顿最小生成树
  7. 从零开始搭建ROS移动机器人系列之(四)直流电机PWM调速
  8. 【转】我是一个INFP者
  9. 如何利用英特尔管理工具绕过Windows防火墙
  10. 我所知道的专业搜索引擎
  11. 投影仪家用哪个牌子好?如何选择投影仪
  12. Max()函数与Min()函数
  13. TITAN RTX 与 RTX 3090 参数的对比,探计单双精度的问题
  14. 数据结构课程设计--实验室设备管理系统(c语言)
  15. apt-get安装问题:请尝试不指明软件包的名字来运行“apt-get -f install”
  16. JavaScript——jQuery速查手册
  17. Arena | 用Excel设计的RPG游戏
  18. 【Linux】Linux操作的一些基本指令
  19. 国务院拟出台职工带薪年休假规定
  20. 性能工具之Jmeter脚本python启动

热门文章

  1. C++函数参数传递详解
  2. 动态NAT配置实验(1)
  3. Gateway 整合 Spring Security鉴权
  4. HTML5 参考手册 ———— 符号
  5. Python学习日记(四):添加删除空白格
  6. [luogu3980] 志愿者招募
  7. 先逆水寒后剑网3,国产游戏的光追饼缘何还没画完?
  8. 苹果x怎么显示电量百分比_苹果数据线在充电时,显示不支持此配件该怎么办?...
  9. docker 国内镜像与 docker hub 镜像, docker-compose
  10. ARTS001 - 翻译 (About Log4j)