JavaでPDFに1行または多行テキスト透かしを追加する方法

PDFの透かしは、その内容の下または前にテキストまたは画像を配置することによって、所有者を識別する、機密性を示す、またはPDFファイルの状態を示す手段として機能します。この記事では、無料の[Spire.PDF for Java](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-java.html)を使用して、Javaで**PDFに1行または複数行のテキスト透かしを追加する方法**、および透かしの位置、不透明度、サイズ、および角度を設定する方法を紹介します。

- **[PDFに1行のテキスト透かしを追加する](#pdfに1行のテキスト透かしを追加する)**
- **[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/download/free-spire-pdf-for-java.html) の公式サイトよりzipファイルをダウンロードします。zipファイルを解凍し、libフォルダの下にあるSpire.Pdf.jarファイルを依存関係としてプロジェクトにインポートしてください。

## PDFに1行のテキスト透かしを追加する

> **以下は、Spire.PDF for Javaを使用してPDFに一行のテキスト透かしを追加する手順です。**

- **PdfDocument** クラスのオブジェクトを作成します。
- **PdfDocument.loadFromFile()** メソッドを使用して、PDFファイルを読み込みます。
- 透かしのテキストとフォントを指定する。
- ページの座標系を適切な位置に移動させる。
- テキスト透かしを指定した位置に描画する。
- **PdfDocument.saveToFile()** メソッドを使用してドキュメントを保存する。

**Java**

```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.PdfBrushes;
import com.spire.pdf.graphics.PdfTrueTypeFont;

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

public class addOneLineTextWatermark {

    public static void main(String[] args) {

        //PdfDocument クラスのオブジェクトを作成する
        PdfDocument pdf = new PdfDocument();

        //PDFドキュメントを読み込む
        pdf.loadFromFile("C:/遠距離医療.pdf");

        //PdfTrueTypeFont クラスのオブジェクトを作成する
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic Medium", Font.BOLD,50), true);

        //透かしの文字を設定する
        String text = "サンプル";

        //文字サイズを測定する
        Dimension2D textSize = font.measureString(text);

        //座標系の移動量を計算するために使用する、2つのオフセット変数の値を計算する
        float offset1 = (float)(textSize.getWidth() * Math.sqrt(2) / 4);
        float offset2 = (float)(textSize.getHeight() * Math.sqrt(2) / 4);

        //ドキュメント内の全ページをループする
        for (int i = 0; i < pdf.getPages().getCount(); i++) {

            PdfPageBase page = pdf.getPages().get(i);

            //ページの透明度を設定する
            page.getCanvas().setTransparency(0.5f);

            //座標系を指定した座標で平行移動させる
            page.getCanvas().translateTransform(page.getCanvas().getSize().getWidth() / 2 - offset1 - offset2, page.getCanvas().getSize().getHeight() / 2 + offset1 - offset2);

            //座標系を反時計回りに45度回転させる
            page.getCanvas().rotateTransform(-45);

            //ページ上に透かしテキストを描画する
            page.getCanvas().drawString(text, font, PdfBrushes.getDarkOrange(), 0, 0);
        }


        //ドキュメントを保存する
        pdf.saveToFile("1行のテキスト透かし.pdf");
    }
}
```

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

![PDFに1行のテキスト透かしを追加する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/3d426fdd-02d0-8d04-64e2-684090c274da.png)

## PDFに複数行のテキスト電子透かしを追加する

> **以下は、PDFに複数行のテキスト透かしを追加する手順です。**

- **PdfDocument** クラスのオブジェクトを作成します。
- **PdfDocument.loadFromFile()** メソッドを使用してPDFドキュメントを読み込みます。
- カスタムメソッド **insertMultiLineTextWatermark(PdfPageBase page, String watermarkText, PdfTrueTypeFont font, int rowNum, int columnNum)** を作成し、PDF ページに複数行のテキスト透かしを追加します。パラメータ rowNum と columnNum は、透かしの行と列の番号を指定します。
- ドキュメント内のすべてのページをループして、カスタムメソッド **insertMultiLineTextWatermark()** を呼び出し、各ページに透かしを追加します。
- **PdfDocument.saveToFile()** メソッドを使用してドキュメントを保存します。

**Java**

```Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.PdfBrushes;
import com.spire.pdf.graphics.PdfTilingBrush;
import com.spire.pdf.graphics.PdfTrueTypeFont;

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

public class addMultiLineWatermarkToPDF {

    public static void main(String[] args) {

        //PdfDocumentクラスのインスタンスを作成する
        PdfDocument pdf = new PdfDocument();

        //PDFドキュメントを読み込む
        pdf.loadFromFile("C:/Users/Allen/Desktop/Sample1234.pdf");

        //PdfTrueTypeFontクラスのオブジェクトを作成する
        PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Mincho", Font.BOLD, 20), true);

        //全ページをループする
        for (int i = 0; i < pdf.getPages().getCount(); i++) {

            //insertMultiLineTextWatermark()メソッドを呼び出し、指定されたページにテキスト透かしを追加する
            insertMultiLineTextWatermark(pdf.getPages().get(i), "持ち出し厳禁", font, 3, 3);
        }

        //ドキュメントを保存する
        pdf.saveToFile("多行のテキスト透かし.pdf");
    }

    //ページに複数行のテキスト透かしを挿入するカスタムメソッドを作成する
    static void insertMultiLineTextWatermark(PdfPageBase page, String watermarkText, PdfTrueTypeFont font, int rowNum, int columnNum) {

        //テキストのサイズを測定する
        Dimension2D textSize = font.measureString(watermarkText);

        //座標系の移動量を計算するために使用する、2つのオフセット変数の値を計算する
        double offset1 = textSize.getWidth() * Math.sqrt(2) / 4;
        double offset2 = textSize.getHeight() * Math.sqrt(2) / 4;

        //タイルブラシを作成する
        PdfTilingBrush brush = new PdfTilingBrush(new Dimension((int) page.getActualSize().getWidth() / columnNum, (int) page.getActualSize().getHeight() / rowNum));
        brush.getGraphics().setTransparency(0.5f);
        brush.getGraphics().save();
        brush.getGraphics().translateTransform(brush.getSize().getWidth() / 2 - offset1 - offset2, brush.getSize().getHeight() / 2 + offset1 - offset2);
        brush.getGraphics().rotateTransform(-45);

        //タイルブラシに透かし文字を描画する
        brush.getGraphics().drawString(watermarkText, font, PdfBrushes.getDarkOrange(), 0, 0);
        brush.getGraphics().restore();

        //タイルブラシで矩形（ページ全体を覆う）を描く
        page.getCanvas().drawRectangle(brush, 0, 0, page.getActualSize().getWidth(), page.getActualSize().getHeight());
    }
}
```

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

![PDFに複数行のテキスト電子透かしを追加する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/22e3004b-03ea-7c49-d430-17823eef6aae.png)

> **この記事では、PDFドキュメントに透かしを挿入する手順を紹介しますが、PDFドキュメントの操作についてもっと知りたい場合は、[Spire.PDFフォーラム](https://www.e-iceblue.com/forum/)に移動することができます。**