JavaでPDFドキュメントを暗号化または復号化する方法

契約書や請求書など、数多くの機密ドキュメントがPDFフォーマットで保存されています。これらの機密ドキュメントをインターネット上で共有することは、あなたの許可なく他の人がドキュメントの内容にアクセスできる可能性があるため、リスクとなります。この問題を解決するためには、ドキュメントをパスワードで暗号化することが有効です。今回は、Javaで***PDFドキュメントを暗号化・復号化する方法***を紹介します。

- **[PDFドキュメントの暗号化](#pdfドキュメントの暗号化)**
- **[PDFドキュメントの復号化](#pdfドキュメントの復号化)**

## 【依存関係の追加】
> この方法は、無償のFree Spire.Doc for Javaが必要ですので、先にjarファイルをインポートしてください。

### 1. Maven
Maven を使用している場合、プロジェクトの pom.xml ファイルに以下のコードを追加することで、簡単にアプリケーションに JAR ファイルをインポートすることができます。
```XML
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.doc.free</artifactId>
        <version>5.2.0</version>
    </dependency>
</dependencies>
```
### 2. 公式サイトよりJarファイルをダウンロード
まず、[Free Spire.Doc for Java](https://jp.e-iceblue.com/introduce/free-spire-doc-for-java.html) の公式サイトよりzipファイルをダウンロードします。zipファイルを解凍し、libフォルダの下にあるSpire.Doc.jarファイルを依存関係としてプロジェクトにインポートしてください。
## PDFドキュメントの暗号化
PDFドキュメントは、ドキュメントを開くためのパスワードと、権限パスワードの2種類のパスワードで暗号化することができます。
#### ドキュメントを開くためのパスワード
ドキュメントを開くためのパスワードは、ユーザーパスワードとも呼ばれ、PDFを開くために必要です。
#### 権限パスワード
権限パスワードは、マスターパスワードまたはオーナーパスワードとも呼ばれ、PDFの権限設定を変更するために使用されます。このパスワードによって、印刷、編集、内容のコピーなど、PDF の特定の機能を制限することができます。

PDFドキュメントが2種類のパスワードで暗号化されている場合、受信者はどちらのパスワードでもPDFを開くことができます。ただし、設定した制限を変更する必要がある場合は、権限パスワードの入力が必要になります。

Spire.PDFは、開発者がPdfDocument.getSecurity().encrypt(openPassword, permissionPassword, PdfPermissionsFlags, PdfEncryptionKeySize) メソッドを使用し、ドキュメントを開くためのパスワードと権限パスワードを使ってPDFドキュメントを暗号化することを可能にします。
> 以下は、この機能を実装するための詳細な手順です。

- PdfDocumentクラスのインスタンスを生成します。
- PdfDocument.loadFromFile()メソッドを使用してPDFドキュメントを読み込みます。
- PdfDocument.getSecurity().encrypt(openPassword, permissionPassword, PdfPermissionsFlags, PdfEncryptionKeySize) メソッドを使用して、ドキュメントを開くためのパスワードと権限パスワードでPDFを暗号化します。
- PdfDocument.saveToFile()メソッドを使用して、結果のドキュメントを保存します。

***Java***
```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.security.PdfEncryptionKeySize;
import com.spire.pdf.security.PdfPermissionsFlags;
import java.util.EnumSet;

public class Encryption {
    public static void main(String []args){
        //PdfDocumentのインスタンスを作成する
        PdfDocument pdf = new PdfDocument();

        //ドキュメントを読み込む
        pdf.loadFromFile("例.pdf");

        //ドキュメントを開くためのパスワードと権限パスワードでPDFを暗号化する
        pdf.getSecurity().encrypt("openPassword", "permissionPassword", EnumSet.of(PdfPermissionsFlags.Print, PdfPermissionsFlags.Copy_Content), PdfEncryptionKeySize.Key_256_Bit);

        //ドキュメントを保存する
        pdf.saveToFile("暗号化.pdf");
        pdf.close();
    }
}
```
## PDFドキュメントの復号化
PdfDocument.getSecurity().encrypt(openPassword, permissionPassword, PdfPermissionsFlags, PdfEncryptionKeySize, originalPermissionPassword) メソッドを使用して、それらのドキュメントを開くためのパスワードと権限パスワードを空として設定することにより、暗号化PDFドキュメントを復号することができます。詳細な手順は以下のとおりです。
> 以下は、この操作の詳細な手順です。

- PdfDocument クラスのインスタンスを作成します。
- PdfDocument.loadFromFile(filePath, password) メソッドを使用して、暗号化されたPDFドキュメントを読み込みます。
- PdfDocument.getSecurity().encrypt(openPassword, permissionPassword, PdfPermissionsFlags, PdfEncryptionKeySize, originalPermissionPassword) メソッドを使用して、ドキュメントを開くためのパスワードと権限パスワードを空にしてドキュメントを復号化してください。
- PdfDocument.saveToFile()メソッドを使用して、結果のPDFドキュメントを保存します。

***Java***
```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.security.PdfEncryptionKeySize;
import com.spire.pdf.security.PdfPermissionsFlags;

public class Decryption {
    public static void main(String []args) throws Exception {
        //PdfDocumentのインスタンスを作成する
        PdfDocument pdf = new PdfDocument();

        //暗号化されたPDFドキュメントを読み込む
        pdf.loadFromFile("暗号化ドキュメント.pdf", "openPassword");

        //ドキュメントを開くためのパスワードと権限パスワードを空にして、PDFを復号化する
        pdf.getSecurity().encrypt("", "", PdfPermissionsFlags.Default, PdfEncryptionKeySize.Key_256_Bit, "permissionPassword");

        //ドキュメントを保存する
        pdf.saveToFile("復号化.pdf");
        pdf.close();
    }
}
```