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

Java 如何真正保护PDF,最好使用ItextPDF?,java,pdf,itext,Java,Pdf,Itext,我一直在努力在PDF上设置密码,以防止复制/粘贴并允许打印,添加水印并设置所有者密码以防止进一步更改 一切正常,没有问题 然后我下载了这个免费15天的pdf删除工具,a-pdf。眨眼间,它将删除所有保护,无论密码的复杂性如何(尝试使用50个字符长度将删除所有类型的字符) 我看到itextPDF中还有其他方法可以加密文档。我使用了以下方法: File f = new File("C:/TEMP/zip/waterMarked.pdf"); String hardPassword = "D 5Ba

我一直在努力在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代码的影响吗?

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

根据您的受众,有几种解决方案(或多或少与iText相关):
简单的PDF加密(有上述问题),若你们的读者很广泛,比如你们在网站上发表论文;第三方DRM解决方案,更复杂,需要在用户计算机上安装各种插件;证书加密(不确定iText是否支持)同样复杂,要求每个用户都有数字证书,并且为每个用户定义了文档访问权限。最后两个选项在受控的企业环境中工作。

您面临的问题是您正在执行的类型或限制所固有的:为了显示PDF,计算机需要访问与从文档复制文本所需的几乎相同的数据。您无法可靠地允许打印并阻止文档的复制和粘贴。你所做的一切都只是增加了线索的障碍。请不要创建防止复制的PDF。为了从你的文档中复制文本而不得不破解OCR是非常烦人的,不管你是否阻止我,我都会这么做。谢谢你的详细回答!IText支持证书加密,但正如您所说的,所有这些都很难管理,而且目标受众太广泛,无法以这种方式实施安全性。我试图改善已经存在的东西,但我想我会满足于现状。正如Joachim解释的那样,客户端仍然需要能够无限制地阅读,因此保护仅仅是来自阅读应用程序的善意。谢谢你们两位的回答!一旦你允许用户看到文档,任何复制文本的解决方案都会失败。即使有一些仙尘,以避免他们能够复制数据,屏幕截图和OCR软件将工作得非常好