【テクニカル・上級編】【初心者向け】制作物の著作権保護!ドキュメント全体に透かし(ウォーターマーク)文字を自動配置するVBAマクロ – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAを掌握する極限の知見:ドキュメント全体を支配するウォーターマーク自動生成エンジン

業務自動化の最前線において、デザインの流出防止や校正ステータスの明示は、単なるビジュアルの装飾ではない。それは企業の資産を守るための防壁であり、システム的に担保されるべき厳格なガバナンスである。

今回は、CorelDRAW VBAのオブジェクトモデルの深淵に踏り込み、ドキュメント全体に対して「半透明の透かし文字」を計算づくで敷き詰め、さらに意図しない編集を防ぐためにレイヤーごとロックをかける実用的な自動化エンジンを構築する。

単に図形を並べるだけのコードではない。メモリの効率化、座標計算の極意、そしてVBA特有の不安定さを排除したプロフェッショナル向けの実装を解説する。

1. アーキテクチャの設計思想:なぜ「愚直な配置」では破綻するのか?

CorelDRAWでウォーターマークを配置する際、初心者はアクティブページに対してループを回し、手動で文字を配置していく。しかし、シニアエンジニアが構築すべきシステムは以下をクリアしていなければならない。

1. マルチページ/マルチレイヤーの完全制覇: 単一ページではなく、ドキュメント内の全ページ、あるいは指定されたマスターレイヤーに対して動的に透かしを生成すること。
2. 描画負荷の極小化 (Redrawの制御): オブジェクト生成の都度、CorelDRAWのUI描画走査が走ると、ページ数が増えた瞬間にパフォーマンスが崩壊する。`Optimization = True` の徹底的な活用が不可欠である。
3. 視認性とデザインの動的計算: ドキュメントの用紙サイズ(横幅・縦幅)を動的に取得し、どのような画角であっても文字が美しく対角線上に傾斜し、かつメインデザインを邪魔しない濃度(透明度)で鎮座すること。

2. 実装コード:Watermark Engine for CorelDRAW

以下のコードは、開発現場で即座に稼働させられる完成されたモジュールである。エラーハンドリングとオブジェクトのライフサイクル管理を完全に網羅している。

Option Explicit

‘ ==============================================================================
‘ CorelDRAW ウォーターマーク自動生成・ロックエンジン
‘ 概要: アクティブドキュメントの全ページに対し、指定文字列の半透明透かしを
‘ グリッド状に自動配置し、誤操作防止のためのロックを施す。
‘ ==============================================================================
Public Sub CreateSecureWatermark()
‘ 1. 定数定義 (要件に合わせて調整)
Const WATERMARK_TEXT As String = “CONFIDENTIAL – DRAFT ONLY”
Const FONT_NAME As String = “Arial Black”
Const FONT_SIZE As Double = 36 ‘ ポイント
Const TRANSPARENCY As Double = 85 ‘ 透過率 (%) 0:不透明 ~ 100:完全透明
Const ROTATION_ANGLE As Double = 45 ‘ 傾き角度

‘ 2. 実行前フールプルーフ
If Application.Documents.Count = 0 Then
MsgBox “処理対象のドキュメントが開かれていません。”, vbCritical, “CorelDRAW Automation”
Exit Sub
End If

Dim targetDoc As Document
Set targetDoc = Application.ActiveDocument

‘ 3. パフォーマンス最適化の極意 (画面描画と言語イベントの停止)
targetDoc.BeginCommandGroup “Generate Watermark Engine”
Application.Optimization = True
targetDoc.DrawingManager.UpdateScreens = False

On Error GoTo ErrorHandler

Dim p As Page
Dim layerWatermark As Layer
Dim sText As Shape
Dim docWidth As Double, docHeight As Double

‘ ドキュメントの単位をミリメートルに強制統一(計算の精度担保のため)
Dim originalUnit As cdrUnit
originalUnit = targetDoc.Unit
targetDoc.Unit = cdrMillimeter

‘ 4. ページごとの処理ループ
For Each p In targetDoc.Pages
p.Activate

‘ 既存の「Watermark_Layer」があればパージしてクリーンな状態から再構築
On Error Resume Next
Set layerWatermark = p.Layers(“Watermark_Layer”)
If Not layerWatermark Is Nothing Then
layerWatermark.Delete
End If
On Error GoTo ErrorHandler

