以下
this answer我试图用pdfBox解密pdf文档:
PDDocument pd = PDDocument.load(path); if(pd.isEncrypted()){ try { pd.decrypt(""); pd.setAllSecurityToBeRemoved(true); } catch (Exception e) { throw new Exception("The document is encrypted,and we can't decrypt it."); }
这导致
Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider at org.apache.pdfBox.pdmodel.PDDocument.openProtection(PDDocument.java:1601) at org.apache.pdfBox.pdmodel.PDDocument.decrypt(PDDocument.java:948) ... Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider ...
路径是正确的,所以我不知道发生了什么.
此外,如果我看看PDDocument.decrypt(String pw)方法,我发现这个:
这将解密文档.仅为兼容性原因提供此方法.用户应该使用新的安全层,特别是openProtection方法.
这是什么意思?有人可以举例说明如何使用pdfBox正确解密pdf文档?
解决方法
请参阅依赖关系列表:
https://pdfbox.apache.org/1.8/dependencies.html
https://pdfbox.apache.org/1.8/dependencies.html
你需要使用bouncycastle库.
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15</artifactId> <version>1.44</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcmail-jdk15</artifactId> <version>1.44</version> </dependency>
在当前版本(1.8.9)中确实已经不再采用decrypt()调用.使用
pd.openProtection(new StandardDecryptionMaterial(""));
代替.
附加建议:下载源代码包.你会发现很多例子可以帮助你进一步.