XPS文档阅读器
XPS是微軟的一個文檔標準,就像Adobe的PDF,現在網上也有很多的PDF文檔在線閱讀器,而XPS文檔閱讀器很少幾乎沒有。今天我將我制作的這個XPS文檔閱讀器拿出來跟大家分享,也順便期望某個高手能解決一些問題,共同進步。本XPS閱讀器可以實現的效果如下:可以完美還原原來文檔的原貌,添加頁面導航功能(類似于Word中標題導航,如果是外部URL的鏈接那么將打開新頁面),添加了翻頁動畫效果(提供了屬性可以自定義翻頁動畫)。
?XPS是微軟的一個文檔標準,最新版下載:http://www.freeeim.com/
隨著Silverlight4 的發布,Silverlight版的XPS閱讀器也變的可行。其實國外牛人早在Silverlight3的時候就發布了XPS閱讀器,但卻是收費的。最主要的原因是Silverlight4以前的所有版本都不支持為Glyphs設置FontSource屬性。這樣導致了除非你另寫一套類庫來模擬Glyphs不然只有購買第三方的類庫。可是現在Silverlight支持位Glyphs設置FontSource屬性了,所以現在我們可以設計制作一個Silverlight版的XPS閱讀器。唯一的遺憾是無法讀取直接由打印出來的XPS文檔,只能讀取由Office轉換過來的XPS文檔,問題出在當文檔時由打印獲得的XPS文檔的時候,無法獲取相關的資源(期望某位高手能解決)。下圖是本項目的類文件:
?
?
這里幾乎所有的類文件都是按照XPS的文檔結構來建立的。我們可以隨便拿出一個由office轉換來的XPS文檔,然后將文件的后綴名改為zip格式,然后解壓文件就可以看到整個文檔的結構了。所有類中最重要的類有三個:XpsDocument這個類是承載文檔的(也就是流Stream),XpsToSilverlightXaml這個類是專門負責將XML轉換成Xaml(參考國外的一篇blog,名字忘了),FixedPage這個類是專門用來承載頁面的(負責顯示頁面),其他的類就是為了輔助以及配合文檔結構用的。(http://hi.baidu.com/feiqiu_ok)
這里為了區別是否是由Office轉換而來的,特意加了一個XpsDocumentType枚舉用來表示文檔類型。
其他的就不多說了,全都在源碼里面。有什么不明白的可以留言給我。
然后下面是XPS控件的用法:
1.? 首先在頁面中添加控件的引用xmlns:xps="clr-namespace:MyControl.XpsDocument;assembly=MyControl"
2.? 然后就是添加控件了
? <ScrollViewer>
??????? <StackPanel x:Name="LayoutRoot">
??????????? <xps:XpsDocument IsEnableAnima="True"
??????????????????????????? ?x:Name="xpsDocument"
??????????????????????????? ?IsEnableNavigate="True">
???????? ???</xps:XpsDocument>
??????????? <StackPanel Orientation="Horizontal"
?????????????????????? ?HorizontalAlignment="Center">
??????????????? <xps:XpsControl x:Name="xpsControl"></xps:XpsControl>
??????????????? <Button Content="Load"
?????????????????????? ?Click="Button_Click"></Button>
??????????? </StackPanel>
??????? </StackPanel>
??? </ScrollViewer>
其中屬性IsEnableAnima表示是否啟用翻頁動畫,如果啟用默認的是一個180度旋轉動畫,也可以通過自定義的方式為Xps控件添加翻頁動畫。屬性IsEnableNavigate表示是否啟用頁面導航功能。(http://freeeim.blog.sohu.com/)
3.? 為button添加事件,用來加載XPS文檔:
?? private void Button_Click(object sender, RoutedEventArgs e)
??????? {
??????????? OpenFileDialog opFile = new OpenFileDialog();
??????????? if (opFile.ShowDialog() == true)
??????????? {
??????????????? var newStream = new StreamResourceInfo(opFile.File.OpenRead(), null);
??????????????? xpsDocument.SetStream(newStream);
??????????????? xpsControl.Document = xpsDocument;
??????????? }
??????? }
至此一個XPS閱讀器就完成了。先點擊Load按鈕加載XPS文檔,然后下一頁就能顯示文檔了。如果要添加更多的功能,比如選擇文字,放大縮小,那就請各位自行添加了。(http://www.freeeim.com/bbs/)
最后,唯一的遺憾是不能加載由打印獲取的XPS文檔,如果哪位牛人解決了這個問題還請麻煩告訴我下,不勝感激!
總結
- 上一篇: 线性判别分析LDA的数学原理(二)
- 下一篇: Qt修炼手册8_常用的容器类QVecto