要求是一次处理一批PDF,并且成功使用用户密码对每个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没有用所有者密码打开
有人可以指导如何解决此错误/绕过所有者密码?
在这里,我想明确表示我们合法拥有这些PDF,因此不会犯下任何犯罪/黑客行为.
P.S.解决方案不仅限于iText,也可以使用任何其他Java库(免费或许可).
解决方法:
PdfReader有一个未记录的静态布尔变量,名为unethicalreading.出于显而易见的原因,默认情况下此变量设置为false.您可以将此变量设置为true,如下所示:
PdfReader.unethicalreading = true;
从现在开始,PdfReader将忽略所有者密码的存在.如果有用户密码,它只会抛出异常.
使用此风险需要您自担风险.