如何用iText创建支持双密码、多权限的加密PDF?
解决iText设置PDF多权限加密的问题
嘿,你遇到的问题很典型——两次调用setEncryption()会直接覆盖之前的配置,所以最后只有第二次的屏幕阅读器权限生效了。要同时设置打印和屏幕阅读器权限,你需要把这两个权限常量按位合并,只调用一次setEncryption()就好。
修正后的代码
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PdfWriter writer = PdfWriter.getInstance(document, byteArrayOutputStream); writer.setPdfVersion(PdfWriter.VERSION_1_7); // 用按位或运算符(|)合并多个权限 int combinedPermissions = PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_SCREENREADERS; writer.setEncryption(firstPass, secondPass, combinedPermissions, PdfWriter.ENCRYPTION_AES_256);
关键说明
- iText中的权限常量是二进制位标识,每个权限对应一个独立的位。用
|运算符可以把多个权限的位同时置为1,这样就能同时开启多个权限了。 - 这里的
firstPass是用户密码(用于打开PDF),secondPass是所有者密码(拥有修改权限、移除加密等更高权限),别搞混两者的顺序哦。 - 你选择的
ENCRYPTION_AES_256加密方式需要PDF版本1.7及以上,所以setPdfVersion(PdfWriter.VERSION_1_7)的设置是正确的,能保证兼容性。
这样修改后,生成的PDF就会同时支持打印和屏幕阅读器权限,并且可以用两个不同的密码打开啦。
内容的提问来源于stack exchange,提问作者Liz Lamperouge




