程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 從DWG到XAML (II) - DWFx格式解析及其和XPS的關系

從DWG到XAML (II) - DWFx格式解析及其和XPS的關系

編輯:關於.NET

什麼是XPS

XPS 是 XML Paper Specification 的簡稱. 它誕生於2006年下半年, 跟隨Windows Vista發布並且在Vista平台上應用頗多, 是微軟開 發的一種文檔保存與查看的規范。這個規范本身描述了這種格式以及分發、歸檔、顯示以及處理 XPS 文檔所遵循的規則。最為顯著的特點 是,XPS 所用的置標語言(Markup Language)是 WPF 所用的 XAML 的一個子集,因此顯示 Windows 應用程序所用的方法可以用於 XPS 文 檔。

為了推廣這種格式,微軟公司遵循免收專利費的授權方式發布 XPS,允許用戶在特定場合創建自己的讀、寫以及顯示 XPS 文件的實現 方法。其規范本身也遵循免收專利費的方式發布,並且允許自由分發. 如果您有興趣, 現在依舊可以從微軟的站點上自由下載XPS的技術規范. 這是一個600多頁的技術文檔, 詳細說明了XPS的方方面 面, 包括XPS文件的組織形式, 圖像/字體以及版權管理等內容.

現在我們知道, 類似於Open XML (Office 2007的基本組織形式), XPS 文件實際上也是一個包含組成文檔的各個文件的ZIP文檔,我們可以從這裡獲取. 如果你覺得這個示例文檔包太大 , 我們也可以嘗試最簡單的辦法.

打開Word 2007

隨便寫幾個字, 或者插入幾張圖片

另存為XPS

XPS Viewer會啟動並顯示生成的XPS文件.

XPS Viewer是從Vista時代就捆綁到操作系統中的. 不過這不重要, 我們關注的不是XPS Viewer而是XPS文檔內部結構. 現在, 我這裡已 經有了一個XPS示例文檔, 如果您有興趣, 可以下載並自行查看.

XPS的組織結構

如果600多頁的技術規范讓您感到厭倦, 那麼你不妨試試繼續讀以下內容. 這會提供給你一個關於XPS大體框架以及各部分功能的一個概 述. 如果您覺得我說的不夠詳細, 那麼那時候您可以在這個基本印象的基礎上對應查閱XPS技術規格文檔的對應章節.

我們先解剖一下xps文件. 將XPS文件後綴名改為.zip並解壓縮, 我們就得到了以XPS文件名為目錄名的一個目錄. 這個根目錄下的文件 如圖所示.

就想你心中揣測的一樣. 是的, 你猜對了, 這個圖暗示了這樣的信息:

FixedDocSeq.fdseq文件 - 必須是同文件名,同後綴名, 這是XPS技術規范所規定的, 是整個XPS文檔的入口. 如果沒有這個文件, XPS文 檔將不可以被識別和操作. 事實上, 這個文件的內容是一寫指向具體文檔的引用. 多文檔XPS文件, 會有多個引用記錄;單文檔XPS文件只有 一個引用記錄, 例如:

FixedDocSeq.fdseq
   <FixedDocumentSequence xmlns="http://schemas.microsoft.com/xps/2005/06">
   <DocumentReference Source="/Documents/1/FixedDoc.fdoc"/>
   </FixedDocumentSequence>

docProps目錄 - 這個目錄主要用來保存和文檔屬性有關的內容, 比如文檔的縮略圖, 文檔的創建/修改時間等.

Resources目錄 - 這個目錄主要保存多媒體信息, 比如文檔中插入的圖像, 比如文檔中使用的字體. 我建議你自己打開看一看, 因為字 體比較有趣, 不是我們常見的那種Truetype字體或者點陣字體, 而是後綴名.odttf的被混淆的字體. 這是個相當有趣的話題, 如果有興趣, 大家可以深入研究一下:)

Documents目錄 - 這個目錄是最重要的, 它存放了大部分和XPS內容呈現有關的材料, 比如文檔信息, 頁面信息, 文檔結構等.這個目錄 的下一級是一個以序號命名的目錄. 序號目錄的下一級, 是FixedDoc.fdoc/Pages目錄/Structure目錄. FixedDoc.fdoc指向了文檔顯示的 具體頁面(Page), Pages目錄裡面保存了所有的頁面, Structure目錄保存了說明文檔結構的.struct文件. 事實上, Page就是直接作為渲染 源, 通過諸如XPS Viewer等查看工具, 直接被呈現在你眼前的文檔內容. FixedDoc.fdoc文件的內容大多比較簡單, 比如本例中:

FixedDoc.fdoc

