【実務・中級編】【上級者向け】VisioのPDF出力エンジンにおける「フォント埋め込み」の失敗を、出力前に事前チェックするロジック – Visio VBA解析バイブル

スポンサーリンク

Visio PDF出力の「フォント爆弾」を無力化せよ:埋め込み失敗を未然に防ぐアーキテクチャ

VisioでのPDF出力業務において、最も忌むべき事態は「出力後の確認フェーズでの文字化け発覚」だ。クライアントへ納品した図面が、特定の環境でだけ豆腐(□)や謎の記号に化けている。この絶望的な手戻りを防ぐために、多くのエンジニアが「祈り」を捧げるが、我々エンジニアに必要なのは祈りではなく「ロジック」だ。

今回は、VisioのPDF出力エンジンが陥るフォント埋め込みの罠を、出力前にVBAで検知・封殺するアーキテクチャを伝授する。

—

なぜ「PDF出力時の文字化け」が起きるのか?

VisioのPDF出力は、内部的にWindowsのGDI/GDI+経由でレンダリングを行う。この際、以下のいずれかに該当すると、PDFエンジンはフォントの埋め込みを諦めるか、代替フォントへの置換を試みて失敗する。

1. ライセンスによる埋め込み禁止フラグ: フォントファイル自体に「埋め込み不可」のフラグがある。
2. 非標準的なフォントの過度な使用: 埋め込みコストが高い、あるいはシステムに正しく登録されていないフォント。
3. Visioのキャッシュ汚染: 複雑なシェイプが重なり、フォントの参照解決がメモリ上で競合する。

これらを解決するには、「ドキュメント内で使用されている全フォントを走査し、埋め込みフラグを確認する」というアプローチが不可欠だ。

—

【核心】フォント埋め込み可否チェック・実装コード

このスクリプトは、ドキュメント内の全`Shape`を走査し、テキストに含まれるフォントの属性を抽出する。実務レベルでそのまま組み込める堅牢なモジュールだ。

‘ —————————————————————————–
‘ 概要: ドキュメント内の使用フォントを走査し、埋め込み不可の可能性を警告する
‘ 著者: アーキテクトチーム
‘ —————————————————————————–
Public Sub ValidateFontEmbedding()
Dim doc As Visio.Document: Set doc = ActiveDocument
Dim shp As Visio.Shape
Dim fontName As String
Dim fontCount As Object
Set fontCount = CreateObject(“Scripting.Dictionary”)

‘ 1. ドキュメント内の全フォントを抽出(重複排除)
TraverseShapes doc.Pages, fontCount

‘ 2. フォントの埋め込み可否を検証
Dim key As Variant
For Each key In fontCount.Keys
If Not IsFontEmbeddable(CStr(key)) Then
Debug.Print “【危険】埋め込み不可または不明なフォントを検出: ” & key
MsgBox “警告: フォント ‘” & key & “‘ は埋め込みに失敗する可能性があります。” _
& vbCrLf & “別のフォント(MSゴシック等)への変更を推奨します。”, vbExclamation
End If
Next key
End Sub

‘ 再帰的に全シェイプを巡回する
Private Sub TraverseShapes(pages As Visio.Pages, dict As Object)
Dim pg As Visio.Page, shp As Visio.Shape
For Each pg In pages
For Each shp In pg.Shapes
‘ テキストがある場合のみフォントを取得
If shp.Characters.Count > 0 Then
Dim fName As String
fName = shp.Cells(“Char.Font”).FormulaU
‘ FormulaUはインデックスを返す場合があるため適宜変換
If Not dict.Exists(fName) Then dict.Add fName, 1
End If
Next shp
Next pg
End Sub

‘ 簡易検証ロジック(※実際にはWindows APIのGetFontData等と組み合わせると最強)
Private Function IsFontEmbeddable(fontName As String) As Boolean
‘ ここにブラックリストを定義する
‘ 実際にはレジストリやシステムフォントの属性をチェックするロジックを拡張可能
Dim blackList As Variant
blackList = Array(“Some-Unstable-Font”, “Private-Use-Font”)

Dim i As Long
For i = LBound(blackList) To UBound(blackList)
If InStr(1, fontName, blackList(i), vbTextCompare) > 0 Then
IsFontEmbeddable = False
Exit Function
End If
Next i
IsFontEmbeddable = True
End Function

—

現場で勝つためのアーキテクチャ上の注意点

このコードをただコピペするだけでは、真の自動化エンジニアとは言えない。以下の「運用の壁」を考慮せよ。

1. 巨大ファイルにおけるパフォーマンス低下

`TraverseShapes`で全ページ・全シェイプをなめる処理は、数千個のシェイプを持つ図面では重い。「ページ単位でのチェック」や「特定レイヤーのみのチェック」を行うよう、引数を拡張すべきだ。

2. レジストリ/APIとの連携

上記の`IsFontEmbeddable`は簡易版だ。本気でやるなら、Windows API `GetFontData` を呼び出し、フォントファイルの `fsType` フィールドを解析することをお勧めする。これにより、OSレベルで「このフォントはPDFに埋め込めるか?」を論理的に判定できる。

3. PDF出力設定の標準化(重要)

フォントの埋め込みは、Visio側の設定にも依存する。コードからPDF出力を行う際は、必ず `FixedFormatSettings` を明示的に設定せよ。

‘ PDF出力時のベストプラクティス
doc.ExportAsFixedFormat _
FixedFormat:=visFixedFormatPDF, _
OutputFileName:=”C:\Temp\output.pdf”, _
Intent:=visDocIntentPrint, _
PrintRange:=visPrintAll, _
IncludeDocumentProperties:=True, _
IncludeStructureTags:=True, _
UseISO19005_1:=True ‘ PDF/A準拠を強制することでフォント埋め込みを確実にする

—

結論:自動化は「防衛」から始まる

自動化の目的は、単にルーチンを速くすることではない。「失敗する可能性を排除し、人間の確認コストをゼロにすること」にある。

今回紹介した「フォントチェック」は、一度組み込んでしまえば、二度と文字化けの恐怖に怯える必要はなくなる。これこそが、アーキテクトが目指すべき「堅牢な自動化」の姿だ。さあ、今すぐあなたの図面管理フローにこのロジックを組み込み、PDF出力の品質を一段階上のステージへ引き上げろ。

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