引言

在项目开发中,word的读取和显示会经常出现在客户的需求中。特别是一些有关法律规章制度、通知、红头文件等,都是用word发布的。

在WPF中,对显示WORD没有特定的控件,这对开发显示WORD的需求就增加了点困难。其实只要转换下思路,问题就可以迎刃而解了。

WORD转换为XPS

没错,就是XPS了。XPS 是XML Paper Specification(XML文件规格书)的简称,是一种电子文件格式,它是微软公司开发的一种文档保存与查看的规范。.NET平台下,对操作XPS文件格式,提供了支持。另外,在WPF中,可以使用DocumentViewer来浏览XPS文件。这时只需把word转换为XPS,再用DocumentViewer来显示,问题就得到了很好的解决。下面是word转换为xps的方法,需要引用Microsoft.Office.Interop.Word组件。

 private XpsDocument ConvertWordToXPS(string wordDocName)
{
FileInfo fi=new FileInfo(wordDocName);
XpsDocument result = null;
string xpsDocName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache), fi.Name);
xpsDocName = xpsDocName.Replace(".docx", ".xps").Replace(".doc", ".xps");
Microsoft.Office.Interop.Word.Application wordApplication = new Microsoft.Office.Interop.Word.Application();
try
{
if (!File.Exists(xpsDocName))
{
wordApplication.Documents.Add(wordDocName);
Document doc = wordApplication.ActiveDocument;
doc.ExportAsFixedFormat(xpsDocName, WdExportFormat.wdExportFormatXPS, false, WdExportOptimizeFor.wdExportOptimizeForPrint, WdExportRange.wdExportAllDocument, , , WdExportItem.wdExportDocumentContent, true, true, WdExportCreateBookmarks.wdExportCreateHeadingBookmarks, true, true, false, Type.Missing);
result = new XpsDocument(xpsDocName, System.IO.FileAccess.Read);
} if (File.Exists(xpsDocName))
{
result = new XpsDocument(xpsDocName, FileAccess.Read);
} }
catch (Exception ex)
{
string error = ex.Message;
wordApplication.Quit(WdSaveOptions.wdDoNotSaveChanges);
} wordApplication.Quit(WdSaveOptions.wdDoNotSaveChanges); return result;
}

上面方法传递一个word文件路径,然后返回一个XpsDocument。方法用我把XPS文件存放到了SpecialFolder.InternetCache文件夹中,因为XPS是作为中间转换,不需要存放和使用。方法返回XpsDocument,就可以使用下面两行代码即可显示到界面上来:

docViewer.Document = ConvertWordToXPS(filePath).GetFixedDocumentSequence();
docViewer.FitToWidth();

这样,一个显示WORD文档就轻搞定了!

源码下载:

扩展

1、这只是显示WORD的,那能显示PDF,txt嘛?答案是肯定的。同样,只需把PDF,txt转换为XPS就可以了。PDF转换为XPS,可以参考下这篇:Link。采用Adobe Reader 和Microsoft XPS默认打印,然后另存为的方式,这个方法有点麻烦,其实还有更有效的方法,这里就留给大家思考和google了。

2、上面的XPS只作为中间转换,能否保存起来,这样下次就不用再转换,直接读取?Of course ! 保存XPS,可以有两种方法,一种是用文件式保存到指定目录中;一种是保存到数据库中。文件式的保存,我就不多介绍了。那XPS如何保存到数据库中呢?其实,XPS是一种二进制流的格式,这和image保存到数据库中是一样的。所以,只需把XPS文件读成byte类型,就可以保存到数据库中image类型的字段下。显示时,直接从数据库中读取生成XPS显示到DocumentViewer上就可以了。但这样做有个缺点:当文件转换为XPS,文件会变大,如果保存起来的,相当浪费空间。

Thank you !

