10

要求是一次处理一批PDF,并在成功时使用用户密码对它们中的每一个进行加密。

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

我使用iText进行加密,如下所示:

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 not opened with owner password

有人可以指导如何解决此错误/绕过所有者密码吗?

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

PS:解决方案不限于 iText,也可以使用任何其他 Java 库(免费或许可)。

4

1 回答 1

23

PdfReader有一个未记录的static boolean变量,名为unethicalreading. 出于显而易见的原因,此变量false默认设置为。您可以像这样将此变量设置为 true:

PdfReader.unethicalreading = true;

从现在开始,PdfReader 将忽略所有者密码的存在。如果用户密码到位,它只会抛出异常。

使用它需要您自担风险。

于 2013-04-12T10:16:58.893 回答