CorelDRAW VBA:SVGエクスポートの深淵――互換性と最適化の極致へ
CorelDRAWのVBAは、単なるマクロ言語ではない。それは、ドローイングエンジンの内部状態を直接操作するための「特権的なインターフェース」だ。
特にSVGエクスポートは、Web資産としての運用が前提となる以上、単なるファイル出力とは次元が異なる。Illustratorとの互換性を確保し、かつブラウザの描画負荷を最小化する。この相反する要求をVBAで制御するには、`StructExportOptions`の背後に潜む「罠」を理解しなければならない。
今日は、汎用的なリファレンスには決して書かれていない、エクスポート最適化の真髄を伝授する。
1. 破壊的な出力設定:`StructExportOptions`の真実
CorelDRAWのSVGエクスポートにおいて、最も見落とされがちなのが`ExportFilter`のパラメータ制御だ。単純な`ActiveDocument.Export`では、Corelのデフォルト設定が適用され、不要なメタデータ(Illustratorで開いた際にゴミとなるCorel独自のXML構造)が残存する。
真のエンジニアは、`StructExportOptions`を駆使し、バイナリレベルで出力を制御する。
‘ SVG最適化エクスポートの核となるプロシージャ
Public Sub ExportOptimizedSVG(ByVal filePath As String)
Dim expFilter As ExportFilter
Dim expOptions As StructExportOptions
‘ メモリリークを避けるため、フィルタオブジェクトのライフサイクルを厳密に管理する
Set expOptions = New StructExportOptions
expOptions.AntiAliasingType = cdrNormalAntiAliasing
‘ ここが肝:互換性を最大化するためのフィルタ設定
‘ 内部的にはフィルター設定文字列を構築する必要がある
Dim filterSettings As String
filterSettings = “subversion=1;” & _
“preservelayers=0;” & _
“embedfonts=0;” & _
“converttexttooutlines=1;” & _
“encoding=utf-8;” & _
“optimize=1”
Set expFilter = ActiveDocument.ExportEx(filePath, cdrSVG, cdrSelection, expOptions)
With expFilter
.Finish filterSettings
End With
‘ オブジェクトの明示的解放(VBAのガベージコレクションを信用するな)
Set expFilter = Nothing
Set expOptions = Nothing
End Sub
2. なぜ「テキストのアウトライン化」が必須なのか
Illustratorとの完全互換を目指すなら、テキストのSVG埋め込みは「百害あって一利なし」だ。フォントのレンダリングエンジンはブラウザによって異なり、文字間隔(カーニング)の崩れは致命的なデザイン事故を引き起こす。
`converttexttooutlines=1` を指定することで、ベクターパスとして出力させる。これはファイルサイズを肥大化させる要因になるが、「再現性の保証」というエンジニアリングの最優先事項においては、迷わず選択すべきだ。
3. レガシー環境でのパフォーマンス最適化:Windows APIの活用
大量のファイルを一括処理する際、VBAの単一プロセスではメモリスタックの肥大化が問題となる。特にCorelDRAWの`Document`オブジェクトは巨大なメモリを占有するため、ループ内で都度`Close`しなければ確実にプロセスがクラッシュする。
また、ファイルI/Oの確実性を担保するために、Windows APIを用いて存在確認を行うのが「シニア」の作法だ。
‘ ファイルシステムの存在確認(API経由)
Private Declare PtrSafe Function GetFileAttributes Lib “kernel32” Alias “GetFileAttributesA” (ByVal lpFileName As String) As Long
Public Sub BatchExport(folderPath As String)
‘ 処理するドキュメントを配列で管理し、メモリを強制解放する
Dim doc As Document
‘ …処理ループ…
‘ 最後に、CorelDRAWの内部キャッシュを解放する意識を持つこと
‘ 単に Close するだけでなく、ActiveDocument の参照を切るのが鉄則
doc.Close
Set doc = Nothing
End Sub
4. 伝説のアーキテクトからの助言
多くの開発者が陥る罠は、`Export`メソッドを実行した後の「後始末」だ。CorelDRAWはCOMベースのアーキテクチャであり、オブジェクトの参照が残っていると、バックグラウンドでゾンビプロセスとしてメモリに居座り続ける。
- Set doc = Nothing を怠るな: これができないエンジニアに、大規模な自動化システムを設計する資格はない。
- メタデータ削除の追求: SVG出力後に、シェルスクリプトや外部ライブラリ(`svgo`等)を呼び出し、不要な`xmlns`や`metadata`タグを削除するハイブリッド運用を推奨する。VBAのみで完結させようとせず、システム間のパイプラインを構築せよ。
CorelDRAWのVBAは、非常に強力だが、同時に非常に繊細な楽器だ。その出力結果が、下流工程のデザイナーやWebフロントエンドエンジニアにとって「いかに扱いやすい素材であるか」――これこそが、我々エンジニアが追求すべき唯一のゴールである。
コードは嘘をつかない。だが、最適化を怠ったコードは、必ずどこかでシステムに牙を剥く。常にメモリ消費とオブジェクトのライフサイクルを意識し、美しく堅牢なアーキテクチャを構築してほしい。
