Python で PDF に画像の透かしを追加する

## はじめに
前回の記事では、Pythonを使用してPDFにテキスト透かしを追加する方法を紹介しました。実際、画像に透かしを追加することも非常に実用的です。例えば、会社や製品のロゴを文書に追加してブランド効果を高め、他人が勝手に流用するのを防ぎます。または、ドキュメントに画像を挿入して、ドキュメントの有用性やステータスを示すこともできます。テキストの透かしと同様に、画像の透かしを追加する場合、単一の画像透かしまたは重複した透かしを追加することもできます。以下では、Pythonプラットフォームを例として、PDFに画像透かしを追加する方法を紹介します。
## ツール
* Python 3.12.0
* [Spire.PDF for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html)ライブラリ

このライブラリは購入する必要がありますが、[30 日間の無料試用版](https://www.e-iceblue.com/TemLicense.html)も提供されています。
もっと多いサンプルコードについて、[Spire.PDF for Python](https://www.e-iceblue.com/Download/Spire-PDF-Python.html)をダウンロードして参照してください。
## 準備
まず、[Spire.PDF for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html)と plum-dispatch v1.7.4を VS Code にインポートします。
1.	[Python](https://www.python.org/downloads/) をダウンロードしてインストールします。
2.	VS Codeで「Extensions」をクリックし、「Python」を検索してインストールします。
3.	「Explorer」-「NO FOLRDER OPENED」-「Open Folder」
4.	フォルダーを選択し、そこに「.py」ファイルを追加します。
5.	「Terminal」-「New Terminal」
6.	次のコマンドを入力します。
pip install Spire.PDF
## PDF に単一の画像透かしを追加する
まず、PdfDocumentのインスタンスを作成し、既存のPDF文書をロードします。次に、この文書のページをループして、その幅と高さを取得します。さらに、透かし画像をロードし、その幅と高さを取得します。次に、PdfPageBase.Canvas.DrawImage()メソッドを呼び出して、文書の各ページの中央に画像の透かしを描画します。具体的な詳細については、以下のコードとコメントを参照してください。
```python
from spire.pdf import *
from spire.pdf.common import *

# PdfDocument インスタンスを作成する
pdf = PdfDocument()

# PDF文書をロードする
pdf.LoadFromFile("Sample.pdf")

# 画像をロードする
image = PdfImage.FromFile("logo.png")

# 画像の幅と高さを取得する
imageWidth = float(image.Width)
imageHeight = float(image.Height)

# 文書のページをループして取得する
for i in range(pdf.Pages.Count):
    page = pdf.Pages.get_Item(i)

    # 透かしの透明度を設定する
    page.Canvas.SetTransparency(0.3)

    # ページの幅と高さを取得する
    pageWidth = page.ActualSize.Width
    pageHeight = page.ActualSize.Height

    # ページに透かしを描画する
    page.Canvas.DrawImage(image, pageWidth/2 - imageWidth/2, pageHeight/2 - imageHeight/2, imageWidth, imageHeight)

# 生成された文書を保存する
pdf.SaveToFile("SingleImageWatermark.pdf")
pdf.Close()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/0a8823ce-2c51-f2c3-438f-d417e3d2ecdd.png)
## PDF に重複した画像透かしを追加する
この方法は上記のコードに似ています。ただし、重複した透かしを描画する場合は、PdfTilingBrushオブジェクトを作成する必要があります。最初にこのブラシに画像を描画し、次にページに画像を描画します。透かしの数は、オブジェクトのサイズを変更することで設定できます。具体的な詳細については、以下のコードとコメントを参照してください。
```python
from spire.pdf.common import *
from spire.pdf import *

# PdfDocument インスタンスを作成する
pdf = PdfDocument()

# PDF文書をロードする
pdf.LoadFromFile("Sample.pdf")

# 画像をロードする
image = PdfImage.FromFile("logo.png")

# 文書のページをループして取得する
for i in range(pdf.Pages.Count):
    page = pdf.Pages.get_Item(i)

    # PdfTilingBrushクラスのオブジェクトを作成し、サイズを設定する
    brush = PdfTilingBrush(SizeF(page.Canvas.Size.Width / float(3), page.Canvas.Size.Height / float(3)))

    # 透かしの透明度を設定する
    brush.Graphics.SetTransparency(0.3)
    brush.Graphics.Save()

    # 指定された位置に座標を移動する
    brush.Graphics.TranslateTransform(brush.Size.Width/2 - image.Width/2, brush.Size.Height/2 - image.Height/2)

    # brush上に透かし画像を描画する
    brush.Graphics.DrawImage(image, 0.0, 0.0, float(image.Width), float(image.Height))
    brush.Graphics.Restore()

    # ページに透かしを描画する
    page.Canvas.DrawRectangle(brush, RectangleF(PointF(0.0, 0.0), page.Canvas.Size))

# 生成された文書を保存する
pdf.SaveToFile("RepeatImageWatermark.pdf", FileFormat.PDF)
pdf.Close()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/07a446fe-8bee-594c-ba7c-3f7de40561a8.png)