pdfbox:尝试解密 PDF
pdfbox: trying to decrypt PDF
以下 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 文档吗?
要使用 openProtection
方法,您必须提供 DecryptionMaterial
的实例。在您的密码保护情况下,它将是 StandardDecryptionMaterial(来自 API):
PDDocument doc = PDDocument.load(in);
StandardDecryptionMaterial dm = new StandardDecryptionMaterial("password");
doc.openProtection(dm);
此外,使用Encryption/Signing还需要完成PDFBox的Bouncy Castle依赖。参见 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(""));
相反。
补充建议:下载源码包。您会发现许多示例,这些示例将进一步帮助您。
以下 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 文档吗?
要使用 openProtection
方法,您必须提供 DecryptionMaterial
的实例。在您的密码保护情况下,它将是 StandardDecryptionMaterial(来自 API):
PDDocument doc = PDDocument.load(in);
StandardDecryptionMaterial dm = new StandardDecryptionMaterial("password");
doc.openProtection(dm);
此外,使用Encryption/Signing还需要完成PDFBox的Bouncy Castle依赖。参见 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(""));
相反。
补充建议:下载源码包。您会发现许多示例,这些示例将进一步帮助您。