WPF读取和显示word的更多相关文章

  1. 51单片机实现对24C02进行页写、顺序读取并显示验证

    //************************************************************************************* //**程序名称:51单 ...

  2. AvalonEdit-基于WPF的代码显示控件

    AvalonEdit是基于WPF的代码显示控件,项目地址:https://github.com/icsharpcode/AvalonEdit,支持C#,javascript,C++,XML,HTML, ...

  3. Sqlite表结构读取工具,word批量转html,在线云剪贴板,文件批量提取工具;

    工欲善其事必先利其器,本周为您推荐工具排行 Sqlite表结构读取工具,word批量转html,在线云剪贴板,文件批量提取工具:     本周我们又要发干货了,准备好接受了吗? 为什么是干货,就是因为 ...

  4. (学习笔记3)BMP位图的读取与显示

    在(学习笔记2)中.我们已经具体说明怎样去创建MFC.在这节中.主要解决BMP位图照片的读取和显示问题. 我们新建一个projectdemo1.创建步骤请看(学习笔记2)中具体说明. 创建成功后,例如 ...

  5. 《python核心编程》笔记——文件的创建、读取和显示

    创建文件(makeTextFile.py)脚本提醒用户输入一个尚不存在的文件名,然后由用户输入文件每一行,最后将所有文本写入文本文件 #!/usr/bin/env python 'makeTextFi ...

  6. Winform实现Shp-栅格图形文件的读取与显示(外加shp转WKB格式存入oracle)附源码

    前言:上学期GIS空间数据库课程设计时,老师让实现Shp-栅格图形文件的读取与显示,外加shp转WKB格式存入oracle,不使用第三方类库,花了一天时间在网上找了一些资料,实现了一个简单的栅格图形文 ...

  7. java使用poi读取ppt文件和poi读取excel、word示例

    java使用poi读取ppt文件和poi读取excel.word示例 http://www.jb51.net/article/48092.htm

  8. Android中使用POI加载与显示word文档

    最近打算实现一个功能:在Android中加载显示Word文档,当然这里不是使用外部程序打开.查看一些资料后,打算采用poi实现,确定了以下实现思路: 将ftp中的word文档下载到本地. 调用poi将 ...

  9. [RGEOS]支持栅格数据读取和显示

    SharpMap真的很强大,这里通过改造GdalRasterLayer类实现了在RGeos项目中支持栅格图像的读取和显示,同时支持影像的无级缩放. GdalRasterLayer通过读取FWTools ...

随机推荐

  1. http各种状态码具体解释

    1XX (暂时响应)   100(继续) 请求者应当继续提出请求.   101(切换协议)请求者已要求server切换协议,server已确认并准备切换 2XX(成功)    ·200(成功) ser ...

  2. IOS开发中经常使用的宏定义

    ios讨论群1群:135718460 有些时候.我们须要将代码简洁化,这样便于读代码.我们能够将一些不变的东东抽取出来.将变化的东西作为參数. 定义为宏,这样在写的时候就简单多了. 以下例举了一些经常 ...

  3. ubuntu系统安装和配置

    1.分区信息 1.1 /boot分区 这个分区包括了操作系统的内核和在启动系统过程中所要用到的文件.假设有了一个单独的/boot启动分区,即使基本的根分区出现了问题,计算机依旧可以启动.这个分区的大小 ...

  4. Objective-C编码规范[译]

    原文链接 : The official raywenderlich.com Objective-C style guide 原文作者 : raywenderlich.com Team 译文出自 : r ...

  5. activiti自己定义流程之整合(五):启动流程时获取自己定义表单

    流程定义部署之后,自然就是流程定义列表了,但和前一节一样的是,这里也是和之前单独的activiti没什么差别.因此也不多说.我们先看看列表页面以及相应的代码,然后在一步步说明点击启动button时怎样 ...

  6. 小强的HTML5移动开发之路(33)—— jqMobi基础

    一.什么是jqMobi jqMobi是由appMobi针对HTML5浏览器和移动设备开发的javascript框架,是个极快速的查询选择库,支持W3C查询. 版本 jqMobi源码最初在2012年1月 ...

  7. Boost_1_33_1沒有想像中的恐怖 (李维)

    2006/11/16 下午 02:14:16原則上要先使用build.bat, 產生bjam.exe, 再編繹出library. 由於各編譯器不同, lib並無法共用! 編譯完成後:*.lib在 C: ...

  8. NOIP2015 运输计划 - 二分 + 树链剖分 / (倍增 + 差分)

    BZOJ CodeVS Uoj 题目大意: 给一个n个点的边带权树,给定m条链,你可以选择树中的任意一条边,将它置为0,使得最长的链长最短. 题目分析: 最小化最大值,二分. 二分最短长度mid,将图 ...

  9. 检索 04 --Stack栈 Queue队列 Hashtable哈希表

    //Stack 先进后出 没有索引 Stack st = new Stack(); st.Push(12); st.Push(11); st.Push(22); st.Push(34); st.Pus ...

  10. java常用api2

    calendar calendar=calendar.getInstance(); StringBuilder和C#的用法一样 hashSet无序的,不可重复 LInkedHashSet有序的,不可重 ...