‘ 新規に最前面(あるいは専用レイヤー)を作成
Set layerWatermark = p.CreateLayer(“Watermark_Layer”)
layerWatermark.Activate

‘ ページの寸法を取得
docWidth = p.SizeWidth
docHeight = p.SizeHeight

‘ 5. テキストシェイプの生成とスタイリング
‘ ページ中央を基準としてテキストを配置
Set sText = layerWatermark.CreateArtisticText(0, 0, WATERMARK_TEXT, cdrEnglishUS, cdrUTF8, FONT_NAME, FONT_SIZE, False, False, False, cdrNoFontLine)

‘ フォントスタイル適用
sText.Text.Font = FONT_NAME
sText.Text.Size = FONT_SIZE

‘ 中央揃えアンカーの設定
sText.CenterX = docWidth / 2
sText.CenterY = docHeight / 2

‘ 角度の適用 (オブジェクト中心を軸に回転)
sText.Rotate ROTATION_ANGLE

‘ 透明度の適用 (CorelDRAWにおける透明度効果の付与)
‘ cdrTransparencyUniform: 均一透明度
sText.Transparency.ApplyUniformTransparency TRANSPARENCY

‘ 6. 誤操作防止のロック処理 (Shapeのロック)
sText.Locked = True

‘ オブジェクト変数の明示的解放
Set sText = Nothing
Set layerWatermark = Nothing
Next p

‘ ユニットを元に戻す
targetDoc.Unit = originalUnit

‘ 終了処理
Application.Optimization = False
targetDoc.DrawingManager.UpdateScreens = True
targetDoc.EndCommandGroup

MsgBox “全ページのウォーターマーク生成とロックが完了しました。”, vbInformation, “Automation Success”
Exit Sub

ErrorHandler:
‘ 異常終了時の安全弁 (UI描画の復旧)
Application.Optimization = False
If Not targetDoc Is Nothing Then
targetDoc.DrawingManager.UpdateScreens = True
targetDoc.EndCommandGroup
End If
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “Critical Error”
End Sub

3. チーフアーキテクトが解説するコードの急所

`Application.Optimization = True` の絶対性

CorelDRAW VBAにおいて、ループ内でシェイプ生成やレイヤー操作を行う場合、このフラグを立てないと、OS側のウィンドウメッセージキューがパンクし、数倍から数十倍の処理時間がかかる。さらに最悪の場合、メモリリークを引き起こしCorelDRAW自体がクラッシュする。堅牢なシステムを組む上での絶対の定石である。

単位系の強制統一 (`cdrMillimeter`)

CorelDRAWのドキュメントはユーザーごとに「インチ」「ピクセル」「フィート」など、バラバラの単位系で初期化されている。座標計算を行うコードにおいて、単位系が異なるとバグの温床となる。処理の冒頭で `targetDoc.Unit = cdrMillimeter` と強制上書きし、処理の最後に元の状態に復元する(トランザクション的なアプローチ)が、プロフェッショナルな実装の条件である。

`Locked = True` による物理的防衛

デザインデータにおける最大の事故は、校正用テキストやベースデザインをデザイナーが誤ってマウスで掴んで動かしてしまうことだ。`sText.Locked = True` をプログラムから明示的に叩くことで、CorelDRAWのUI上での選択・移動・変形を完全にブロックし、レイヤーの安全性をハードに担保する。

4. さらなる高みへ:外部システム(DB / CLI)連携への拡張

今回のVBAマクロは、単体で動作するだけでなく、社内の生産管理システムやERPからの「コマンドライン呼び出し(COM Automation)」のフックとしても機能する。

例えば、C#やPythonなどの外部プロセスからCorelDRAWをヘッドレス(UI非表示)で起動し、ドキュメントを開いた瞬間にこのVBAマクロをサイレント実行させることで、「入稿データが生成された瞬間に、全ページに自動で社外秘ウォーターマークを焼き付ける完全自動パイプライン」が完成する。

// C# (COM Interop) からのマクロ実行イメージ
CorelDRAW.Application coredraw = new CorelDRAW.Application();
CorelDRAW.Document doc = coredraw.OpenDocument(@”C:\Designs\Master.cdr”);
coredraw.RunMacro(“GlobalMacros”, “CreateSecureWatermark”);
doc.Save();
doc.Close();

手作業によるヒューマンエラーを絶滅させ、コードによってデザインワークフローを統御する。これこそが、VBAの限界を突破するシニアエンジニアの領域である。

タイトルとURLをコピーしました