本帖最后由 Felix.Li 于 2023-2-13 17:55 编辑
在使用ARJS报表时,经常会有打印的需求,但是ARJS是前端的控件,默认的打印是调用的浏览器打印,在实际需求中,有时也需要使用无预览打印,也就是用户点击打印之后直接就使用默认打印机打印出来。针对这个需求,我们验证了一个解决该问题的方案,本贴就来介绍该方案如何实现
实现思路如下:
后端实现一个接口,接收Blob类型PDF流,然后调用系统默认打印机,将PDF进行静默打印
前端利用ARJS自带的导出PDF,导出Blob类型,然后通过POST请求调用后端接口将Blob流传给后端进行打印
具体实现步骤:
前端实现方法:
前端利用ARJS的PDF.exportDocument无预览导出PDF,该接口返回的result包含data属性和download方法,然后调用后端接口,将result.data传递给后端
- function printPDF() {
- var ARJS = GC.ActiveReports.Core;
- var PDF = GC.ActiveReports.PdfExport;
- var settings = {
- info: {
- title: "test",
- author: "GrapeCity inc.",
- },
- pdfVersion: "1.7",
- };
- var pageReport = new ARJS.PageReport();
- pageReport
- .load("1.rdlx-json")
- .then(function () {
- return pageReport.run();
- })
- .then(function (pageDocument) {
- return PDF.exportDocument(pageDocument, settings);
- })
- .then(function (result) {
- let formData = new FormData();
- formData.append("file", result.data);
- fetch("http://localhost:8088/print", {
- method: 'POST',
- mode: 'cors',
- body: formData
- })
- });
- }
复制代码
具体PDF.exportDocument可以参考文档:
https://demo.grapecity.com.cn/activereportsjs/demos/api/export/purejs
后端实现方式:
我这边是采用python实现了一个接口,接收前端传递的Blob文件流,然后调用后端部署的服务器默认打印机直接进行静默打印
后端程序可以部署到服务器上,如果是windows服务器,可以直接下载exe,在服务器上运行
下载下来是2个exe程序,需要放在同一个文件夹,然后运行PrintAgent.exe,切记这两个程序需要放在同一个文件夹
注意:如果exe只给服务器上部署,那么前端在打印时调用服务器地址接口打印,最终都会从服务器上连接的打印机打出来
如果exe给客户端部署了,那么前端打印就可以代码调用localhost地址去打印,最终就会从客户端所连接的默认打印机打印出来;
切换打印机的话,就调整windows的默认打印机就可以
Linux服务器的话需要将源码拷贝到服务器去运行
源码如下,也可以根据自己需要进行调整和修改:
|