前端报表如何实现无预览打印解决方案或静默打印

前端,报表,如何,实现,预览,打印,解决方案,静默 · 浏览次数 : 581

小编点评

## 前端打印的挑战:浏览器的打印预览页面,影响打印效果 本文介绍了一种实现无预览打印的方案,旨在解决前端打印过程中浏览器的打印预览页面对打印效果的影响。 **前端打印的挑战:** * 由于前端打印需要强依赖浏览器的打印预览页面,每一次打印都需要弹出来打印预览对话框,手动点击关闭多个按钮,才能实现批量打印,甚至一次性打印几百张上千张的报表,就会变成“NightMare”。 * 浏览器对字体、边线等处理不同,导致打印效果差距很大,有的边线加粗,有的1页数据,打印出来呈现2页,甚至 worse 的情况是多个页面混杂在一页上。 **实现思路:** 1. 后端实现一个接口,接收Blob类型PDF流,然后调用系统默认打印机,将PDF进行静默打印。 2.前端利用ActivereportsJS的PDF.exportDocument无预览导出PDF,该接口返回的result包含data属性和download方法,然后调用后端接口,将result.data传递给后端。 **具体实现步骤:** * 前端实现方法:前端利用ActivereportsJS的PDF.exportDocument无预览导出PDF,该接口返回的result包含data属性和download方法,然后调用后端接口,将result.data传递给后端。 **具体PDF.exportDocument可以参考文档:** * https://demo.grapecity.com.cn/activereportsjs/demos/api/export/purejs **具体PDF.exportDocument示例:** ```javascript 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 }) .then(function () { // 打印成功 }) .catch(function (error) { // 打印失败 }); }) .catch(function (error) { // PDF导出失败 }); ``` **总结:** 通过以上方案,前端可以实现无预览打印,用户点击打印按钮直接使用默认打印机打印出内容。该方案可用于各种场景,例如: * 需要在前端展示大量数据时,进行导出和打印。 * 需要对打印效果进行调整的场景。 * 需要切换打印机时进行调整。

正文

本文由葡萄城技术团队于博客园原创并首发
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

在前端开发中,除了将数据呈现后,我们往往需要为用户提供,打印,导出等能力,导出是为了存档或是二次分析,而打印则因为很多单据需要打印出来作为主要的单据来进行下一环节的票据支撑, 而前端打印可以说是非常令人头疼的一件事。

为什么令大家头疼呢?

因为前端打印,要强依赖与浏览器的打印预览页面,会天然存在以下弊端:

每一次打印都要弹出来打印预览对话框,如果前端需要批量打印,那么意味着客户要点击无数个关闭按钮,才能实现批量打印,如果一次性打印几百张上千张的报表,则会成为“NightMare”。
前端打印强依赖于浏览器,主流的思路是先将内容转换为PDF文件,再调用浏览器的打印功能进行打印,而生成PDF文件是依赖于浏览器对于字体,边线等的处理,因此浏览器的异同则直接导致打印出来的效果差距很大,有的边线加粗,有的1页数据,打印出来呈现2页,也是让开发者十分苦恼的事情,对于一些打印要求比较高的行业,这就是灾难。

因此如何在前端实现无预览打印,也就是用户点击打印之后直接就使用默认打印机打印出来。针对这个需求,我们验证了一个解决该问题的方案,本贴就来介绍该方案如何实现。

实现思路如下:
后端实现一个接口,接收Blob类型PDF流,然后调用系统默认打印机,将PDF进行静默打印。

前端利用ACTIVEREPORTSJS自带的导出PDF,导出Blob类型,然后通过POST请求调用后端接口将Blob流传给后端进行打印。

具体实现步骤:
前端实现方法:
前端利用ActivereportsJS的PDF.exportDocument无预览导出PDF,该接口返回的result包含data属性和download方法,然后调用后端接口,将result.data传递给后端。

