当前位置: 首页 > 后端技术 > Node.js

使用electron静默打印

时间:2023-04-03 15:00:19 Node.js

1。使用electron打印的原因很多情况下,程序中使用的打印是用户察觉不到的。而如果想要灵活控制打印内容,往往需要使用打印机提供的api来开发。这种开发方式非常繁琐,开发难度大。electron提供的打印API可以很灵活的控制打印设置的显示,可以通过html写打印内容。2.apielectron提供了两种打印方式,一种是直接调用打印机打印,另一种是打印成pdf。而可以调用打印的对象有两种:第一种是通过window的webcontent对象。使用这种方法需要单独打开一个打印窗口,可以隐藏窗口,但是通讯调用比较复杂。另一种是利用页面的webview元素调用打印,webview可以隐藏在被调用的页面中,通信方式比较简单。两个对象都以相同的方式调用print方法。2.1打印官网api如下contents.print([options],[callback])optionObject(optional)silentBoolean(optional)-不要求用户打印信息,默认为false。printBackgroundBoolean(可选)-还打印网页的背景颜色和图像。默认为false。deviceName字符串(可选)-设置要使用的打印机设备名称。默认为''。回调函数(可选)成功布尔值-表示打印调用成功。打印配置中只有三个简单配置(options):silent:打印时是否显示打印配置(是否静默打印)printBackground:是否打印后台deviceName:打印机设备名称。配置了打印机名称,调用打印前需要判断打印机是否可用。使用getPrinters方法获取当前设备上已配置的打印机列表。请注意,配置不可用,但此设备上已安装驱动程序。通过getprinter获取的打印机对象:https://electronjs.org/docs/a...我们这里只关心两个,name和status。当状态为0时,打印机可用。这里的status一定是经历了打印失败返回一个非零值,也就是说第一次获取打印机status的时候肯定是0。不过虽然无法判断这次打印的错误,但是打印任务已经预先存储在队列中。当下次打印机状态变为可用时,将打印临时存储的任务。当打印机用完纸张时也是如此,剩余的作业会暂时存储起来,以便下次打印机可用时打印。print的第二个参数callback是用来判断打印任务是否下发的回调,不是打印任务完成后的回调。所以一般打印任务下发时,会调用回调函数,返回参数true。该回调并不确定打印是否真的成功。2.2printToPdfcontents.printToPDF(options,callback)optionObjectmarginsTypeInteger(可选)——指定要使用的边距类型。使用0表示默认边距,1表示无边距,2表示最小边距。pageSize字符串(可选)-指定生成的PDF的页面大小。可以是A3、A4、A5、Legal、Letter、Tabloid或包含微米高度和宽度的对象。printBackgroundBoolean(可选)-是否打印CSS背景。printSelectionOnlyBoolean(可选)-是否仅打印选区。landscapeBoolean(optional)-trueforlandscape,falseforportrait.callbackFunction-回调函数错误ErrordataBufferprintToPdf和print基本一样,但是由于print是native代码提供的方法,配置项很少,而printToPdf扩展了很多属性.包括打印边距、打印页眉页脚等的配置。配置项很多。翻了一下源码,发现还有很多没有贴入API:constdefaultPrintingSetting={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:'SaveasPDF',generateDraftData:true,fitToPageEnabled:false,scaleFactor:1,d:72,dpiVertical:72,rasterizePDF:false,duplex:0,copies:1,collat??e:true,shouldPrintBackgrounds:false,shouldPrintSelectionOnly:false}3.打印边距问题打印机会给纸张留一个默认边距打印时。如果是A4这样的纸张,几乎可以忽略不计,但是在打印50mm*50mm这样的小尺寸纸张时,这个边距就非常明显,严重影响了整体排版。printToPdf方法提供了很多配置项,包括配置打印边距的参数,但是print方法没有这个配置项。我们可以通过一个css配置来解决这个问题,即@page:@page{margin:0px;}通过该配置,可以灵活配置打印边距。还有一个css属性@mediaprint{}。这个配置是一个css,只在打印的时候生效。它控制打印边距内的css,不能控制打印边距。4、打印方案使用webcontent打印。首先,必须有一个打印窗口。这个窗口不能随时打印,随时创建,比较消耗性能。可以在程序运行时启动,进行事件监听。这个过程需要和调用者沟通才能打印:大致流程如下:可见沟通非常繁琐。用webview打印也可以达到同样的效果,但是通信方式会变得更简单,因为渲染进程和webview之间的通信不需要经过主进程。可以使用以下方法://在嵌入页面中。constwebview=document.querySelector('webview')webview.addEventListener('ipc-message',(event)=>{console.log(event.channel)//打印"pong"})webview.send('ping')复制//在客人页面上。const{ipcRenderer}=require('electron')ipcRenderer.on('ping',()=>{ipcRenderer.sendToHost('pong')})5.示例程序演示:https://github.com/ConardLi/电子...