透かしはページの上に重ねる目印で、すべてのページに繰り返し表示され、本文の下に描画される。段落の領域を消費せず、ページ割りも変えない。Word は透かしをヘッダー層に保存するため、一度設定すれば文書全体に反映される。
本記事では Free Spire.Doc for Python を使用する。Document.Watermark プロパティに透かしオブジェクトを代入でき、テキストは TextWatermark、画像は PictureWatermark に対応する。
pip install Spire.Doc.Free
透かしの位置
ヘッダー層は Word が透かしを置く場所である。透かしはヘッダー内の図形として固定されるため、全ページに繰り返され、本文より下に描画され、本文のレイアウトに参加しない。設定しても既存のヘッダー文字は変わらず、フッターのページ番号にも影響しない。
Document.Watermark は書き込み可能なプロパティである。TextWatermark または PictureWatermark を代入すると透かしが設定され、None を代入すると削除される。再代入すると既存の透かしは置き換わる。同じ文書にテキスト透かしを入れてから画像透かしに切り替えると、最後に設定したものだけが残る。
| 種類 | クラス | 主なパラメータ |
|---|---|---|
| テキスト | TextWatermark |
Text、FontName、FontSize、Color、Layout、Semitransparent
|
| 画像 | PictureWatermark |
SetPicture、Scaling、IsWashout
|
テキスト透かし
サンプルは 4 ページの「決済ゲートウェイ接続仕様 v2.3」で、表紙、3 つの節、3 つの表を含み、ヘッダーに文書名、フッターにページ番号が入る。
from spire.doc import *
from spire.doc.common import *
doc = Document()
doc.LoadFromFile("接続仕様書_v2.3.docx")
wm = TextWatermark()
wm.Text = "社外秘"
wm.FontName = "Yu Gothic"
wm.FontSize = 60
wm.Color = Color.get_Gray()
wm.Layout = WatermarkLayout.Diagonal
wm.Semitransparent = True
doc.Watermark = wm
doc.SaveToFile("接続仕様書_v2.3_テキスト透かし.docx", FileFormat.Docx2016)
doc.Close()
Text の長さがフォントサイズの上限を決める。3 文字の「社外秘」は 60 pt でも対角線上に約 6 cm で収まる。長い文言では 40 pt 前後に下げる必要がある。
FontName は日本語では必須である。日本語の字形はフォント側が提供するため、Yu Gothic や Meiryo といった日本語フォントを指定しておけば、すべての文字が完全な字形で描画される。
Color と Semitransparent は視認性を調整する。色だけを薄くしても塗りは不透明のままで、本文に重なると読みにくい。Semitransparent = True にすると塗り全体が半透明になり、下の本文が透けて見える。サンプルはグレーと半透明の組み合わせで、表紙でも本文ページでも読める濃さにしている。
Layout は Diagonal か Horizontal を選ぶ。対角線はページの左下から右上へ伸び、面積を広く覆う。水平は控えめで、ヘッダー付近の小さな目印に向く。
出力は 4 ページのまま、ファイルは 10,217 バイトから 13,165 バイトに増える。増分はヘッダーに追加された透かし図形のぶんである。既存のヘッダー「決済ゲートウェイ接続仕様 v2.3」とフッターのページ番号はそのまま残る。
画像透かし
wm = PictureWatermark()
wm.SetPicture("watermark_hokusei.png")
wm.Scaling = 70
wm.IsWashout = True
doc.Watermark = wm
画像透かしには 2 つの条件がある。1 つ目は透明背景である。アルファチャンネルを持つ PNG を使えば、透かしの領域には図形そのものだけが描画され、本文は透明部分から透けてなじむ。2 つ目はサイズと拡大率である。画像は 640 × 200 ピクセルで、100% では幅約 16.9 cm となり、A4 の本文幅(約 14.7 cm)を超える。Scaling = 70 にすると約 11.8 cm になり、本文幅に収まる。
IsWashout = True は画像を淡い色に加工する。濃いロゴも淡い青灰色になり、本文に重ねても文字を隠さない。False では元の色のまま描画されるため、空白部分や隅に置く実色のロゴに向く。
画像透かしのファイル増加はテキストより大きい。25,518 バイトで、テキスト透かしより 12,353 バイト多い。PNG が文書に埋め込まれるためで、増加量は画像の複雑さに比例する。単色の文字ロゴなら数 KB に収まる。
一括処理
一括処理のループは通常のバッチと同じである。ディレクトリを走査し、読み込み、透かしを設定し、別名で保存する。透かしオブジェクトは文書ごとに新しく作り、複数の文書で使い回さない。
import os, time
IN_DIR = "./旧版" # 接続仕様書_v2.0.docx 〜 v2.3.docx
OUT_DIR = "./透かし付き"
started = time.perf_counter()
for name in sorted(os.listdir(IN_DIR)):
if not name.lower().endswith(".docx"):
continue
doc = Document()
doc.LoadFromFile(os.path.join(IN_DIR, name))
wm = TextWatermark()
wm.Text = "社外秘"
wm.FontName = "Yu Gothic"
wm.FontSize = 60
wm.Color = Color.get_Gray()
wm.Layout = WatermarkLayout.Diagonal
wm.Semitransparent = True
doc.Watermark = wm
doc.SaveToFile(os.path.join(OUT_DIR, name.replace(".docx", "_透かし.docx")), FileFormat.Docx2016)
doc.Close()
print("%.2f 秒" % (time.perf_counter() - started))
4 つの版(v2.0〜v2.3)をまとめて処理すると 0.65 秒、各出力は 13,165 バイトだった。透かし済みの文書に再実行しても、新しい設定が古い透かしを置き換えるため、二重にはならない。
透かしの削除
doc = Document()
doc.LoadFromFile("接続仕様書_v2.3_テキスト透かし.docx")
doc.Watermark = None
doc.SaveToFile("接続仕様書_透かしなし.docx", FileFormat.Docx2016)
doc.Close()
削除後も 4 ページで、ファイルは 11,320 バイトである。ヘッダー、フッター、表、本文はそのまま残り、ページを描画しても透かしの痕跡は見えない。削除は別名で保存した新しいファイルに対して行われるため、元の透かし入り文書は変更されない。履歴を残す場合は出力名を分けておく。
結果の比較
4 つのファイルを並べると、ページ数とサイズの変化から透かしの種類を確認できる。
| ファイル | ページ数 | バイト |
|---|---|---|
| 接続仕様書_v2.3.docx | 4 | 10,217 |
| 接続仕様書_v2.3_テキスト透かし.docx | 4 | 13,165 |
| 接続仕様書_v2.3_画像透かし.docx | 4 | 25,518 |
| 接続仕様書_透かしなし.docx | 4 | 11,320 |
ページ数が変わらないことは、透かしが本文を押し出していないことを示す。描画結果では、すべてのページに透かしが入り、本文は透かしの上でそのまま読め、ヘッダーとフッターも覆われていない。テキスト透かしは表紙と 3 つの本文ページで同じ位置に現れ、画像透かしは本文領域の中央に収まり、透明部分はページの内容と自然になじむ。
テキスト透かし・画像透かし・削除後のいずれのファイルでも、doc.Sections[0].HeadersFooters.Header の段落テキストは「決済ゲートウェイ接続仕様 v2.3」のままである。透かしとヘッダー文字は、ヘッダー層の中で互いに独立した内容になっている。
向いている場面
透かしは文書の状態を示す用途に向く。社外秘、下書き、廃止、レビュー版、見本などである。テキストは状態の説明に、画像はブランドや部門の識別に使う。配布先によって切り替える運用もできる。社外配布はテキスト、社内保管はロゴ、といった具合である。
透かしは視覚的な目印である。コピーや編集、印刷の制限は文書保護や暗号化で行う。透かしは、読む人が文書の扱いを一目で判断できるようにするためのものだ。一括処理では、透かしの設定と PDF への書き出しを同じ流れに置くと、配布前の目印と形式の固定を同時に済ませられる。


