【Java】PDFにテキスト透かしを挿入する方法

PDFのテキスト透かしは、各PDFページの背景として表示されるデジタルテキストマークです。スタンプとは異なり、テキストの透かしはページに統合されており、直接削除することはできません。彼らはしばしば文書情報、会社情報、著者情報および文書の他の多くの属性を表示するために使用されます。さらに、テキスト透かしはまた、使い過ぎからPDF文書を保護することができます。テキストの透かしは、多くの場合、Web上で公開されている元のコンテンツを使用してPDF文書で使用されています。この記事では、無料の[Free Spire.PDF for Java](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-java.html)を使用して**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/download/free-spire-pdf-for-java.html)の公式サイトよりzipファイルをダウンロードします。zipファイルを解凍し、libフォルダの下にあるSpire.Pdf.jarファイルを依存関係としてプロジェクトにインポートしてください。
## PDF文書に単一のテキスト透かしを挿入する
単一のテキスト透かしは、ページの中央に一度だけ表示されるテキスト透かしです。単一のテキスト透かしを挿入する手順は次のとおりです。
- **PdfDocument**クラスのインスタンスを作成します。
- **PdfDocument.loadFromFile()** メソッドでPDFドキュメントを読み込む。
- フォントオブジェクトを作成します。
- ページをループして、各ページに透かしを挿入します。
- **PdfDocument.getPages().get()** メソッドを使用してページを取得します。
- **PdfPageBase.getCanvas().translateTransform()** メソッドで初期座標を設定します。
- **PdfPageBase.getCanvas().rotateTransform()** メソッドで回転角度を設定します。
- **PdfPageBase.getCanvas().drawString()** メソッドでページ上に透かしテキストを描画します。
- **PdfDocument.saveToFile()** メソッドでドキュメントを保存します。

**Java**
```Java
import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import com.spire.pdf.htmlconverter.qt.Size;

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

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

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

        //PDF文書を読み込む
        pdf.loadFromFile("私たちはいつも気を散らす.pdf");

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

        //ページをループして、各ページに透かしを挿入する
        String text = "サンプル";
        float set1 = (float) (font.getSize()* Math.sqrt(2));
        float set2 = (float) (font.getHeight() * Math.sqrt(2)/4);
        for (int i = 0; i < pdf.getPages().getCount(); i++){
            //ページを取得する
            PdfPageBase page = pdf.getPages().get(i);
            //透かしの透明度を設定する
            page.getCanvas().setTransparency(0.8f);
            //初期座標を設定する
            page.getCanvas().translateTransform(page.getCanvas().getSize().getWidth()/2 - (set1 + set2), page.getCanvas().getSize().getHeight()/2 + set1 - set2);
            //回転角度を設定する
            page.getCanvas().rotateTransform(-45);
            //透かしのテキストを描画する
            page.getCanvas().drawString(text, font, PdfBrushes.getDarkGray(), 0, 0);
        }

        //ファイルを保存する
        pdf.saveToFile("単一のテキスト透かし.pdf");
    }
}
```
![2023-02-03_165239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/f2116f45-e95e-037f-a1f3-3921b1164e0c.png)

## PDF文書にタイル型のテキスト透かしを挿入する
テキスト透かしは、ページ上にタイル状に表示することも可能です。タイル型のテキスト透かしを挿入する詳しい手順は、以下のとおりです。
- **PdfDocument**クラスのインスタンスを生成します。
- **PdfDocument.loadFromFile()** メソッドを使用してPDFドキュメントを読み込みます。
- 透かしを挿入するためにドキュメント内のページをループします。
- **PdfDocument.getPages().get()** メソッドを使用して、ドキュメント内のページを取得します。
- カスタムメソッド **insertWatermark()** を使って、テキスト透かしを挿入します。
- **PdfDocument.saveToFile()** メソッドを使用してドキュメントを保存します。

**Java**
```Java
import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import java.awt.*;
import java.awt.geom.*;


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

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

        //PDF文書を読み込む
        pdf.loadFromFile("私たちはいつも気を散らす.pdf");

        //透かしを挿入するために、ドキュメント内のすべてのページをループする
        for (int i = 0; i < pdf.getPages().getCount(); i++){
            PdfPageBase pageBase = pdf.getPages().get(i);
            insertWatermark(pageBase, "サンプル");
        }

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

    static void insertWatermark(PdfPageBase page, String watermark) {
        Dimension2D dimension2D = new Dimension();
        dimension2D.setSize(page.getCanvas().getClientSize().getWidth() / 2, page.getCanvas().getClientSize().getHeight() / 3);
        PdfTilingBrush brush = new PdfTilingBrush(dimension2D);
        brush.getGraphics().setTransparency(0.3F);
        brush.getGraphics().save();
        brush.getGraphics().translateTransform((float) brush.getSize().getWidth() / 2, (float) brush.getSize().getHeight() / 2);
        brush.getGraphics().rotateTransform(-45);
        PdfCjkStandardFont font = new PdfCjkStandardFont(PdfCjkFontFamily.Heisei_Mincho_W_3,30);
        brush.getGraphics().drawString(watermark, font, PdfBrushes.getViolet(), 0, 0, new PdfStringFormat(PdfTextAlignment.Center));
        brush.getGraphics().restore();
        brush.getGraphics().setTransparency(1);
        Rectangle2D loRect = new Rectangle2D.Float();
        loRect.setFrame(new Point2D.Float(0, 0), page.getCanvas().getClientSize());
        page.getCanvas().drawRectangle(brush, loRect);
    }
}
```
![2023-02-03_171812.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/652121e5-2d3a-38bf-0d1f-78e5e7b7e889.png)