1. <PageContent Source="Pages/1.fpage"></PageContent>

FixedPage.fpage的內容則相當豐富, 因為它關系到絕大部分的內容呈現:

Fixed Page

1. <FixedPage xmlns="http://schemas.microsoft.com/xps/2005/06" Width="794"
    2. Height="1123" xml:lang="zh-CN">
    3.   <Canvas>
    4.     <Canvas.RenderTransform>
    5.       <MatrixTransform Matrix="1.333333333,0,0,1.333333333,0,0"/>
    6.     </Canvas.RenderTransform>
    7.     <Glyphs Name="a0" BidiLevel="0" Fill="#FF000000"
    8.      FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
    9.      FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="90.125"
   10.      OriginY="83.325" UnicodeString="X" Indices="" xml:lang="en-US">
   11.     </Glyphs>
   12.     <Glyphs Name="a1" BidiLevel="0" Fill="#FF000000"
   13.      FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
   14.      FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="95.375"
   15.      OriginY="83.325" UnicodeString="ps " Indices=",50;,35.714;" xml:lang="en-US">
   16.     </Glyphs>
   17.     <Glyphs Name="a2" BidiLevel="0" Fill="#FF000000"
   18.      FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
   19.      FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="107.37"
   20.      OriginY="83.325" UnicodeString="demo" Indices=",50;,50;,78.571;" xml:lang="en-US">
   21.     </Glyphs>
   22.     <Glyphs Name="a3" BidiLevel="0" Fill="#FF000000"
   23.      FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
   24.      FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="132.18"
   25.      OriginY="83.325" UnicodeString=" " Indices="" xml:lang="en-US">
   26.     </Glyphs>
   27.     <Glyphs Name="a4" BidiLevel="0" Fill="#FF000000"
   28.      FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
   29.      FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="501.63"
   30.      OriginY="415.13" UnicodeString=" " Indices="" xml:lang="en-US">
   31.     </Glyphs>
   32.     <Glyphs Name="a5" BidiLevel="0" Fill="#FF000000"
   33.      FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
   34.      FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="90.125"
   35.      OriginY="427.13" UnicodeString="X" Indices="" xml:lang="en-US">
   36.     </Glyphs>
   37.     <Glyphs Name="a6" BidiLevel="0" Fill="#FF000000"
   38.      FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
   39.      FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="95.375"
   40.      OriginY="427.13" UnicodeString="ps " Indices=",50;,35.714;" xml:lang="en-US">
   41.     </Glyphs>
   42.     <Glyphs Name="a7" BidiLevel="0" Fill="#FF000000"
   43.      FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
   44.      FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="106.62"
   45.      OriginY="427.13" UnicodeString="end" Indices=",57.143;,50;" xml:lang="en-US">
   46.     </Glyphs>
   47.     <Glyphs Name="a8" BidiLevel="0" Fill="#FF000000"
   48.      FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
   49.      FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="123.9"
   50.      OriginY="427.13" UnicodeString=" " Indices="" xml:lang="en-US">
   51.     </Glyphs>
   52.     <Path Data="M 91.5,88.25 L 500.31,88.25 L 500.31,414.55 L 91.5,414.55 Z"
   53.      Clip="M -0.000000465,87.75 L 595.5,87.75 L 595.5,415.5 L -0.000000465,415.5 Z "
   54.      AutomationProperties.HelpText="Capture3.PNG">
   55.       <Path.Fill>
   56.         <ImageBrush ImageSource="/Resources/Images/image_0.jpg"
   57.          Viewbox="0,0,545.08,435.06" TileMode="None" ViewboxUnits="Absolute"
   58.          ViewportUnits="Absolute" Viewport="0,0,1,1">
   59.           <ImageBrush.Transform>
   60.             <MatrixTransform Matrix="408.81,0,0,326.3,91.5,88.25"/>
   61.           </ImageBrush.Transform>
   62.         </ImageBrush>
   63.       </Path.Fill>
   64.     </Path>
   65.   </Canvas>
   66. </FixedPage>

這個文檔的內容讓我們相當興奮, 因為它是和WPF XAML規格直接兼容的(除了字體)! 雖然這是一個普通的由word生成的XPS文檔, 而非 一個由DWG轉化而成的DWFx文檔, 但是既然DWFx宣稱兼容XPS, 那麼它在WPF中呈現肯定不是問題了.

所以, 總結起來說, XPS主要元素的組織形式, 大概可以是如右圖, 當然這僅僅是個為了加深印象的示意圖, 實際上fpage文件引用了字 體文件和圖像文件.

