读取XPS格式文件或将doc,txt文件转化为XPS文件,效果图如下:

1.XAML页面代码:

<Window x:Class="WpfWord.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WordReader" Height="" Width="">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="" Name="cdTree"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<GroupBox Header="导航目录">
<TreeView Name="tvTree" SelectedItemChanged="tvTree_SelectedItemChanged"/>
</GroupBox>
<GridSplitter Width="" ResizeBehavior="PreviousAndNext" Grid.Column="" Background="LightGray"/>
<Grid Grid.Column="">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DocumentViewer Name="dvShow" Grid.Row=""/>
<StackPanel Grid.Row="" Orientation="Horizontal" HorizontalAlignment="Right">
<CheckBox Content="显示导航" Height="" Margin="" Name="cbNav" Width="" Click="cbNav_Click" />
<Label Content="页面"/>
<Label Name="lblCurPage" Margin=""/>
<Label Name="lblPage"/>
<Button Content="上一页" Height="" Name="btnPrev" Width="" Click="btnPrev_Click" />
<Button Content="下一页" Height="" Name="btnNext" Width="" Click="btnNext_Click" />
<Label Content="总字数:" Name="lblWordCount"/>
</StackPanel>
</Grid>
</Grid>
</Window>

2.后台CS文件代码:

首先引用Microsoft.Office.Interop.Word.dll;

//具体代码如下↓

