2014-10-10 83 views
0

我用Apache PdfBox(v1.8.2)lib解密PDF文檔時遇到問題。加密工作正常,但使用相同密碼解密會引發異常。 (Java 1.6)Apache PDFBox - 無法解密PDF

package com.test; 

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.encryption.AccessPermission; 
import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial; 
import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy; 

public class PdfEncDecTest { 

    static String pdfPath = "G:\\files\\filed5b3.pdf"; 
    public final static String PDF_OWNER_PASSWORD = "cd1j"; 
    public final static String PDF_USER_PASSWORD = ""; 

    public static void main(String[] args) throws Exception { 

     PDDocument document = PDDocument.load(pdfPath); 
     AccessPermission ap = new AccessPermission(); 
     ap.setCanPrint(true); 
     ap.setCanExtractContent(false); 
     ap.setCanExtractForAccessibility(false); 
     StandardProtectionPolicy spp = new StandardProtectionPolicy(PDF_OWNER_PASSWORD, PDF_USER_PASSWORD, ap); 
     document.protect(spp); 
     document.save(pdfPath+".pdf"); 
     document.close(); 

     PDDocument doc = PDDocument.load(pdfPath+".pdf"); 
     if(doc.isEncrypted()) { 
      StandardDecryptionMaterial sdm = new StandardDecryptionMaterial(PDF_OWNER_PASSWORD); 
      doc.openProtection(sdm); // org.apache.pdfbox.exceptions.CryptographyException: Error: The supplied password does not match either the owner or user password in the document. 
      doc.decrypt(PDF_OWNER_PASSWORD); // the same like above 
     } 
     doc.close(); 
    } 

} 

我不知道什麼是錯的。在版本1.8.7中,我得到了相同的異常。我已經發布了上面的完整代碼。

Exception in thread "main" org.apache.pdfbox.exceptions.CryptographyException: Error: The supplied password does not match either the owner or user password in the document. 
    at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.prepareForDecryption(StandardSecurityHandler.java:265) 
    at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.decryptDocument(StandardSecurityHandler.java:156) 
    at org.apache.pdfbox.pdmodel.PDDocument.openProtection(PDDocument.java:1595) 
    at org.apache.pdfbox.pdmodel.PDDocument.decrypt(PDDocument.java:942) 
    at com.test.PdfEncDecTest.main(PdfEncDecTest.java:29) 

我已經把樣本項目的GitHub:https://github.com/marioosh-net/pdfbox

+0

請使用當前版本(1.8.7)再試一次。如果它仍然不起作用,請在您的問題中加入例外。 – 2014-10-10 09:08:19

+0

我得到了與1.8.7版本相同的例外... – marioosh 2014-10-10 09:50:23

回答

0

您需要的用戶密碼。

if (doc.isEncrypted()) 
    { 
     StandardDecryptionMaterial sdm = new StandardDecryptionMaterial(PDF_USER_PASSWORD); 
     doc.openProtection(sdm); 
     // don't call decrypt() here 
    } 

即使用戶密碼不爲空也可以使用。用戶密碼是普通人認爲加密的內容,所有者密碼是安全權的加密。

編輯:對不起,我的回答是錯誤的,雖然它有幫助。您可以使用用戶密碼(您可能會獲得受限權利)或所有者密碼(您將獲得完整權限)打開PDF。可能發生的情況是,存在一個將擁有者密碼與40位密鑰(默認爲 )匹配的錯誤。此錯誤目前正在調查中,請參閱PDFBOX-2456並搜索「MD5」。

+0

我需要在pdf上設置唯一的安全權限,用戶密碼必須是空的 – marioosh 2014-10-10 10:38:19

+0

即使這樣,你的代碼仍然是錯誤的,你的文件是用空密碼進行用戶加密的,所以你需要通過那一個,而不是當時的所有者密碼 – 2014-10-10 10:40:41

+0

嗯......你說得對!我檢查過了,非常感謝你! – marioosh 2014-10-10 11:40:42

0

我已經測試你的代碼,它工作的罰款我。

我使用

<dependency> 
      <groupId>org.apache.pdfbox</groupId> 
      <artifactId>pdfbox</artifactId> 
      <version>1.8.7</version> 
</dependency> 
+0

我已經把示例項目github:'https:// github.com/marioosh-net/pdfbox'您可以檢查。它不適用於我:( – marioosh 2014-10-10 10:24:40