|
增強 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
- 定位問題: 需要精確擺放時使用自訂定位
請參閱
|