XPS 文档阅读器


XPS是微软的一个文档标准,就像Adobe的PDF,现在网上也有很多的PDF文档在线阅读器,而XPS文档阅读器很少几乎没有。今天我将我制作的这个XPS文档阅读器拿出来跟大家分享,也顺便期望某个高手能解决一些问题,共同进步。本XPS阅读器可以实现的效果如下:可以完美还原原来文档的原貌,添加页面导航功能(类似于Word中标题导航,如果是外部URL的链接那么将打开新页面),添加了翻页动画效果(提供了属性可以自定义翻页动画)。

  随着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这个类是专门用来承载页面的(负责显示页面),其他的类就是为了辅助以及配合文档结构用的。

  这里为了区别是否是由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表示是否启用页面导航功能。

  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文档,然后下一页就能显示文档了。如果要添加更多的功能,比如选择文字,放大缩小,那就请各位自行添加了。

  最后,唯一的遗憾是不能加载由打印获取的XPS文档,如果哪位牛人解决了这个问题还请麻烦告诉我下,不胜感激!


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3