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