function printPDF() {
    var ACTIVEREPORTSJS = GC.ActiveReports.Core;
    var PDF = GC.ActiveReports.PdfExport;

    var settings = {
      info: {
        title: "test",
        author: "GrapeCity inc.",
      },
      pdfVersion: "1.7",
    };

    var pageReport = new ACTIVEREPORTSJS.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服务器的话需要将源码拷贝到服务器去运行。

源码如下,也可以根据自己需要进行调整和修改:

https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=MjUzNTMyfGE0YTE2ZDY5fDE2NzM0MTk2ODZ8NjI2NzZ8OTk3MTg%3D

另附 前端100张数据可视化大屏模板,按需取用:

https://www.grapecity.com.cn/solutions/wyn/demo

与前端报表如何实现无预览打印解决方案或静默打印相似的内容:

前端报表如何实现无预览打印解决方案或静默打印

本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 在前端开发中,除了将数据呈现后,我们往往需要为用户提供,打印,导出等能力,导出是为了存档或是二次分析,而打印则因为很多单据需要打印出来作为主要的单据来进行下一环节的票据

前端报表如何实现无预览打印解决方案或静默打印

本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 在前端开发中,除了将数据呈现后,我们往往需要为用户提供,打印,导出等能力,导出是为了存档或是二次分析,而打印则因为很多单据需要打印出来作为主要的单据来进行下一环节的票据

如何使用Java + React计算个人所得税?

**前言** 在报表数据处理中,Excel公式拥有强大而多样的功能,广泛应用于各个业务领域。无论是投资收益计算、财务报表编制还是保险收益估算,Excel公式都扮演着不可或缺的角色。传统的做法是直接依赖Excel来实现复杂的业务逻辑,并生成相应的Excel文件。因此只需在预设位置输入相应参数,Exce

前端展示中实现批量标签动态生成

前端展示中实现批量标签动态生成 使用过报表的小伙伴,经常会有条码打印、标签打印的需求,一两个标签还好处理,但很多时候我们可能需要的是几十、上百个内容的批量打印,如下图所示: 今天我们就来为大家介绍,如何快速实现报表的标签条码批量打印。 项目实战 今天我们从Wyn出发,为大家展示整个功能的实现过程。

如何使用前端表格控件实现多数据源整合?

前言 作为表格产品的典型应用场景之一,几乎所有的行业都会存在类 Excel 报表开发这样的应用场景,而在这些应用场景中,经常会遇见下面的这些痛点: 报表数据往往来自多个不同的数据源,需要报表系统能够同时连接多个数据源,并融合不同的数据格式 实际的报表中需要对数据结果进行逻辑计算,例如销售的环比和同比

如何使用前端表格控件实现数据更新?

前言 小编之前分享过一篇文章叫《如何使用前端表格控件实现多数据源整合?》。今天,继续为大家介绍如何使用前端表格控件来更新已连接的数据源信息。 环境准备 SpreadJS在线表格编辑器: SpreadJS 前端表格控件新版本新增了一款报表插件,该插件基于 SpreadJS 本身强大的表格能力,在 Da

如何实现巡检报告?

# 什么是巡检报告 巡检报告是指对某一个系统或设备进行全面检查,并把检查结果及建议整理成报告的过程。 巡检报告通常用于评估系统或设备的运行状况与性能,以发现问题、优化系统、提高效率、降低故障率等方面提供参考。 ![file](https://img2023.cnblogs.com/other/233

服务器崩溃前的数据拯救实践

在服务器的VMWARE ESXi系统环境中,我们经常需要创建虚拟机来运行各种应用程序。然而,服务器如果偶尔出现自动重启以及紫屏报错的问题,说明服务器内部出现了故障,一般情况下重启机器能够解决问题,但时间一长,问题会越来越严重,可能会出现无法启动的情况,这就会导致数据丢失,因此为了确保数据的安全,需要...

一篇带你了解如何使用纯前端类Excel表格构建现金流量表

现金流量表(Cash Flow Statement),是指反映企业在一定会计期间现金和现金等价物流入和流出的报表。现金流量表是企业财务报表的三个基本报告之一(另外两个是资产负债表和损益表)。 为了全面系统地揭示企业一定时期的财务状况、经营成果和现金流量,财务报表需按财政部会计准则的标准格式设计,因此

如何通过前后端交互的方式制作Excel报表

前言 Excel拥有在办公领域最广泛的受众群体,以其强大的数据处理和可视化功能,成了无可替代的工具。它不仅可以呈现数据清晰明了,还能进行数据分析、图表制作和数据透视等操作,为用户提供了全面的数据展示和分析能力。 今天小编就为大家介绍一下,如何通过葡萄城公司的纯前端表格控件SpreadJS和后端表格组