从DWG到XAML (II) DWFx格式解析及其和XPS的关系
導(dǎo)讀
第一篇: 從DWG到 XAML (I) - 淺談DWG歷史,現(xiàn)狀及方向
第三篇: 從DWG到XAML (III) – .NET中的 XPS Packaging類庫及一個DWFx Packaging類庫的實(shí)現(xiàn) (源碼)
上一篇文章簡單介紹了DWG格式的歷史, 現(xiàn)狀, 以及互操作的選擇. 那么, AutoDesk宣稱AutoCAD與XPS文件格式兼容, 究竟意味著什么呢? 這一切, 得從XPS文件格式說起.
什么是XPS
XPS 是 XML Paper Specification 的簡稱. 它誕生于2006年下半年, 跟隨Windows Vista發(fā)布并且在Vista平臺上應(yīng)用頗多, 是微軟開發(fā)的一種文檔保存與查看的規(guī)范。這個規(guī)范本身描述了這種格式以及分發(fā)、歸檔、顯示以及處理 XPS 文檔所遵循的規(guī)則。最為顯著的特點(diǎn)是,XPS 所用的置標(biāo)語言(Markup Language)是 WPF 所用的 XAML 的一個子集,因此顯示 Windows 應(yīng)用程序所用的方法可以用于 XPS 文檔。
為了推廣這種格式,微軟公司遵循免收專利費(fèi)的授權(quán)方式發(fā)布 XPS,允許用戶在特定場合創(chuàng)建自己的讀、寫以及顯示 XPS 文件的實(shí)現(xiàn)方法。其規(guī)范本身也遵循免收專利費(fèi)的方式發(fā)布,并且允許自由分發(fā). 如果您有興趣, 現(xiàn)在依舊可以從微軟的站點(diǎn)上自由下載XPS的技術(shù)規(guī)范. 這是一個600多頁的技術(shù)文檔, 詳細(xì)說明了XPS的方方面面, 包括XPS文件的組織形式, 圖像/字體以及版權(quán)管理等內(nèi)容.
現(xiàn)在我們知道, 類似于Open XML (Office 2007的基本組織形式), XPS 文件實(shí)際上也是一個包含組成文檔的各個文件的ZIP文檔. 微軟公司給我們提供了XPS的示例文檔,我們可以從這里獲取. 如果你覺得這個示例文檔包太大, 我們也可以嘗試最簡單的辦法.
打開Word 2007
隨便寫幾個字, 或者插入幾張圖片
另存為XPS
XPS Viewer會啟動并顯示生成的XPS文件.
XPS Viewer是從Vista時代就捆綁到操作系統(tǒng)中的. 不過這不重要, 我們關(guān)注的不是XPS Viewer而是XPS文檔內(nèi)部結(jié)構(gòu). 現(xiàn)在, 我這里已經(jīng)有了一個XPS示例文檔, 如果您有興趣, 可以下載并自行查看.
XPS的組織結(jié)構(gòu)
如果600多頁的技術(shù)規(guī)范讓您感到厭倦, 那么你不妨試試?yán)^續(xù)讀以下內(nèi)容. 這會提供給你一個關(guān)于XPS大體框架以及各部分功能的一個概述. 如果您覺得我說的不夠詳細(xì), 那么那時候您可以在這個基本印象的基礎(chǔ)上對應(yīng)查閱XPS技術(shù)規(guī)格文檔的對應(yīng)章節(jié).
我們先解剖一下xps文件. 將XPS文件后綴名改為.zip并解壓縮, 我們就得到了以XPS文件名為目錄名的一個目錄. 這個根目錄下的文件如圖所示.
就想你心中揣測的一樣. 是的, 你猜對了, 這個圖暗示了這樣的信息:
FixedDocSeq.fdseq文件 - 必須是同文件名,同后綴名, 這是XPS技術(shù)規(guī)范所規(guī)定的, 是整個XPS文檔的入口. 如果沒有這個文件, XPS文檔將不可以被識別和操作. 事實(shí)上, 這個文件的內(nèi)容是一寫指向具體文檔的引用. 多文檔XPS文件, 會有多個引用記錄;單文檔XPS文件只有一個引用記錄, 例如:
FixedDocSeq.fdseq
<FixedDocumentSequence xmlns="http://schemas.microsoft.com/xps/2005/06">
<DocumentReference Source="/Documents/1/FixedDoc.fdoc"/>
</FixedDocumentSequence>
docProps目錄 - 這個目錄主要用來保存和文檔屬性有關(guān)的內(nèi)容, 比如文檔的縮略圖, 文檔的創(chuàng)建/修改時間等.
Resources目錄 - 這個目錄主要保存多媒體信息, 比如文檔中插入的圖像, 比如文檔中使用的字體. 我建議你自己打開看一看, 因?yàn)樽煮w比較有趣, 不是我們常見的那種Truetype字體或者點(diǎn)陣字體, 而是后綴名.odttf的被混淆的字體. 這是個相當(dāng)有趣的話題, 如果有興趣, 大家可以深入研究一下:)
Documents目錄 - 這個目錄是最重要的, 它存放了大部分和XPS內(nèi)容呈現(xiàn)有關(guān)的材料, 比如文檔信息, 頁面信息, 文檔結(jié)構(gòu)等.這個目錄的下一級是一個以序號命名的目錄. 序號目錄的下一級, 是FixedDoc.fdoc/Pages目錄/Structure目錄. FixedDoc.fdoc指向了文檔顯示的具體頁面(Page), Pages目錄里面保存了所有的頁面, Structure目錄保存了說明文檔結(jié)構(gòu)的.struct文件. 事實(shí)上, Page就是直接作為渲染源, 通過諸如XPS Viewer等查看工具, 直接被呈現(xiàn)在你眼前的文檔內(nèi)容. FixedDoc.fdoc文件的內(nèi)容大多比較簡單, 比如本例中:
FixedDoc.fdoc
<PageContent Source="Pages/1.fpage"></PageContent>
FixedPage.fpage的內(nèi)容則相當(dāng)豐富, 因?yàn)樗P(guān)系到絕大部分的內(nèi)容呈現(xiàn):
Fixed Page
<FixedPage xmlns="http://schemas.microsoft.com/xps/2005/06" Width="794"
Height="1123" xml:lang="zh-CN">
<Canvas>
<Canvas.RenderTransform>
<MatrixTransform Matrix="1.333333333,0,0,1.333333333,0,0"/>
</Canvas.RenderTransform>
<Glyphs Name="a0" BidiLevel="0" Fill="#FF000000"
FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="90.125"
OriginY="83.325" UnicodeString="X" Indices="" xml:lang="en-US">
</Glyphs>
<Glyphs Name="a1" BidiLevel="0" Fill="#FF000000"
FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="95.375"
OriginY="83.325" UnicodeString="ps " Indices=",50;,35.714;" xml:lang="en-US">
</Glyphs>
<Glyphs Name="a2" BidiLevel="0" Fill="#FF000000"
FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="107.37"
OriginY="83.325" UnicodeString="demo" Indices=",50;,50;,78.571;" xml:lang="en-US">
</Glyphs>
<Glyphs Name="a3" BidiLevel="0" Fill="#FF000000"
FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="132.18"
OriginY="83.325" UnicodeString=" " Indices="" xml:lang="en-US">
</Glyphs>
<Glyphs Name="a4" BidiLevel="0" Fill="#FF000000"
FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="501.63"
OriginY="415.13" UnicodeString=" " Indices="" xml:lang="en-US">
</Glyphs>
<Glyphs Name="a5" BidiLevel="0" Fill="#FF000000"
FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="90.125"
OriginY="427.13" UnicodeString="X" Indices="" xml:lang="en-US">
</Glyphs>
<Glyphs Name="a6" BidiLevel="0" Fill="#FF000000"
FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="95.375"
OriginY="427.13" UnicodeString="ps " Indices=",50;,35.714;" xml:lang="en-US">
</Glyphs>
<Glyphs Name="a7" BidiLevel="0" Fill="#FF000000"
FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="106.62"
OriginY="427.13" UnicodeString="end" Indices=",57.143;,50;" xml:lang="en-US">
</Glyphs>
<Glyphs Name="a8" BidiLevel="0" Fill="#FF000000"
FontUri="/Resources/30AC4461-3665-645B-4B00-7251C76B5C3D.odttf"
FontRenderingEmSize="10.5" StyleSimulations="None" OriginX="123.9"
OriginY="427.13" UnicodeString=" " Indices="" xml:lang="en-US">
</Glyphs>
<Path Data="M 91.5,88.25 L 500.31,88.25 L 500.31,414.55 L 91.5,414.55 Z"
Clip="M -0.000000465,87.75 L 595.5,87.75 L 595.5,415.5 L -0.000000465,415.5 Z "
AutomationProperties.HelpText="Capture3.PNG">
<Path.Fill>
<ImageBrush ImageSource="/Resources/Images/image_0.jpg"
Viewbox="0,0,545.08,435.06" TileMode="None" ViewboxUnits="Absolute"
ViewportUnits="Absolute" Viewport="0,0,1,1">
<ImageBrush.Transform>
<MatrixTransform Matrix="408.81,0,0,326.3,91.5,88.25"/>
</ImageBrush.Transform>
</ImageBrush>
</Path.Fill>
</Path>
</Canvas>
</FixedPage>
這個文檔的內(nèi)容讓我們相當(dāng)興奮, 因?yàn)樗呛蚖PF XAML規(guī)格直接兼容的(除了字體)! 雖然這是一個普通的由word生成的XPS文檔, 而非一個由DWG轉(zhuǎn)化而成的DWFx文檔, 但是既然DWFx宣稱兼容XPS, 那么它在WPF中呈現(xiàn)肯定不是問題了.
所以, 總結(jié)起來說, XPS主要元素的組織形式, 大概可以是如右圖, 當(dāng)然這僅僅是個為了加深印象的示意圖, 實(shí)際上fpage文件引用了字體文件和圖像文件.
好吧,我們有點(diǎn)迫不及待的想知道DWFx格式的內(nèi)幕了. DWFx文件就是一個平凡意義上的XPS嗎? 它有自己特有的元素嗎? 除了呈現(xiàn), 我們還有操作DWFx內(nèi)容的可能嗎?
從DWG到DWFx
當(dāng)然, 為了從DWG文件獲得XAML, 這是最重要的一步, 從DWG文件轉(zhuǎn)化為DWFx文件. 這在很多人看來是個很簡單的事情 - 如果安裝了AutoCAD, 那么直接文件另存為就可以了. 可是事情往往不是這么簡單. 首先你發(fā)現(xiàn)另存為DWFx以后再次打開, 內(nèi)容有可能變了, 這說明默認(rèn)格式轉(zhuǎn)換的配置文件有些問題; 其實(shí)你發(fā)現(xiàn)AutoCAD太貴了, 你買不起或者你的客戶不愿意投資.
所以我們首先需要的是另外一個工具, 這個工具既可以將DWG文件轉(zhuǎn)換為DWFx文件, 又必須是免費(fèi)的. 有這種工具么? 是的, 而且是AutoDesk官方出品的工具 – DWG TrueView. 點(diǎn)擊鏈接注冊后可以下載. 運(yùn)行這個軟件, 你可以先嘗嘗鮮看看.
其實(shí)從DWG文件轉(zhuǎn)化為DWFx的步驟相當(dāng)簡單, 只需要對其中一點(diǎn)注意即可:
1.用TrueView打開待轉(zhuǎn)換的DWG文件;
2.點(diǎn)擊"主菜單"圖標(biāo), 打開Export子菜單, 你可以看到TrueView支持將DWG文件轉(zhuǎn)化為DWF文件,DWFx文件,以及PDF文件.
3.點(diǎn)擊"DWFx"菜單, 打開"Save As DWFx"對話框
4.點(diǎn)擊"option"按鈕. 這就是需要注意的一步了, 如果你想保留盡可能多的DWG文件信息, 比如Block信息, 你需要這一步來設(shè)置導(dǎo)出文件內(nèi)容.
5.在上一步彈出的菜單中選擇"包含Block", 并掃描創(chuàng)建新的Block模板.
6.保存模板. 點(diǎn)擊確定回到"Save As DWFx"對話框.小心選擇"Export"選項(xiàng), 一般這個選項(xiàng)有"Window"/"Display"/"Extent". 選擇"Display"是當(dāng)前可見部分, 選擇"Window"是當(dāng)前窗口部分, 選擇"Extent"是拉伸后的整個圖即原圖. 一般選擇"Extent"就可以了.
7.點(diǎn)擊去頂就開始了導(dǎo)出過程.
8.最終得到我們的DWFx文件.
從XPS到DWFx
現(xiàn)在我們可以繼續(xù)解剖工作了. 這次的解剖對象是一個DWFx文件, 你可以在這里獲得它. 因?yàn)镈WFx兼容XPS規(guī)范, 所以我們同樣改掉后綴名為zip然后解壓縮打開, 得到了如右示意圖這樣一個目錄結(jié)構(gòu). 這個示意圖標(biāo)出了對于DWG普通意義上來說比較重要的部分. 如果你對DWFx感興趣, 我還是推薦你拿一個DWFx文件親自看一看, 這樣印象可能更深刻些. 這個圖下面是目錄級別示意圖.
哇, 這么多文件和目錄啊, 那么這些文件和目錄都是什么意思呢? 哪些對我來說有意義?
我簡單總結(jié)了一下, 并且畫了下面這個說明表:
|
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. |
看完這個表, 你大概應(yīng)該知道, DWFx里面的"2d streaming graphics file"大概對應(yīng)了XPS里面的FixedPage. 它就是顯示DWFx與XPS兼容性的地方. 對于這個包的入口, DWFx也兼容XPS, 但是它又有自己完全獨(dú)立的入口, 叫做"DWFDocumentSequence.dwfseq". 從它開始深入下去, 能獲得從XPS規(guī)格無法取得的額外信息, 比如Block, 比如Layer等.
另外這個表的最后三行, 恰恰是DWFx文件的核心數(shù)據(jù)部分. 而它們又是互相聯(lián)系的. 這個聯(lián)系的示意圖如下:
好了, 我們應(yīng)該到此打住了. 更深入的發(fā)現(xiàn), 等著聰明的你繼續(xù)深入下去:)
下一節(jié), 也是這個系列的最后一節(jié), 將講述三個方面的問題, 即:
如何在WPF里面呈現(xiàn)DWFx文件
.NET程序集對于XPS包的支持
如何在本節(jié)的基礎(chǔ)上, 對DWFx的內(nèi)容進(jìn)行操作.
另: 文中提到的所有文件, 除了明顯給出鏈接的之外, 我打了一個包, 可以從這里下載.
作者:Jeffrey Sun
出處:http://sun.cnblogs.com/
本文以“現(xiàn)狀”提供且沒有任何擔(dān)保,同時也沒有授予任何權(quán)利。本文版權(quán)歸作者所有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
總結(jié)
以上是生活随笔為你收集整理的从DWG到XAML (II) DWFx格式解析及其和XPS的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO Ace2/ EVA 限定版现已
- 下一篇: 别在纠结微信图文消息封面图片多大好,过来