天天看點

PDFBox加密和解密PDF檔案

PDF常用的三種加密方式:

  1. 密碼加密
  2. 證書加密
  3. Adobe LiveCycle Rights Management

密碼加密: 作為第一代PDF安全加密方式,到現在也一直廣泛應用。密碼加密分為:使用者密碼(user password)、所有者密碼(owner password)。

  • 使用者密碼:要求使用者在打開檔案時,需要輸入密碼
  • 所有者密碼:打開PDF檔案并進行閱讀,并不需要所有者密碼,隻有更改權限設定或進行受限制操作時(列印,編輯和複制PDF中的内容),才需要輸入所有者密碼。

如果使用兩種類型的密碼保護PDF,則可以使用任一密碼打開它。但是,隻有所有者密碼才允許使用者更改受限制的功能。這種方式相對簡單,加密算法和解密算法,在一些開源的PDF解析庫(PDFBox)中,就可以很友善的擷取到。

證書加密: 現在證書被大家廣泛的應用,如:我們每天會通路大量的HTTPS網站,而這些網站的Web伺服器正在使用基于證書的SSL加密來防止竊聽和篡改。 在PDF檔案中,我們也可以通過證書加密來確定PDF的安全。數字簽名可確定收件人證明檔案來自制作者,而證書加密可確定隻有預期的收件人才能檢視内容。

使用證書保護PDF時,可以指定收件人并為每個收件人或使用者組定義檔案通路級别。類似與密碼加密的權限密碼,可以進行權限限制,例如,允許一個組簽名并填寫表單,另一個組可以編輯文本或删除頁面。您可以從可信任身份清單,磁盤上的檔案,LDAP伺服器或Windows證書存儲區(僅限Windows)中選擇證書。始終将您的證書包含在收件人清單中,以便以後可以打開該文檔。

這種方式,稍微複雜一些,在一些開源的PDF解析庫(PDFBox)中,可以擷取到。

Adobe LiveCycle Rights Management 是一個基于伺服器的安全系統,可以對PDF進行動态控制。Adobe LiveCycle Rights Management ES可以配置為與LDAP,ADS和其他企業系統一起運作。Adobe LiveCycle Rights Management ES 提供的政策存儲在伺服器上,可以從伺服器重新整理。使用者連接配接到Adobe LiveCycle Rights Management ES以使用這些政策。

安全政策存儲在運作Adobe LiveCycle Rights Management ES 的伺服器上,但PDF不存儲。在某些情況下,使用者需要連接配接到伺服器才能打開或繼續使用應用了安全政策的PDF。

在本文中,我們将介紹PDFBox庫如何使用密碼加密保護PDF,以及如何使用PDFBox讀取PDF,并移除加密的PDF的密碼保護。

使用PDFBox加密PDF

PDFBox使用了2個重要的類來加密PDF檔案: 為了使用PDFBox加密PDF,使用了兩個類-

1- AccessPermission –此類表示對文檔的通路權限,其中包括以下權限:

  • 列印檔案
  • 修改檔案内容
  • 複制或提取文檔内容
  • 添加或修改注釋
  • 填寫互動式表格字段
  • 提取文本和圖形以友善視覺障礙人士使用
  • 組裝檔案
  • 列印品質下降

2- StandardProtectionPolicy –此類表示要添加到文檔中以基于密碼的保護的保護政策。此類的構造方法将AccessPermission類對象,所有者密碼和使用者密碼作為參數。

PDF加密所需的兩個密碼是: - 使用者密碼 –打開和檢視具有受限權限的檔案。 - 所有者密碼 –擁有所有權限通路檔案。

使用PDFBox Java程式加密的PDF

詳細加密代碼:

public static void encrypt() throws InvalidPasswordException, IOException {

        String srcpath = "d:/t/pdf/security/a.pdf";
        String despath = "d:/t/pdf/security/a-1.pdf";
        String ownerPassWord = "123";
        String userPassWord = "456";
        File file = new File(srcpath);
        // long start = System.currentTimeMillis();
        PDDocument load = PDDocument.load(file);

        AccessPermission permissions = new AccessPermission();
        // 是否可以插入/删除/旋轉頁面
        permissions.setCanAssembleDocument(false);
        // 是否可以複制和提取内容
        permissions.setCanExtractContent(false);

        permissions.setCanExtractForAccessibility(false);
        // 設定使用者是否可以填寫互動式表單字段(包括簽名字段)
        permissions.setCanFillInForm(false);
        // 設定使用者是否可以修改文檔
        permissions.setCanModify(false);
        // 設定使用者是否可以添加或修改文本注釋并填寫互動式表單字段,如果canModify()傳回true,則建立或修改互動式表單字段(包括簽名字段)。
        permissions.setCanModifyAnnotations(false);
        // 設定使用者是否可以列印。
        permissions.setCanPrint(false);
        // 設定使用者是否可以降級格式列印文檔
        permissions.setCanPrintDegraded(false);

        StandardProtectionPolicy p = new StandardProtectionPolicy(ownerPassWord, userPassWord, permissions);
        SecurityHandler sh = new StandardSecurityHandler(p);
        sh.prepareDocumentForEncryption(load);
        PDEncryption encryptionOptions = new PDEncryption();
        encryptionOptions.setSecurityHandler(sh);

        load.setEncryptionDictionary(encryptionOptions);
        load.save(despath);

    }
           

使用PDFBox Java程式打開加密的PDF

如果要打開使用PDFBox進行密碼保護的PDF,則可以使用PDDocument類的load方法并傳遞解密所需的密碼。

PDDocument document = PDDocument.load(new File(ENCRYPTED_PDF), OWNER_PASSWORD);

詳細解密代碼:

public static void decrypt() throws InvalidPasswordException, IOException {
        String srcpath = "d:/t/pdf/security/a-1.pdf";
        String despath = "d:/t/pdf/security/a-3.pdf";
        String ownerPassWord = "123";

        File file = new File(srcpath);
        PDDocument load = PDDocument.load(file, ownerPassWord);
        load.setAllSecurityToBeRemoved(true);
        load.save(despath);
    }