如何禁用JasperReports生成PDF文件中的文本复制功能
问题解决步骤
1. 修复加密依赖版本冲突
你当前使用的bcprov-jdk14-139.jar版本过老,和JasperReports 6.9.0存在兼容性问题,按以下方式调整依赖:
- 移除现有bcprov-jdk14-139.jar
- 引入
bcprov-jdk15on-1.60.jar,确保服务器类路径下只有一个版本的BouncyCastle包,避免多版本冲突 - 若使用Maven管理项目,确认BouncyCastle依赖的scope没有设为
provided,避免打包时被排除
2. 补全JRXML配置
你当前的配置缺失了用户密码项,JasperReports的PDF加密逻辑要求必须同时配置owner密码和user密码(user密码可设为空)才能触发权限校验,完整配置如下:
<property name="net.sf.jasperreports.export.pdf.encrypted" value="true"/> <property name="net.sf.jasperreports.export.pdf.128.bit.key" value="true"/> <property name="net.sf.jasperreports.export.pdf.owner.password" value="12345"/> <property name="net.sf.jasperreports.export.pdf.user.password" value=""/> <property name="net.sf.jasperreports.export.pdf.permissions.allowed" value="SCREENREADERS"/>
permissions.allowed仅保留SCREENREADERS的配置是正确的,其余所有权限(包括文本复制、修改、打印等)都会被默认禁止。
3. 校验Java导出代码的优先级
如果是通过Java代码触发导出,需要确认导出配置没有覆盖JRXML中的属性,代码中正确的加密配置示例如下:
// 初始化PDF导出器 JRPdfExporter exporter = new JRPdfExporter(); // 配置PDF导出参数 SimplePdfExporterConfiguration pdfConfig = new SimplePdfExporterConfiguration(); pdfConfig.setEncrypted(true); pdfConfig.set128BitKey(true); pdfConfig.setOwnerPassword("12345"); pdfConfig.setUserPassword(""); pdfConfig.setPermissionsAllowed(PdfPermissions.SCREENREADERS); exporter.setConfiguration(pdfConfig); // 其余导出逻辑省略
4. 用官方阅读器测试验证
部分第三方PDF阅读器会默认绕过PDF权限校验,测试时请使用官方Adobe Acrobat Reader打开生成的PDF,确认复制功能是否被禁用。
内容的提问来源于stack exchange,提问作者Jesús Martín
相关产品推荐
相关产品推荐

