润乾报表如何实现导出文件密码加密保护操作文档

一、 概述

在实际业务中,报表导出的文件(如 Excel、PDF、Word)可能包含敏感数据。为了防止文件被无关人员读取,润乾报表提供了文档密码保护功能。设置密码后,用户双击打开导出的文件时,必须输入正确的密码才能查看内容。
根据密码的生成方式,可分为静态密码和动态密码两类。以下操作均以“导出 Excel”为例进行讲解(PDF 与 Word 设置方法完全相同)。

二、 功能设置入口

1、在报表设计器中打开需要设置的 .rpx 报表文件。
2、点击顶部菜单栏的 【报表】 -> 【报表属性】。
在弹出的属性窗口中,切换到 【导出】 tab 项
在下方选择 【Excel】 页签(根据需要也可选 PDF 或 Word)
找到 【文档密码】 输入框,在此处进行密码配置

1png

三、 静态密码配置

适用场景:所有导出文件使用同一个固定密码,配置简单。
操作方法:
直接在【文档密码】编辑框中输入固定的字符串即可。可显示或隐藏密码。

2png

示例:文档密码输入 raqsoft
效果:导出 Excel 后,打开文件时系统会提示“文档已加密,请输入密码打开文档”,输入 raqsoft 即可打开。

3png

四、 动态密码配置

通用规则:在【文档密码】编辑框中,以 =(等号)开头写入表达式,系统会将表达式的计算结果作为最终密码。
以下提供三种常用的动态密码实现方案:

方案 1:动态密码 - URL 传参方式

实现原理:访问报表时,在 URL 中携带密码参数,报表通过参数接收并作为密码。
操作步骤:
1、报表定义参数:工具栏点击【报表】->【参数编辑】,新增一个参数,如名称为 password,数据类型为“字符串”,参数类型为“普通参数”。

4png

2、配置密码表达式:在【导出】->【Excel】->【文档密码】中,填写表达式 =@password

5png

3、访问方式:在浏览器通过 URL 传入密码值,例如:
http://localhost:6868/demo/reportJsp/showReport.jsp?rpx=1022.rpx&password=123456
(此时导出的文件密码即为 123456)

方案 2:动态密码 - JSP 页面后端生成随机密码

适用场景:不希望密码明文暴露在 URL 中,由后台代码生成随机密码。
操作步骤:
1、报表定义参数:在报表参数编辑中,新增参数(如 arg1 ),用于接收 JSP 传入的密码。
2、配置密码表达式:在【文档密码】中填写 =@arg1
3、【重点】修改 JSP 展现页面
在展现该报表的 JSP 文件(showReport.jsp)中,编写 Java 代码段生成随机密码(如 8 位随机字符串)

6png

将其拼接到 param 参数中传递给报表,同时使用 System.out.println() 打印到后台日志以便管理员查看。

7png

可复制以下代码到 jsp 中。
// 生成 8 位随机密码逻辑
String charPool = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789”;
Random random = new Random();
StringBuilder psb = new StringBuilder();
for(int i = 0; i < 8; i++) {
int index = random.nextInt(charPool.length());
psb.append(charPool.charAt(index));
}
String ps = psb.toString(); // 将密码拼接到参数中

System.out.println(“………. 日志中输出密码…………..”);
System.out.println(ps);
// 将生成的参数拼入 param 对象中
param.append(“arg1”).append(“=”).append(ps);

效果:用户导出文件时,后台控制台会打印出本次生成的密码(如下图所示),用户需向管理员获取该密码才能打开文件。

8png

方案 3:动态密码 - 自定义润乾函数生成密码

适用场景:通过扩展润乾报表自定义函数来实现密码生成,便于在 IDE 端和 Web 端统一管理。
操作步骤:
1、编写 Java 自定义函数:继承润乾报表的 Function 类,实现 calculate() 方法。在方法中生成随机密码,并使用 System.out.println 打印。
具体代码可附件参考 Sim2Function.java
该代码为使用双重检查锁每次计算只生成一次 8 位大小写字母加数字随机串
2、登记自定义函数:
IDE 端:将编译后的 .class 文件拷贝到报表设计器的 ../report/config/classes 目录下;在 ../report/config/classes/config/customFunctions.properties 文件中登记函数名和引用类,如 sim2=0,Sim2Function。

9png

Web 端:将 .class 文件拷贝到 ..demo/WEB-INF/classes 目录下;在 ..demo/WEB-INF/classes/config/customFunctions.properties 中做同样的登记。

3、在报表中配置密码表达式:在【导出】->【Excel】->【文档密码】中填写 =sim2()

10png

效果:报表运行时,后台会自动调用该函数生成唯一密码并输出到控制台日志中,用户导出文件后需查看日志获取密码。

11png

五、 注意事项

1、单元格值作为密码:如果希望用报表中某个单元格的固定值(如客户编号)作为密码,可以直接在【文档密码】表达式中写 =A1(A1 代表对应的单元格坐标)。
2、日志记录:无论是方案 2 还是方案 3,务必保留 System.out.println() 打印密码的代码,否则动态生成密码后将无从知晓,导致文件无法打开。
3、兼容性:此功能对 PDF、Word、Excel 均生效,不同文件类型需在【导出】选项卡下分别对应的页签中设置。

示例 jsp 以及 java 代码可点击下载zip