using System;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Xps.Packaging;
using System.Xml;
using Microsoft.Office.Interop.Word; namespace WpfWord
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : System.Windows.Window
{ #region 全局变量 /// <summary>
/// 用于存放目录文档各节点OutlineLevel值,并转化为int型
/// </summary>
int[] array = null; /// <summary>
/// 用于存放目录文档各节点OutlineLevel值
/// </summary>
string[] array1 = null; /// <summary>
/// 用于存放目录文档各节点Description值,章节信息
/// </summary>
string[] arrayName = null; /// <summary>
/// 用于存放目录文档各节点OutlineTarget值,页码信息
/// </summary>
string[] pages = null; #endregion public MainWindow()
{
InitializeComponent();
OpenFile(null);
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="strFilePath">文件路径</param>
public MainWindow(string strFilePath)
: this()
{
} #region 方法 /// <summary>
/// 读取导航目录
/// </summary>
private void ReadDoc(XpsDocument xpsDoc)
{
IXpsFixedDocumentSequenceReader docSeq = xpsDoc.FixedDocumentSequenceReader;
IXpsFixedDocumentReader docReader = docSeq.FixedDocuments[];
XpsStructure xpsStructure = docReader.DocumentStructure;
Stream stream = xpsStructure.GetStream();
XmlDocument doc = new XmlDocument();
doc.Load(stream);
//获取节点列表
XmlNodeList nodeList = doc.ChildNodes.Item().FirstChild.FirstChild.ChildNodes;
if (nodeList.Count <= )//判断是否存在目录节点
{
//tvTree.Visibility = System.Windows.Visibility.Hidden;
tvTree.Items.Add(new TreeViewItem { Header = "没有导航目录" });
return;
}
tvTree.Visibility = System.Windows.Visibility.Visible; array = new int[nodeList.Count];
array1 = new string[nodeList.Count];
arrayName = new string[nodeList.Count];
pages = new string[nodeList.Count];
for (int i = ; i < nodeList.Count; i++)
{
array[i] = Convert.ToInt32(nodeList[i].Attributes["OutlineLevel"].Value);
array1[i] = nodeList[i].Attributes["OutlineLevel"].Value.ToString();
arrayName[i] = nodeList[i].Attributes["Description"].Value.ToString();
pages[i] = nodeList[i].Attributes["OutlineTarget"].Value.ToString();
} for (int i = ; i < array.Length - ; i++)
{
//对array进行转换组装成可读的树形结构,通过ASCII值进行增加、转换
array1[] = "A";
if (array[i + ] - array[i] == )
{
array1[i + ] = array1[i] + 'A';
}
if (array[i + ] == array[i])
{
char s = Convert.ToChar(array1[i].Substring((array1[i].Length - ), ));
array1[i + ] = array1[i].Substring(, array1[i].Length - ) + (char)(s + );
}
if (array[i + ] < array[i])
{
int m = array[i + ];
char s = Convert.ToChar(array1[i].Substring(, m).Substring(m - , ));
array1[i + ] = array1[i].Substring(, m - ) + (char)(s + );
}
} //添加一个节点作为根节点
TreeViewItem parent = new TreeViewItem();
TreeViewItem parent1 = null;
parent.Header = "目录导航";
Boolean flag = false;
for (int i = ; i < array.Length; i++)
{
if (array[i] == )
{
flag = true;
}
if (flag) //如果找到实际根节点,加载树
{
parent1 = new TreeViewItem();
parent1.Header = arrayName[i];
parent1.Tag = array1[i];
parent.Items.Add(parent1);
parent.IsExpanded = true;
parent1.IsExpanded = true;
FillTree(parent1, array1, arrayName);
flag = false;
}
} tvTree.Items.Clear();
tvTree.Items.Add(parent); } /// <summary>
/// 填充树的方法
/// </summary>
/// <param name="parentItem"></param>
/// <param name="str1"></param>
/// <param name="str2"></param>
public void FillTree(TreeViewItem parentItem, string[] str1, string[] str2)
{
string parentID = parentItem.Tag as string;
for (int i = ; i < str1.Length; i++)
{
if (str1[i].IndexOf(parentID) == && str1[i].Length == (parentID.Length + ) && str1[i].ElementAt().Equals(parentID.ElementAt()))
{
TreeViewItem childItem = new TreeViewItem();
childItem.Header = str2[i];
childItem.Tag = str1[i];
parentItem.Items.Add(childItem);
FillTree(childItem, str1, str2);
}
}
} /// <summary>
/// 打开文件-如果传入路径为空则在此打开选择文件对话框
/// </summary>
/// <param name="strFilepath">传入文件全路径</param>
private void OpenFile(string strFilepath)
{
if (string.IsNullOrEmpty(strFilepath))
{
Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog();
openFileDialog.DefaultExt = ".doc|.txt|.xps";
openFileDialog.Filter = "*(.xps)|*.xps|Word documents (.doc)|*.doc|Word(2007-2010)(.docx)|*.docx|*(.txt)|*.txt";
Nullable<bool> result = openFileDialog.ShowDialog();
strFilepath = openFileDialog.FileName;
if (result != true)
{
return;
}
}
this.Title = strFilepath.Substring(strFilepath.LastIndexOf("\\")+);
if (strFilepath.Length > )
{
XpsDocument xpsDoc = null;
//如果是xps文件直接打开,否则需转换格式
if (!strFilepath.EndsWith(".xps"))
{
string newXPSdocName = String.Concat(System.IO.Path.GetDirectoryName(strFilepath), "\\", System.IO.Path.GetFileNameWithoutExtension(strFilepath), ".xps");
xpsDoc = ConvertWordToXPS(strFilepath, newXPSdocName);
}
else
{
xpsDoc = new XpsDocument(strFilepath, System.IO.FileAccess.Read);
}
if (xpsDoc != null)
{
dvShow.Document = xpsDoc.GetFixedDocumentSequence(); //读取文档目录
ReadDoc(xpsDoc);
xpsDoc.Close();
}
this.lblCurPage.Content = ;
this.lblPage.Content = "/" + dvShow.PageCount;
}
} /// <summary>
/// 将word文档转换为xps文档
/// </summary>
/// <param name="wordDocName">word文档全路径</param>
/// <param name="xpsDocName">xps文档全路径</param>
/// <returns></returns>
private XpsDocument ConvertWordToXPS(string wordDocName, string xpsDocName)
{
XpsDocument result = null; //创建一个word文档,并将要转换的文档添加到新创建的对象
Microsoft.Office.Interop.Word.Application wordApplication = new Microsoft.Office.Interop.Word.Application(); try
{ 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.ReadWrite); }
catch (Exception ex)
{
string error = ex.Message;
wordApplication.Quit(WdSaveOptions.wdDoNotSaveChanges);
} wordApplication.Quit(WdSaveOptions.wdDoNotSaveChanges); return result;
} #endregion /// <summary>
/// 导航树跳转事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tvTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
int x = ;
TreeViewItem selectTV = this.tvTree.SelectedItem as TreeViewItem;
if (null == selectTV)
return; if (null == selectTV.Tag)
return; string page = selectTV.Tag.ToString();
for (int i = ; i < array1.Length; i++)
{
if (array1[i].Equals(page))
{
x = i;
}
}
string[] strPages = pages[x].Split('_');
dvShow.GoToPage(Int32.Parse(strPages[]));
} private void cbNav_Click(object sender, RoutedEventArgs e)
{
this.cdTree.Width = this.cbNav.IsChecked == true ? new GridLength() : new GridLength();
} private void btnPrev_Click(object sender, RoutedEventArgs e)
{
this.dvShow.PreviousPage();
} private void btnNext_Click(object sender, RoutedEventArgs e)
{
this.dvShow.NextPage();
} }
}

