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

相关文章

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

Python自动化提取多个Word文档的文本

《Python自动化提取多个Word文档的文本》在日常工作和学习中,我们经常需要处理大量的Word文档,本文将深入探讨如何利用Python批量提取Word文档中的文本内容,帮助你解放生产力,感兴趣的小... 目录为什么需要批量提取Word文档文本批量提取Word文本的核心技术与工具安装 Spire.Doc

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word

在C#中读取文件的六种主流方法详解

《在C#中读取文件的六种主流方法详解》在C#中读取文件有多种方法,不同方式适用于不同场景(小型文件、大型文件、文本文件或二进制文件),本文给大家介绍了6种主流方法以及其适用场景,需要的朋友可以参考下... 目录方法1:File.ReadAllText(读取整个文本文件)方法2:File.ReadAllLin