zoukankan      html  css  js  c++  java
  • 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文档,如果哪位牛人解决了这个问题还请麻烦告诉我下,不胜感激!

     

     

    点击源码下载:

  • 相关阅读:
    #1045
    PHP程序员的技术成长规划
    403 Forbidden
    读《暗时间》的思考
    常用判断重复记录的SQL语句
    PHP中生产不重复随机数的方法
    echo 1+2+"3+4+5“输出的结果是6
    GET vs. POST
    详解PHP中的过滤器(Filter)
    Session变量在PHP中的使用
  • 原文地址:https://www.cnblogs.com/dagehaoshuang/p/1780849.html
Copyright © 2011-2022 走看看