如何真正使用ItextPDF保护PDF?

时间:2011-07-12 13:24:15

标签: java pdf itext

我一直致力于在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.

有谁知道更好的方法来保护PDF文档免受Java代码的侵害?

1 个答案:

答案 0 :(得分:11)

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

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