如何真正使用ItextPDF来保护PDF?

我一直致力于在PDF上设置密码以防止复制/粘贴并允许打印,添加水印并设置所有者密码以防止进一步更改。

一切都按预期运作良好,没有问题。

然后我免费下载了这个为期15天的pdf清除工具,a-pdf。 眨眼间它会删除所有保护,无论密码的复杂程度如何(尝试使用50个字符长度的所有类型的字符)。

我看到itextPDF中还有其他方法来加密文档。 我使用了以下内容:

File f = new File("C:/TEMP/zip/waterMarked.pdf"); String hardPassword = "D 5BaIZQ@ CqAk+NQCW)7Dkgb@i&02ifu!2TMX*d 0TGK(j(Kq"; byte[] hardPasswordByte = hardPassword.getBytes(); PdfReader reader = new PdfReader("C:/TEMP/zip/Original_document-9.pdf"); FileOutputStream out = new FileOutputStream(f); PdfStamper stamp = new PdfStamper(reader, out); //first argument is the user password. If set to something it asks for password when opening file, not wanted. stamp.setEncryption(null, hardPasswordByte, PdfWriter.ALLOW_PRINTING, true); //do stuff on the stamper, save file. 

有谁知道从Java代码保护PDF文档的更好方法?

PDF文件支持2个密码:用户密码和所有者密码。 如果用户知道任何这些密码,则可以查看PDF文件。 如果文件具有用户密码,则在使用PDF查看器打开文件时,查看器会要求用户输入密码,并且用户或所有者密码将起作用。 如果文件只有所有者密码,则会自动显示文档,并在尝试更改文件的访问权限时需要密码。 这是PDF规范建议的操作流程,但实际上它的工作原理如下:如果文件受用户密码保护,则密码破解需要powershell方法,密码越长,破解所需的时间越长。 问题是您的真实用户需要密码来打开文件。 如果文件仅受所有者密码保护,则存在默认解密密钥(请记住,任何查看者都可以在不请求密码的情况下显示PDF文件),处理PDF文件的应用程序决定是否尊重文档访问权限。 文件解密后,保存时不加密,输出文件不再有密码。 由于您的文档只有所有者密码,因此该工具使用默认解密密钥可以毫无问题地删除它。

根据您的受众,有一些解决方案(或多或少与iText相关):简单的PDF加密(上述问题),如果您的受众普遍存在,例如您在网站上发布论文; 第三方DRM解决方案,更复杂,需要在用户的计算机上安装各种插件; 证书加密(不确定iText是否支持它),再次复杂,要求每个用户都拥有数字证书,并为每个用户定义文档访问权限。 最后两个选项适用于受控企业环境。