PDFのレイヤーの追加・非表示・削除（Java)

PDFレイヤーは、PDFドキュメントのためのインタラクティブな機能です。レイヤーは、テキスト、画像、その他の要素を追加することができる独立した重ね合わせページと見なすことができます。レイヤーは名前を持つことができ、ユーザーはこのレイヤーが見えるか見えないかを変更することができます。この記事では、無料のFree Spire.PDF for Javaを使用して、**PDFドキュメントにレイヤーを追加、非表示、削除する方法**を説明します。

- **[PDFにレイヤーを追加する](#pdfにレイヤーを追加する)**
- **[PDFのレイヤーの可視性を設定する](#pdfのレイヤーの可視性を設定する)**
- **[PDFからレイヤーを削除する](#pdfからレイヤーを削除する)**

## 【依存関係の追加】

> **この方法は、無料のFree Spire.PDF 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.pdf.free</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>
```

### 2. 公式サイトよりJarファイルをダウンロード

まず、[Free Spire.PDF for Java](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-java.html) の公式サイトよりzipファイルをダウンロードします。zipファイルを解凍し、libフォルダの下にあるSpire.Pdf.jarファイルを依存関係としてプロジェクトにインポートしてください。

## PDFにレイヤーを追加する

> **以下は、Spire.PDF for Javaを使用してPDFドキュメントにレイヤーを作成する手順です。**

- **PdfDocument** クラスのオブジェクトを作成し、PDF ファイルを読み込みます。
- **Document.getLayers().addLayer(string layerName)** メソッドを使用して PdfLayer クラスのオブジェクトを作成します。
- **PdfLayer.createGraphics()** メソッドを使用して、レイヤーのためのキャンバスを作成します。
- テキスト、画像、その他の要素をキャンバスに描画します。
- **PdfDocument.saveToFile()** メソッドを使用してPDFファイルを保存します。

**Java**

```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.*;
import com.spire.pdf.graphics.layer.PdfLayer;

import java.awt.*;
import java.awt.geom.Dimension2D;
import java.io.IOException;

public class addLayerToPDF {

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

        //PdfDocument クラスのオブジェクトを作成し、PDFファイルを読み込む
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("C:\\Sample.pdf");

        //addLayerWatermarkメソッドを呼び出して透かしレイヤーを追加する
        addLayerWatermark(pdf);

        //addLayerImage メソッドを呼び出して、イメージレイヤーを追加する
        addLayerImage(pdf);

        //PDFファイルを保存する
        pdf.saveToFile("レイヤーの追加.pdf");
        pdf.close();
    }

    private static void addLayerWatermark(PdfDocument doc) throws IOException {

        //「透かし」という名前のレイヤーを作成する
        PdfLayer layer = doc.getLayers().addLayer("透かし");

        //フォントを作成する
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Mincho", Font.BOLD,48),true);

        //透かしのテキストを指定する
        String watermarkText = "非公開";

        //テキストの大きさを取得する
        Dimension2D fontSize = font.measureString(watermarkText);

        //2つのオフセットを計算する
        float offset1 = (float)(fontSize.getWidth() * Math.sqrt(2) / 4);
        float offset2 = (float)(fontSize.getHeight() * Math.sqrt(2) / 4);

        //ページ数を取得する
        int pageCount = doc.getPages().getCount();

        //2つの変数を宣言する
        PdfPageBase page;
        PdfCanvas canvas;

        //ページをループする
        for (int i = 0; i < pageCount; i++) {

            page = doc.getPages().get(i);

            //レイヤーからキャンバスを作成する
            canvas = layer.createGraphics(page.getCanvas());
            canvas.translateTransform(canvas.getSize().getWidth() / 2 - offset1 - offset2, canvas.getSize().getHeight() / 2 + offset1 - offset2);
            canvas.setTransparency(0.4f);
            canvas.rotateTransform(-45);

            //レイヤーのキャンバスに文字列を描く
            canvas.drawString(watermarkText, font, PdfBrushes.getDarkBlue(), 0, 0);
        }
    }

    private static void addLayerImage(PdfDocument doc) {

        //「イメージ 」という名前のレイヤーを作成する
        PdfLayer layer = doc.getLayers().addLayer("イメージ");

        //ページの大きさを取得する
        Dimension2D size = doc.getPages().get(0).getSize();

        //xとyの初期値を指定する
        float x = 300;
        float y = 90;

        //ページ数を取得する
        int pageCount = doc.getPages().getCount();

        //2つの変数を宣言する
        PdfPageBase page;
        PdfCanvas canvas;

        //ページをループする
        for (int i = 0; i < pageCount; i++) {

            //レイヤーに画像を描画する
            PdfImage pdfImage = PdfImage.fromFile("C:\\Sample.jpg");
            float width = pdfImage.getWidth();
            float height = pdfImage.getHeight();
            page = doc.getPages().get(i);
            canvas = layer.createGraphics(page.getCanvas());
            canvas.drawImage(pdfImage, x, y, width, height);

            //レイヤーに線を描く
            PdfPen pen = new PdfPen(PdfBrushes.getDarkGray(), 2f);
            canvas.drawLine(pen, x, y + height + 5, size.getWidth() - x, y + height + 2);
        }
    }
}
```

### 【元のPDFドキュメント】

![PDF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/aa83774a-bbb8-5a23-f79b-63445a13a5ed.png)

### 【結果のPDFファイル】

![PDFにレイヤーを追加する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/7d40ec2c-8677-b754-457c-a7c9baf6ab56.png)

## PDFのレイヤーの可視性を設定する

> **以下は、Spire.PDF for Javaを使用してPDFのレイヤーの可視性を設定する手順です。**

- **PdfDocument** クラスのオブジェクトを作成し、レイヤーを含む既存のPDFファイルを読み込みます。
- **PdfDocument.getLayers().get(int index)** メソッドを使用して、PDF内の特定のレイヤーを取得します。
- **PdfLayer.setVisibility()** メソッドを使用して、レイヤーの可視性を設定します。
- **PdfDocument.saveToFile()** メソッドを使用して、別のPDFファイルにドキュメントを保存します。

**Java**

```Java
import com.spire.pdf.FileFormat;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.graphics.layer.PdfVisibility;

public class setLayerVisibility {
    public static void main(String[] args) {

        //PdfDocumentクラスオブジェクトを作成し、PDFファイルを読み込む
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("レイヤーの追加.pdf");

        //最初のレイヤーの可視性を「Off」に設定する
        pdf.getLayers().get(0).setVisibility(PdfVisibility.Off);

        //PDFファイルを保存する
        pdf.saveToFile("レイヤーの非表示.pdf", FileFormat.PDF);
        pdf.dispose();
    }
}
```

### 【結果のPDFファイル】

![PDFのレイヤーの可視性を設定する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/4f75fdcf-4639-296c-a53e-4d83560c96cc.png)
 
## PDFからレイヤーを削除する

> **PDFの特定のレイヤーを削除する手順は以下のとおりです。**

- **PdfDocument** クラスのオブジェクトを作成します。
- **PdfDocument.loadFromFile()** メソッドを使用してレイヤーを含む PDF ファイルを読み込みます。
- **PdfDocument.getLayers()** メソッドを使用して、ドキュメントからレイヤーの集合を取得します。
- **PdfLayerCollection.removeLayer()** メソッドを使用して、特定のレイヤーを削除します。
- **PdfDocument.saveToFile()** メソッドを使用して、ドキュメントを保存します。

**Java**

```Java
import com.spire.pdf.PdfDocument;

public class deleteLayers {

    public static void main(String[] args) {

        //PdfDocument クラスのオブジェクトを作成し、PDF ファイルを読み込む
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("レイヤーの追加.pdf");

        //特定のレイヤーをその名前で削除する
        pdf.getLayers().removeLayer("watermark");

        //PDFファイルを保存する
        pdf.saveToFile("レイヤーの削除.pdf");
        pdf.close();
    }
}
```

### 【結果のPDFファイル】

![PDFからレイヤーを削除する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/0b18ffe9-1ffa-70ad-3fd5-b9d888b75b6a.png)


> **この記事を読んで、PDFのレイヤーの基本的な扱い方はご理解いただけたかと思います。もし、他にわからないことがあれば、[Spire.PDFフォーラム](https://www.e-iceblue.com/forum/)で詳細をご覧になってください。**