好吧,我們有點迫不及待的想知道DWFx格式的內幕了. DWFx文件就是一個平凡意義上的XPS嗎? 它有自己特有的元素嗎? 除了呈現, 我們 還有操作DWFx內容的可能嗎?

從DWG到DWFx

當然, 為了從DWG文件獲得XAML, 這是最重要的一步, 從DWG文件轉化為DWFx文件. 這在很多人看來是個很簡單的事情 - 如果安裝了 AutoCAD, 那麼直接文件另存為就可以了. 可是事情往往不是這麼簡單. 首先你發現另存為DWFx以後再次打開, 內容有可能變了, 這說明默 認格式轉換的配置文件有些問題; 其實你發現AutoCAD太貴了, 你買不起或者你的客戶不願意投資.

所以我們首先需要的是另外一個工具, 這個工具既可以將DWG文件轉換為DWFx文件, 又必須是免費的. 有這種工具麼? 是的, 而且是 AutoDesk官方出品的工具 – DWG TrueView.

其實從DWG文件轉化為DWFx的步驟相當簡單, 只需要對其中一點注意即可:

1.用TrueView打開待轉換的DWG文件;

2.點擊"主菜單"圖標, 打開Export子菜單, 你可以看到TrueView支持將DWG文件轉化為DWF文件,DWFx文件,以及PDF文件.

3.點擊"DWFx"菜單, 打開"Save As DWFx"對話框

4.點擊"option"按鈕. 這就是需要注意的一步了,

如果你想保留盡可能多的DWG文件信息, 比如Block信息, 你需要這一步來設置導出文件內容.

5.在上一步彈出的菜單中選擇"包含Block", 並掃描創建新的Block模板.

6.保存模板. 點擊確定回到"Save As DWFx"對話框.小心選擇"Export"選項, 一般這個選項有"Window"/"Display"/"Extent". 選 擇"Display"是當前可見部分, 選擇"Window"是當前窗口部分, 選擇"Extent"是拉伸後的整個圖即原圖. 一般選擇"Extent"就可以了.

7.點擊去頂就開始了導出過程.

8.最終得到我們的DWFx文件.

從XPS到DWFx

現在我們可以繼續解剖工作了. 這次的解剖對象是一個DWFx文件, 你可以在這裡獲得它. 因為DWFx兼容XPS規范, 所以我們同樣改掉後 綴名為zip然後解壓縮打開, 得到了如右示意圖這樣一個目錄結構. 這個示意圖標出了對於DWG普通意義上來說比較重要的部分. 如果你對 DWFx感興趣, 我還是推薦你拿一個DWFx文件親自看一看, 這樣印象可能更深刻些. 這個圖下面是目錄級別示意圖.

哇, 這麼多文件和目錄啊, 那麼這些文件和目錄都是什麼意思呢? 哪些對我來說有意義?

我簡單總結了一下, 並且畫了下面這個說明表:

Name Comment [Content_Types].xml: It a Type-Content pair dictionary. We need this file to locate the appropriate content by types. DWFDocumentSequence.dwfseq This file is used to locate the manifest.xml file of a DWFx package. Manifest.xml This file is the core file of a DWFx package. It shows how the DWFx package is organized, and shows how to reach the functional parts of a DWFx package, including “2d graphics dictionary”, “2d graphics extension”, “object definition”, “thumbnail”… Object definition file This file defines the Properties, Objects and instance as well as the unit information. The customized properties in DWG file are convert into this file. The object definition in this file indicates its id and its property group. The instance definition in this file indicates the object id and its corresponding node id. 2d streaming graphics file This file refers to the path definition part of FixedPage.fpage, which contains the graphics information converted from DWG file, i.e. Line definition. 2d graphics extension file This file contains the information to connect the  2d streaming graphics file with the Object definition file.

看完這個表, 你大概應該知道, DWFx裡面的"2d streaming graphics file"大概對應了XPS裡面的FixedPage. 它就是顯示DWFx與XPS兼 容性的地方. 對於這個包的入口, DWFx也兼容XPS, 但是它又有自己完全獨立的入口, 叫做"DWFDocumentSequence.dwfseq". 從它開始深入 下去, 能獲得從XPS規格無法取得的額外信息, 比如Block, 比如Layer等.

另外這個表的最後三行, 恰恰是DWFx文件的核心數據部分. 而它們又是互相聯系的. 這個聯系的示意圖如下:

好了, 我們應該到此打住了. 更深入的發現, 等著聰明的你繼續深入下去:)

下一節, 也是這個系列的最後一節, 將講述三個方面的問題, 即:

如何在WPF裡面呈現DWFx文件

.NET程序集對於XPS包的支持

如何在本節的基礎上, 對DWFx的內容進行操作.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved