在前端开发中,除了呈现数据,我们往往需要为用户提供打印导出的能力。打印是因为很多文档需要打印出来作为支撑下一个环节的主文档,前端打印可以说是一件很麻烦的事情。为什么大家都很头疼呢?因为前端打印强烈依赖浏览器的打印预览页面,所以会有以下缺点:每次打印都会弹出打印预览对话框,如果前端需要批量打印,意味着客户必须点击无数次关闭按钮才能实现批量打印,如果一次打印成百上千份报表,将成为“噩梦”。前端打印强烈依赖于浏览器。主流的思路是先将内容转换成PDF文件,然后调用浏览器的打印功能进行打印。但是,生成PDF文件依赖于浏览器对字体、边框等的处理,因此浏览器的异同直接导致了打印效果的较大差异。部分边框加粗,打印部分1页数据呈现2页。这也是开发者非常苦恼的事情。对于一些对打印要求比较高的行业来说,这是灾难。那么如何在前端实现无预览打印,即用户点击打印后,使用默认打印机打印出来。针对这一需求,我们验证了该问题的解决方案。这篇文章将介绍如何实施该解决方案。实现思路如下:后台实现一个接口接收Blob类型的PDF流,然后调用系统默认打印机静默打印PDF。前端使用ACTIVEREPORTSJS内置的exportPDF导出Blob类型,然后通过POST请求调用后端接口将Blob传给后端进行打印。具体实现步骤:前端实现方法:前端使用ActivereportsJS的PDF.exportDocument导出PDF不带预览,该接口返回的结果包含data属性和download方法,然后调用后端接口传递result.data到后端。1.函数printPDF(){2.变种ACTIVEREPORTSJS=GC.ActiveReports.Core;3。变种PDF=GC.ActiveReports.PdfExport;4.5。变种设置={6。信息:{7.标题:“测试”,8。作者:“GrapeCityinc.”,9。},10.pdf版本:"1.7",11.};12.13.varpageReport=newACTIVEREPORTSJS.PageReport();14.pageReport15..load("1.rdlx-json")16..then(function(){17.returnpageReport.run();18.})19..then(function(pageDocument){20.returnPDF.exportDocument(pageDocument,settings);21.})22..then(function(result){23.letformData=newFormData();24.formData.append("file",result.data);25.fetch("http://localhost:8088/print",{26.method:'POST',27.mode:'cors',28.body:formData29.})30.});31.}具体的PDF.exportDocument可以参考文档:https://demo.grapecity.com.cn...后端实现方法:我用python实现了一个接口,用于接收前端传过来的Blob文件流-end,然后调用后端部署的服务器默认打印机直接静默打印。后台程序可以部署在服务器上,如果是windows服务器,可以直接下载exe在服务器上运行。?下载链接:https://pan.baidu.com/s/1De2V...提取码:569c下载的是2个exe程序,需要放在同一个文件夹下,然后运行PrintAgent.exe,记住这两个该程序需要放在同一个文件夹中。注意:如果exe只部署在服务器上,那么打印时前端会调用服务器地址接口进行打印,最终会从连接在服务器上的打印机打印出来。如果将exe部署到客户端,则前端打印可以调用localhost地址进行打印,最后从客户端连接的默认打印机打印;如果切换打印机,可以调整windows的默认打印机。对于Linux服务器,需要将源代码拷贝到服务器上运行。源码如下,大家也可以根据自己的需要进行调整修改:https://gcdn.grapecity.com.cn...
