如何真正保护PDF文件,最好使用ItextPDF?

5

我一直在为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文档?


7
你面临的问题源于你正在进行的类型或限制:要显示PDF文件,计算机需要访问与从文档中复制文本所需的几乎相同的数据。你无法可靠地允许打印并防止从文档中复制和粘贴。你所尝试的一切都只是提高了提示的门槛。 - Joachim Sauer
3
请不要创建禁止复制的PDF文档。即使您试图防止我复制文本,我仍然会使用OCR来复制您的文档,这样做非常麻烦。请让您的文档更易于复制。 - endolith
1个回答

12

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

根据您的受众群体,有几种解决方案(与iText相关或不相关):对于广泛的受众群体,例如在网站上发布论文,可以使用简单的PDF加密(具有上述问题);第三方DRM解决方案较为复杂,需要在用户计算机上安装各种插件;证书加密(不确定iText是否支持)同样很复杂,需要每个用户都拥有数字证书,并且为每个用户定义文档访问权限。最后两个选项适用于受控企业环境。


1
感谢您详细的回答!IText支持证书加密,但正如您所说,这一切都相当复杂,而且目标受众太广泛,无法强制实施安全措施。我试图改善已有的内容,但我想我会接受现状。正如Joachim解释的那样,客户端仍然需要能够无限制地阅读,因此保护仅仅是来自阅读应用程序的良好意愿。感谢你们两个的回答! - IceGras
4
只要用户可以看到文档,任何复制文本的解决方案都会彻底失败。即使有某些神奇的方法来避免他们复制数据,截屏和OCR软件仍然可以完美运行。 - Voo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接