转自:http://www.cnblogs.com/_ymw/p/3324892.html

WPF: 读取XPS文件或将word、txt文件转化为XPS文件的更多相关文章

  1. 【文件】使用word的xml模板生成.doc文件

    一.编辑模板 替换地方以变量标记如“案件编号”可写成{caseNo} template.xml 二.准备数据 以HashMap封装数据,原理是替换模板中的变量 三.替换操作 选择输出位置:writeP ...

  2. 怎样将word文件转化为Latex文件:word-to-latex-2.56具体解释

    首先推荐大家读一读这篇博文:http://blog.csdn.net/ibingow/article/details/8613556 --------------------------------- ...

  3. WFP: 读取XPS文件或将word、txt文件转化为XPS文件

    读取XPS格式文件或将doc,txt文件转化为XPS文件,效果图如下: 1.XAML页面代码: <Window x:Class="WpfWord.MainWindow"    ...

  4. WPF读取和显示word

    引言 在项目开发中,word的读取和显示会经常出现在客户的需求中.特别是一些有关法律规章制度.通知.红头文件等,都是用word发布的. 在WPF中,对显示WORD没有特定的控件,这对开发显示WORD的 ...

  5. c#上传文件并将word pdf转化成txt存储并将内容写入数据库

    c#上传文件并将word pdf转化成txt存储并将内容写入数据库 using System; using System.Data; using System.Configuration; using ...

  6. Python:读取 .doc、.docx 两种 Word 文件简述及“Word 未能引发事件”错误

    概述 Python 中可以读取 word 文件的库有 python-docx 和 pywin32. 下表比较了各自的优缺点.   优点 缺点 python-docx 跨平台 只能处理 .docx 格式 ...

  7. python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件

    python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 python操作txt文件中 ...

  8. c# 读取 excel文件内容,写入txt文档

    1 winform 读取excel文档 1)点击button按钮,弹出上传excel窗口 private void button_headcompany_Click(object sender, Ev ...

  9. 逐行创建、读取并写入txt(matlab) && 生成文件夹里文件名的.bat文件

    fidin=fopen('C:\Users\byte\Desktop\新建文件夹 (4)\tr4.txt','r'); fidout=fopen('C:\Users\byte\Desktop\新建文件 ...

随机推荐

  1. Intellisense for Xrm.Page in CRM 2011

    Intellisense for Xrm.Page in CRM 2011 In CRM 2011 javascripts for crm forms can be stored externally ...

  2. python wechat_sdk间接性的出现错误OfficialAPIError: 40001,说access_token已过期或者不是最新的。

    原因是部署django时使用了多进程,每个进程都会去请求access_token,只有最新的那个有效

  3. 启用 CORS 来解决这个问题(ajax跨域请求)

    <input type="file" name="btn_Upload" value="上传" id="btn_Upload ...

  4. 一道 JavaScript 面试题

    有一道 JavaScript 面试题. f = function () { return true; }; g = function () { return false; }; (function() ...

  5. 医失眠灵验方--五味子50g 茯神50g 合欢花15g 法半夏15g

    方药:五味子50g  茯神50g  合欢花15g  法半夏15g  水煎服    主治:失眠健忘    此方为已故名老中医李培生之验方,用于临床治疗失眠健忘症,疗效显著,其主药为五味子,滋阴和阳,敛阳 ...

  6. 操作系统是怎么工作的——mykernel环境的搭建

    可以参见:https://github.com/mengning/mykernel 首先感谢:http://www.euryugasaki.com/archives/1014 1.搭建实验环境(实验环 ...

  7. TCP/IP详解学习笔记(3)-- IP:网际协议

    1.概述      IP是TCP/IP协议族中最为核心的协议.所有的TCP,UDP,ICMP,IGMP数据都以IP数据报格式传输.      IP提供不可靠,无连接的数据报传送服务. 不可靠:它不能保 ...

  8. 解决问题 “You don't have permission to access /index.html on this server.”

    前几天装一个linux 企业版5.0安装了apache,打开测试页面的时候出现如下错误: Forbidden You don't have permission to access /index.ht ...

  9. vc不用IDE编译方法

    一个EXE是如何形成的 比如一个源程序有以下两个文件. 1.c 1.rc 首先cl.exe 会把源代码编译为1.obj rc.exe会把1.rc编译为1.res link.exe会把1.obj 1.r ...

  10. codevs 1049 棋盘染色

    题目描述 Description 有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少.读入一 ...