拡張 EMF/WMF メタファイルサポート

概要

HotPDF では、拡張メタファイル (EMF) および Windows メタファイル (WMF) 形式のサポートが大幅に強化されました。新しい実装には、自動フォーマット検出、複数の配置オプション、高度なスケーリング制御、および PDF ドキュメント内のベクターグラフィックスのレンダリング品質の向上が含まれています

主な機能強化

  • 自動 EMF/WMF 形式検出と適切な処理
  • 複数の配置オプション (中央、左上、カスタム座標)
  • 拡張されたスケーリングとアスペクト比の制御
  • 呼び出しごとのレンダリングオプション(圧縮、スケーリング、参照 DC、ペンスタイルの扱い、ハッチブラシの保持、ヌルオブジェクトの診断)
  • ベクターグラフィックスを保持するための直接 EMF レンダリング
  • 互換性のためのビットマップ変換オプション
  • 大規模なメタファイルのメモリ管理の改善
  • 複雑なベクターグラフィックスとテキストの処理の改善

位置制御オプション

拡張メタファイルサポートには、柔軟な配置オプションが含まれています

  • mpCenter: ページの中央に配置されたメタファイル (デフォルトの動作)
  • mpLeftTop: 左上隅に表示されるメタファイル (X=0, Y=0)
  • mpCustom: 指定された位置に表示されるメタファイル (X、Y パラメータが必要)

使用例

基本的な使用法 (デフォルトの中央表示)


// Delphi 例 - 既定の中央表示
procedure ShowMetafileDefault;
var
  PDF: THotPDF;
  MetaFile: TMetafile;
begin
  PDF := THotPDF.Create(nil);
  MetaFile := TMetafile.Create;
  try
    PDF.BeginDoc;
    PDF.AddPage;

    // メタファイルを読み込む
    MetaFile.LoadFromFile('diagram.emf');

    // ページ中央に表示(既定)
    PDF.CurrentPage.ShowMetafile(MetaFile);

    PDF.EndDoc;
  finally
    MetaFile.Free;
    PDF.Free;
  end;
end;
        

位置制御の使用法


// Delphi 例 - 高度な位置指定
procedure ShowMetafileAdvanced;
var
  PDF: THotPDF;
  MetaFile: TMetafile;
begin
  PDF := THotPDF.Create(nil);
  MetaFile := TMetafile.Create;
  try
    PDF.BeginDoc;
    PDF.AddPage;

    MetaFile.LoadFromFile('chart.wmf');

    // 左上隅に表示
    PDF.CurrentPage.ShowMetafile(MetaFile, mpLeftTop);

    // 指定した位置に表示
    PDF.CurrentPage.ShowMetafile(MetaFile, mpCustom, 100, 200);

    PDF.EndDoc;
  finally
    MetaFile.Free;
    PDF.Free;
  end;
end;
        

呼び出しごとのレンダリングオプション


// Delphi 例 - 呼び出しごとのオプション
procedure ShowMetafileWithOptions;
var
  PDF: THotPDF;
  MetaFile: TMetafile;
  Options: THPDFEmfOptions;
begin
  PDF := THotPDF.Create(nil);
  MetaFile := TMetafile.Create;
  Options := THPDFEmfOptions.Create;
  try
    Options.EmfBitmapScale := 1;
    Options.ColorImageCompression := icFlate;
    Options.UseScreenReferenceDC := False;
    Options.CanvasOver := True;
    Options.Redraw := False;
    Options.UseFrame := True;
    Options.ShowNullPen := True;
    Options.ShowNullBrush := True;

    PDF.BeginDoc;
    PDF.AddPage;
    MetaFile.LoadFromFile('diagram.emf');
    PDF.CurrentPage.ShowMetafile(MetaFile, mpCenter, 0, 0, Options);
    PDF.EndDoc;
  finally
    Options.Free;
    MetaFile.Free;
    PDF.Free;
  end;
end;
        

拡張メソッド

拡張 EMF/WMF サポートでは、いくつかの新しいメソッドが導入されています

THPDFPage.ShowMetafile オーバーロード

  • ShowMetafile(MetaFile: TMetafile) - デフォルトの中央表示
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition) - 位置制御
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition; X, Y: Single) - カスタムの配置
  • ShowMetafile(MetaFile: TMetafile; Options: THPDFEmfOptions) - 呼び出しごとのレンダリングオプション
  • ShowMetafile(MetaFile: TMetafile; Position: THPDFMetafilePosition; X, Y: Single; Options: THPDFEmfOptions) - 位置制御と呼び出しごとのレンダリングオプション
  • ShowMetafileEx(MetaFile: TMetafile; Options: THPDFEmfOptions) - EMF/WMF オプションの上書きを 1 回の描画で渡すダイレクトページ API

