随笔 - 33, 文章 - 0, 评论 - 148, 阅读 - 92564
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

XPS文档阅读器

Posted on   ghwghw  阅读(8728)  评论(23编辑  收藏  举报

 

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

 

 

 

 

点击源码下载:

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示