Java 如何读取使用未知随机所有者密码创建的PDF?

Java 如何读取使用未知随机所有者密码创建的PDF?,java,pdf,passwords,itext,aspose,Java,Pdf,Passwords,Itext,Aspose,要求是一次处理一批PDF,并在成功后使用用户密码对每个PDF进行加密 然而,这些PDF之前是用随机生成的动态所有者密码(任何人都不知道)加密的,以防止任何编辑 我用于加密,如下所示: byte[] userPass = "user".getBytes(); byte[] ownerPass = "owner".getBytes(); PdfReader reader = new PdfReader("Misc.pdf"); PdfStamper stamper = new PdfStamper

要求是一次处理一批PDF,并在成功后使用用户密码对每个PDF进行加密

然而,这些PDF之前是用随机生成的动态所有者密码(任何人都不知道)加密的,以防止任何编辑

我用于加密,如下所示:

byte[] userPass = "user".getBytes();
byte[] ownerPass = "owner".getBytes();
PdfReader reader = new PdfReader("Misc.pdf");

PdfStamper stamper = new PdfStamper(reader,
            new FileOutputStream("Processed_Encrypted.pdf"));
stamper.setEncryption(userPass, ownerPass,
PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128
        | PdfWriter.DO_NOT_ENCRYPT_METADATA);
stamper.close();
reader.close();
但此代码抛出一个
com.itextpdf.text.exceptions.BadPasswordException:PdfReader未使用所有者密码打开

能否有人指导如何解决此错误/绕过所有者密码

在此,我想明确指出,我们合法拥有这些PDF,因此没有犯罪/黑客行为


p.S.:解决方案不仅限于iText,还可以使用任何其他Java库(免费或许可)

PdfReader
有一个名为
unethicalreading
的未记录的
静态布尔变量。出于显而易见的原因,此变量默认设置为
false
。您可以将此变量设置为true,如下所示:

PdfReader.unethicalreading = true;
从现在起,PdfReader将忽略所有者密码的存在。只有用户密码存在时,它才会抛出异常


使用此选项的风险自负。

如果您因许可原因而无法使用iText 2.1.7,请查看此替代解决方案