2009-11-19 95 views
4

在我的程序中,我有一個要求「回放」或「解析」Windows元文件(WMF和EMF)。我已經通過MSDN和Google挖掘出來了,而最接近的是Graphics。 EnumerateMetafile方法。我可以讓它工作,因爲我的EnumerateMetafileProc回調被調用,然後我可以調用PlayRecord。缺少的是如何從回調中獲得有用的數據。WMF/EMF文件格式轉換C#

實施例I看着:http://msdn.microsoft.com/en-us/library/ms142060.aspx

回調具有RECORDTYPE參數,這是一個ENUM。那麼這看起來很有用,除了他們似乎沒有辦法將數據轉換成任何有用的類型。

我的目標是回放WMF/EMF的創建,以便我可以對具有類似方法(DrawLine,DrawPoint,DrawArc)的專門圖形類進行函數調用。從某種意義上說,我正在用完全不同的格式(轉換)重新創建WMF/EMF圖紙。

在這方面的任何幫助是非常讚賞。

+0

請問你的目標格式是什麼? (如果是PDF格式,你應該使用PDF打印機驅動程序進行檢查) – 2009-11-26 05:24:25

回答

6

Graphics.EnumerateMetafile,不幸是一個非常非常薄的Win32 APIs層。對於EMF中的每條記錄,您將獲得記錄特定結構的非託管內存地址。沒有關於它可能包含什麼的文檔 - 但是,在Win32世界中沒有太多可以繼續。

所以你需要諮詢古文本!

This book came with a code sample CD-ROM其中包括使用EMF回放API的示例程序。

這給你留下了兩個問題。

  1. 這本書顯然已絕版,所以請確保您購買的任何舊版本包括工作光盤。

  2. 示例代碼全部在C/C++中,並且對於用於描述所有EMF記錄的100個左右結構聲明必要的互操作將是一項非平凡的任務。

所以另一種方法可能會宣佈在.NET中一個巨大的接口,對每個GDI的方法叫你需要攔截,然後用C++/CLI所以它調用到你的適應例如C++代碼每個記錄都有巨大的界面。

更新

雖然EMF播放MSDN文檔不包括具體的EMF記錄的詳細信息,微軟已另行公佈完整的規範截至2006年:

MS-EMF: Enhanced Metafile Format

另外,我連接上面的書的作者已經提供了可供下載的CDROM樣本的源代碼:

Source code for Windows Graphics Programming

2

看看這個庫:http://wmf.codeplex.com/

想法是通過WMF記錄循環和轉化的形狀,刷子等對於其他格式

WmfDocument wmf = new WmfDocument(); 
wmf.Load(path); 

foreach (var record in wmf.Records) 
{ 
    if (record is WmfCreateBrushIndirectRecord) 
    { 
    var brush = record as WmfCreateBrushIndirectRecord; 
    Console.WriteLine("Color: " + brush.Color); 
    Console.WriteLine("Style: " + brush.Style); 
    Console.WriteLine("Hatch: " + brush.Hatch); 
    //Do something with brush here... 
    } 
    else if (record is WmfRectangleRecord) 
    { 
    var rectangle = record as WmfRectangleRecord; 
    //Do something with rectangle... 
    } 
    else if ... //Other shapes to be implemented 
}