增強 EMF/WMF 中繼檔支援

總覽

HotPDF 大幅增強了 Enhanced Metafile(EMF)與 Windows Metafile(WMF)格式支援。新實作包含自動格式偵測、多種定位選項、進階縮放控制,以及 PDF 文件中向量圖形的更好轉譯品質

主要增強

  • 自動偵測 EMF/WMF 格式並進行對應處理
  • 自動偵測 EMF/WMF 格式並採用合適的處理方式
  • 多種定位選項(置中、左上、自訂座標)
  • 增強的縮放與長寬比控制
  • 直接轉譯 EMF,保留向量圖形
  • 相容模式可改用點陣圖轉換
  • 改善大型中繼檔的記憶體管理
  • 更好地處理複雜向量圖形與文字

定位控制選項

增強的 metafile 支援包含彈性的定位選項:

  • mpCenter: 中繼檔在頁面置中(預設行為)
  • mpLeftTop: 中繼檔顯示在左上角(X=0, Y=0)
  • mpCustom: 中繼檔顯示在指定位置(需要 X、Y 參數)

使用範例

基本用法(預設置中顯示)


// Delphi example - Default centered display
procedure ShowMetafileDefault;
var
  PDF: THotPDF;
  MetaFile: TMetafile;
begin
  PDF := THotPDF.Create(nil);
  MetaFile := TMetafile.Create;
  try
    PDF.BeginDoc;
    PDF.AddPage;

    // Load metafile
    MetaFile.LoadFromFile('diagram.emf');

    // Display centered on page (default)
    PDF.CurrentPage.ShowMetafile(MetaFile);

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

定位控制用法


// Delphi example - Advanced positioning
procedure ShowMetafileAdvanced;
var
  PDF: THotPDF;
  MetaFile: TMetafile;
begin
  PDF := THotPDF.Create(nil);
  MetaFile := TMetafile.Create;
  try
    PDF.BeginDoc;
    PDF.AddPage;

    MetaFile.LoadFromFile('chart.wmf');

    // Top-left corner display
    PDF.CurrentPage.ShowMetafile(MetaFile, mpLeftTop);

    // Custom position display
    PDF.CurrentPage.ShowMetafile(MetaFile, mpCustom, 100, 200);

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

增強方法


// Delphi example - Per-call options
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;
        

Enhanced Methods

增強的 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)

增強處理方法

  • EnhancedShowMetafile - 具備增強功能的進階處理
  • ShowEnhancedMetafile(Page, MetaFile, Options) - 全域輔助方法,支援每次呼叫的轉譯選項
  • ShowEnhancedMetafile(Page, MetaFile, Position, X, Y, Options) - 全域輔助方法,支援位置控制與每次呼叫的轉譯選項
  • ShowEnhancedMetafile(Page, FileName, Options)
  • EnhancedShowMetafile - 以增強功能做進階處理
  • RenderEmfDirect - 直接轉譯 EMF 以保留向量
  • RenderEmfAsBitmap - 轉成點陣圖以相容
  • RenderWmfAsBitmap - WMF 點陣轉譯並控制位置

技術實作

增強的 EMF/WMF 支援透過 HPDFEmf.pas 單元實作,提供:

  • THPDFEmfEnhanced: EMF 處理的核心增強類別
  • THPDFEmfPatcher: EMF 轉換與轉譯的工具類別
  • THPDFMetafilePosition: 位置控制的列舉
  • 增強的 EMF 記錄處理: 支援進階 EMF 記錄

THPDFPageHelper 與 C++ 邊界

在 Delphi XE2 與更新版本上,前述的 THPDFPage.ShowMetafile 與 THPDFPage.EnhancedShowMetafile 多載是由 THPDFPageHelper 注入的——這是宣告在 HPDFEmf 單元裡的 class helper——所以只要把 HPDFEmf 加進 uses 子句,就能在任何 THPDFPage 執行個體上呼叫它們

Class helper 是 Delphi 獨有的語言功能,C++Builder 呼叫不到:C++ 呼叫端請改用「強化處理方法」底下列出的全域 ShowEnhancedMetafile(Page, MetaFile, ...) 輔助函式,做法與 ConvertTo 示範完全一樣

在 XE2 之前的 Delphi 版本,同樣功能以把頁面當第一個參數的普通相容程序暴露:THPDFPage_ShowMetafile(Page, MetaFile)、THPDFPage_ShowMetafile(Page, MetaFile, Position, X, Y)、THPDFPage_EnhancedShowMetafile(Page, MetaFile) 與 THPDFPage_EnhancedShowMetafile(Page, MetaFile, Position, X, Y)

強化開關

強化路徑由 HPDFEmf 中的 EmfSupportEnabled: Boolean 變數把關,預設 True;設成 False 之後,所有中繼檔顯示都會退回基本轉譯路徑

退出之後想再打開,呼叫 EnableEnhancedEmfSupport 即可;示範程式在第一次 ShowMetafile 前就是這麼做的

進階功能

EMF 記錄支援

  • EMR_BITBLT - 點陣圖操作
  • EMR_STRETCHDIBITS - 拉伸點陣圖操作
  • EMR_ALPHABLEND - Alpha 混合操作
  • 增強的文字轉譯
  • 複雜路徑操作

轉譯選項

  • 向量保留: 維持向量圖形品質
  • 點陣圖後備: 複雜圖形自動改用點陣圖
  • 縮放選項: 自動與手動縮放控制
  • 品質控制: 可設定的轉譯品質
  • Canvas 疊放: 既有的頁面內容需要繪製在重播的 Canvas 中繼檔內容之上時,設定 THPDFEmfOptions.CanvasOver
  • 重繪控制: 預設的暫時重繪路徑保留 THPDFEmfOptions.Redraw 啟用,或停用它以直接解析原始中繼檔
  • 框架裁剪: 匯入的中繼檔依賴框架邊界時,設定 THPDFEmfOptions.UseFrame 把 EMF 輸出裁剪到檔頭框架
  • 網底筆刷圖樣: EMF/WMF 網底筆刷會對應到 PDF 平鋪圖樣,匯入的圖形因此保留填充紋理
  • Null 物件診斷: 預設讓 null 筆與 null 筆刷保持不可見,或設定 THPDFEmfOptions.ShowNullPen 與 THPDFEmfOptions.ShowNullBrush

效能最佳化

  • 大型中繼檔的省記憶體處理
  • 最佳化的 EMF 記錄解析
  • 重複元素的智慧快取
  • 轉換時降低記憶體佔用

相容性與標準

  • 支援 Windows EMF 1.0 與 Enhanced EMF
  • 回溯相容 Windows Metafile(WMF)
  • 跨平台轉譯一致性
  • 符合 PDF 向量圖形標準

疑難排解

常見問題與解法:

  • 大型中繼檔: 特別大或複雜的中繼檔改用點陣圖轉譯
  • 文字轉譯: 確認目標系統有可用字型
  • 複雜圖形: 想要更好品質可考慮直接轉譯 EMF
  • 定位問題: 需要精確擺放時使用自訂定位

請參閱