WPF: 读取XPS文件或将word、txt文件转化为XPS文件

2023-10-18 08:59
文章标签 读取 txt 转化 word wpf xps

本文主要是介绍WPF: 读取XPS文件或将word、txt文件转化为XPS文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

读取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="500" Width="900"><Grid><Grid.RowDefinitions><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="0" Name="cdTree"/><ColumnDefinition Width="auto"/><ColumnDefinition Width="3*"/></Grid.ColumnDefinitions><GroupBox Header="导航目录"><TreeView Name="tvTree" SelectedItemChanged="tvTree_SelectedItemChanged"/></GroupBox><GridSplitter Width="3" ResizeBehavior="PreviousAndNext" Grid.Column="1" Background="LightGray"/><Grid Grid.Column="3"><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><DocumentViewer Name="dvShow" Grid.Row="1"/><StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Right"><CheckBox Content="显示导航" Height="16" Margin="5" Name="cbNav" Width="75" Click="cbNav_Click" /><Label Content="页面"/><Label Name="lblCurPage" Margin="0"/><Label Name="lblPage"/><Button Content="上一页" Height="23" Name="btnPrev" Width="75" Click="btnPrev_Click" /><Button Content="下一页" Height="23" Name="btnNext" Width="75" 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;       #endregionpublic 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[0];XpsStructure xpsStructure = docReader.DocumentStructure;Stream stream = xpsStructure.GetStream();XmlDocument doc = new XmlDocument();doc.Load(stream);//获取节点列表XmlNodeList nodeList = doc.ChildNodes.Item(0).FirstChild.FirstChild.ChildNodes;if (nodeList.Count <= 0)//判断是否存在目录节点
            {//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 = 0; 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 = 0; i < array.Length - 1; i++){//对array进行转换组装成可读的树形结构,通过ASCII值进行增加、转换array1[0] = "A";if (array[i + 1] - array[i] == 1){array1[i + 1] = array1[i] + 'A';}if (array[i + 1] == array[i]){char s = Convert.ToChar(array1[i].Substring((array1[i].Length - 1), 1));array1[i + 1] = array1[i].Substring(0, array1[i].Length - 1) + (char)(s + 1);}if (array[i + 1] < array[i]){int m = array[i + 1];char s = Convert.ToChar(array1[i].Substring(0, m).Substring(m - 1, 1));array1[i + 1] = array1[i].Substring(0, m - 1) + (char)(s + 1);}}//添加一个节点作为根节点TreeViewItem parent = new TreeViewItem();TreeViewItem parent1 = null;parent.Header = "目录导航";Boolean flag = false;for (int i = 0; i < array.Length; i++){if (array[i] == 1){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 = 0; i < str1.Length; i++){if (str1[i].IndexOf(parentID) == 0 && str1[i].Length == (parentID.Length + 1) && str1[i].ElementAt(0).Equals(parentID.ElementAt(0))){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("\\")+1);if (strFilepath.Length > 0){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 = 0;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, 0, 0, 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 = 0;TreeViewItem selectTV = this.tvTree.SelectedItem as TreeViewItem;if (null == selectTV)return;if (null == selectTV.Tag)return;string page = selectTV.Tag.ToString();for (int i = 0; i < array1.Length; i++){if (array1[i].Equals(page)){x = i;}}string[] strPages = pages[x].Split('_');dvShow.GoToPage(Int32.Parse(strPages[1]));}private void cbNav_Click(object sender, RoutedEventArgs e){this.cdTree.Width = this.cbNav.IsChecked == true ? new GridLength(300) : new GridLength(0);}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

 

转载于:https://www.cnblogs.com/zxbzl/p/3923836.html

这篇关于WPF: 读取XPS文件或将word、txt文件转化为XPS文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/231568

相关文章

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

如何将二进制文件流转化为MockMultipartFile文件

《如何将二进制文件流转化为MockMultipartFile文件》文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创... 目录一、名词解释及业务解释1.具体业务流程2.转换对象解释1. MockMultipartFile2

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要