拡張処理メソッド

  • EnhancedShowMetafile - 拡張機能を備えた高度な処理
  • ShowEnhancedMetafile(Page, MetaFile, Options) - 呼び出しごとのレンダリングオプション付きのグローバルヘルパー
  • ShowEnhancedMetafile(Page, MetaFile, Position, X, Y, Options) - 位置制御と呼び出しごとのレンダリングオプション付きのグローバルヘルパー
  • ShowEnhancedMetafile(Page, FileName, Options) - ファイル名を受け取り、呼び出しごとのレンダリングオプション付きのヘルパー
  • ShowEnhancedMetafile(Page, FileName, Position, X, Y, Options) - ファイル名を受け取り、位置制御と呼び出しごとのレンダリングオプション付きのヘルパー
  • RenderEmfDirect - ベクターを保持するための直接 EMF レンダリング
  • RenderEmfAsBitmap - 互換性のためのビットマップ変換
  • RenderWmfAsBitmap - 位置制御付きの WMF ビットマップレンダリング

技術的な実装

拡張 EMF/WMF サポートは、HPDFEmf.pas ユニットを通じて実装されており、以下の機能を提供します

  • THPDFEmfEnhanced: EMF 処理のコア拡張クラス
  • THPDFEmfPatcher: EMF 変換およびレンダリングのユーティリティクラス
  • THPDFMetafilePosition: 位置制御の列挙型
  • 拡張 EMF レコード処理: 高度な EMF レコードのサポート

THPDFPageHelper と C++ の境界

Delphi XE2 以降では、前述の THPDFPage.ShowMetafile と THPDFPage.EnhancedShowMetafile の各オーバーロードは、HPDFEmf ユニットで宣言されたクラスヘルパー THPDFPageHelper によって注入されます。uses 節に HPDFEmf を追加するだけで、任意の THPDFPage インスタンスに対してこれらを呼び出せます

クラスヘルパーは Delphi 専用の言語機能で、C++Builder からは呼び出せません。C++ の呼び出し元は、ConvertTo デモとまったく同じように、拡張処理メソッドの項で挙げているグローバルな ShowEnhancedMetafile(Page, MetaFile, ...) ヘルパーを使用してください

XE2 より前の Delphi では、同じ機能がページを第 1 引数に取る通常の互換手続きとして公開されます。THPDFPage_ShowMetafile(Page, MetaFile)、THPDFPage_ShowMetafile(Page, MetaFile, Position, X, Y)、THPDFPage_EnhancedShowMetafile(Page, MetaFile)、THPDFPage_EnhancedShowMetafile(Page, MetaFile, Position, X, Y) の 4 つです

拡張スイッチ

拡張パスは HPDFEmf の EmfSupportEnabled: Boolean 変数で守られており、デフォルトは True です。False にすると、すべてのメタファイル表示が基本のレンダリングパスにフォールバックします

オプトアウト後に拡張パスを戻すには EnableEnhancedEmfSupport を呼び出します。デモが最初の ShowMetafile 呼び出しの前に行っているのは、まさにこのパターンです

高度な機能

EMF レコードサポート

  • EMR_BITBLT - ビットマップ操作
  • EMR_STRETCHDIBITS - 引き伸ばされたビットマップ操作
  • EMR_ALPHABLEND - アルファブレンド操作
  • 拡張されたテキストレンダリング
  • 複雑なパス操作

レンダリングオプション

  • ベクターの保持: ベクターグラフィックスの品質を維持します
  • ビットマップフォールバック: 複雑なグラフィックスの自動フォールバック
  • スケーリングオプション: 自動および手動のスケーリング制御
  • 品質管理: 構成可能なレンダリング品質設定
  • Canvas のレイヤー順: 既存のページコンテンツを、再生した Canvas メタファイルの内容より上に描画したい場合は THPDFEmfOptions.CanvasOver を設定します
  • 再描画の制御: 既定の一時再描画経路を使うなら THPDFEmfOptions.Redraw を有効のままにし、元のメタファイルを直接パースしたいなら無効にします
  • フレームクリッピング: 取り込むメタファイルがフレーム境界に依存している場合は、THPDFEmfOptions.UseFrame を設定して EMF 出力をヘッダーのフレームへクリップします
  • ハッチブラシパターン: EMF/WMF のハッチブラシは PDF のタイリングパターンへマップされるため、取り込んだ図面は塗りつぶしのテクスチャを保ちます
  • Null オブジェクトの診断: null ペンと null ブラシは既定では不可視のままです。診断のためにそれらのパスや塗りを可視化したい場合は、THPDFEmfOptions.ShowNullPen と THPDFEmfOptions.ShowNullBrush を設定します

パフォーマンスの最適化

  • 大規模なメタファイル向けのメモリ効率の高い処理
  • 最適化された EMF レコードの解析
  • 繰り返される要素のインテリジェントなキャッシュ
  • 変換時のメモリフットプリントの削減

互換性と標準

  • Windows EMF 1.0 および拡張 EMF のサポート
  • Windows メタファイル (WMF) の下位互換性
  • クロスプラットフォームでのレンダリングの一貫性
  • PDF ベクターグラフィックス標準への準拠

トラブルシューティング

一般的な問題と解決策:

  • 大規模なメタファイル: 非常に大きい、または複雑なメタファイルにはビットマップレンダリングを使用します
  • テキストレンダリング: ターゲットシステムでフォントが利用可能であることを確認します
  • 複雑なグラフィックス: より良い品質のために直接 EMF レンダリングを検討します
  • 配置の問題: 正確な配置にはカスタムの配置を使用します

関連項目