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

     

     

    点击源码下载:

  • 相关阅读:
    程序员:不要自称为码农
    SpringBoot对静态资源配置
    LeetCode 572. Subtree of Another Tree(子树)
    LeetCode 437. Path Sum III(统计路径和等于sum的路径数量)
    LeetCode 112. Path Sum(判断路径和是否等于一个数)
    LeetCode 617. Merge Two Binary Trees(归并两棵二叉树)
    LeetCode 226. Invert Binary Tree(翻转二叉树)
    Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.6 的解决办法
    linux-查询某软件的安装的目录
    WebService概念解释
  • 原文地址:https://www.cnblogs.com/dagehaoshuang/p/1780849.html
Copyright © 2011-2022 走看看