如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt
文章目录
- xps转txt
- 方法一
- 方法二
- pdf转txt
- 整页转txt
- 提取pdf表格,并转为txt
- 总结
- 另外参考
- XPS文件转换为TXT文件
- XPS文件转换为PDF文件
- PDF文件转换为TXT文件
- 提取PDF表格并转为TXT
- 示例代码(部分)
本文测试代码已上传,路径如下:
https://download.csdn.net/download/y601500359/90312050
xps部分内容如图

xps转txt
使用XpsDocument 类。
命名空间:System.Windows.Xps.Packaging
程序集:ReachFramework.dll
方法一
public static string XpsToText(string strXpsPath){try{if (!File.Exists(strXpsPath))return "";string strContent = "";System.Windows.Xps.Packaging.XpsDocument _xpsDocument = new System.Windows.Xps.Packaging.XpsDocument(strXpsPath, System.IO.FileAccess.Read);IXpsFixedDocumentSequenceReader fixedDocSeqReader = _xpsDocument.FixedDocumentSequenceReader;IXpsFixedDocumentReader _document = fixedDocSeqReader.FixedDocuments[0];StringBuilder _currentText = new StringBuilder();for (int i = 0; i < _document.FixedPages.Count; i++){IXpsFixedPageReader _page = _document.FixedPages[i];System.Xml.XmlReader _pageContentReader = _page.XmlReader;if (_pageContentReader != null){while (_pageContentReader.Read()){if (_pageContentReader.Name == "Glyphs"){if (_pageContentReader.HasAttributes){string strAtti;for (int ii = 0; ii < _pageContentReader.AttributeCount; ii++){strAtti = _pageContentReader[ii];}if (_pageContentReader.GetAttribute("UnicodeString") != null){_currentText.Append(_pageContentReader.GetAttribute("UnicodeString"));}}}}}}strContent = _currentText.ToString();_xpsDocument.Close();return strContent;}catch{return "";}}
方法二
public static string ReadXps(string strXpsPath){StringBuilder sb = new StringBuilder();//读取文档XpsDocument xpsDocument = new XpsDocument(strXpsPath, FileAccess.Read);//var reader = xpsDocument.FixedDocumentSequenceReader;//循环文档foreach (var document in reader.FixedDocuments){//循环页foreach (var page in document.FixedPages){//读取XML内容XmlReader xrdr = page.XmlReader;while (xrdr.Read()){switch (xrdr.NodeType){case XmlNodeType.Element:if (xrdr.Name == "Glyphs"){sb.Append(xrdr["UnicodeString"]);sb.Append("\n");}break;case XmlNodeType.Whitespace://sb.Append(",");break;default://sb.Append("-");break;}}}}return sb.ToString();}
pdf转txt
整页转txt
static void ConvertPdf2Txt(string filename)
{// 创建PdfDocument对象并加载PDF文件PdfDocument doc = new PdfDocument();doc.LoadFromFile(filename);// 创建 StringBuilder 对象StringBuilder builder = new StringBuilder();// 初始化 PdfTableExtractor 类的实例PdfTableExtractor extractor = new PdfTableExtractor(doc);//提取PDF所有页面的文本string strtxt;foreach (PdfPageBase page in doc.Pages){builder.Append(page.ExtractText());//PdfTextExtractor txtExtractor = new PdfTextExtractor(page);strtxt = page.ExtractText();}//将提取到的文本写为.txt格式并保存到本地路径string strPath = filename.Substring(0, filename.LastIndexOf(".") + 1) + "txt";File.WriteAllText(strPath, builder.ToString());doc.Close();
}
提取pdf表格,并转为txt
static void ConvertPdf2Txt(string filename)
{// 创建PdfDocument对象并加载PDF文件PdfDocument doc = new PdfDocument();doc.LoadFromFile(filename);// 创建 StringBuilder 对象StringBuilder builder = new StringBuilder();// 初始化 PdfTableExtractor 类的实例PdfTableExtractor extractor = new PdfTableExtractor(doc);// 声明 PdfTable 数组PdfTable[] tableList = null;int tableCount = 1;//将提取到的文本写为.txt格式并保存到本地路径string strPath = filename.Substring(0, filename.LastIndexOf(".") + 1) + "txt";// 循环遍历页面for (int pageIndex = 0; pageIndex < doc.Pages.Count; pageIndex++){// 从特定页面提取表格tableList = extractor.ExtractTable(pageIndex);// 判断表格列表是否为空if (tableList != null && tableList.Length > 0){// 遍历列表中的表格foreach (PdfTable table in tableList){// 获取特定表格的行数和列数int row = table.GetRowCount();int column = table.GetColumnCount();// 遍历行和列for (int i = 0; i < row; i++){for (int j = 0; j < column; j++){// 获取特定单元格的文本string text = table.GetText(i, j);if(text.IndexOf('\n') > 0){text = Regex.Replace(text, @"[\n]", "");}// 将文本添加到 StringBuilder 中并添加制表符builder.Append(text + "\t");}builder.Append("\r\n");}// 写入 .txt 文件File.WriteAllText(strPath, builder.ToString());tableCount += 1;}}}doc.Close();
}
总结
从上述操作可以看出,由于xps文件的特殊性,如果文本内容出现换行,是无法检测的,而且如果直接通过xps文件读取为txt文件,格式会比较乱,如果想要格式尽量不乱,那么可以先转换为pdf文件,然后再通过pdf文件转换为txt。
其中如果pdf提取表格,可以进一步优化表格对齐内容,其中关键代码位置如下图,所以如果想要将xps文件转换为txt,甚至是csv或者excel,可以合理利用一下上述思路。
另外参考
在C#中,处理不同文件格式(如XPS、PDF和TXT)的转换和表格提取是一个复杂且通常需要依赖第三方库的任务。以下是如何在C#中实现这些操作的概述:
XPS文件转换为TXT文件
-
将XPS转换为PDF(如果需要中间格式):
- 可以使用
System.Printing.PrintQueue
和XpsDocumentWriter
类将XPS文件打印到PDF打印机(如果安装了支持PDF的打印机驱动程序)。 - 或者,使用第三方库如
Xps2Pdf
、DinoPDF
等来进行转换。
- 可以使用
-
将PDF转换为TXT:
- 使用PDF解析库(如
iTextSharp
、PdfSharp
、Aspose.PDF
、MuPDF
的.NET绑定等)来读取PDF内容。 - 解析PDF文本内容,可能需要处理PDF中的文本布局、字体和编码。
- 将解析后的文本写入TXT文件。
- 使用PDF解析库(如
由于直接从XPS到TXT的转换较为罕见,且中间可能需要处理复杂的格式和布局,因此通常建议先将XPS转换为PDF,再从PDF中提取文本。
XPS文件转换为PDF文件
如上所述,可以使用System.Printing.PrintQueue
和XpsDocumentWriter
类将XPS文件打印到PDF打印机,或者使用第三方库进行转换。
PDF文件转换为TXT文件
- 使用PDF解析库读取PDF内容。
- 遍历PDF页面,提取文本。
- 将文本写入TXT文件。
提取PDF表格并转为TXT
- 使用PDF解析库读取PDF内容。
- 分析PDF中的文本和布局,识别表格结构(这可能需要自定义逻辑,因为PDF不是为表格数据设计的格式)。
- 提取表格数据。
- 将表格数据格式化为TXT格式(例如,使用逗号、制表符或其他分隔符分隔单元格)。
示例代码(部分)
以下是一个使用iTextSharp
库从PDF中提取文本的简单示例:
using System;
using System.IO;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;class Program
{static void Main(){string pdfPath = "path/to/your/pdf/file.pdf";string txtPath = "path/to/your/output/file.txt";using (FileStream stream = new FileStream(pdfPath, FileMode.Open, FileAccess.Read)){PdfReader reader = new PdfReader(stream);using (StreamWriter writer = new StreamWriter(txtPath)){for (int i = 1; i <= reader.NumberOfPages; i++){ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();string text = PdfTextExtractor.GetTextFromPage(reader, i, strategy);writer.WriteLine(text);}}}Console.WriteLine("PDF text extracted to TXT file.");}
}
请注意,这个示例代码仅用于从PDF中提取纯文本,并不处理表格提取的复杂逻辑。对于表格提取,您可能需要进一步分析PDF的布局和文本内容,这通常是一个更加复杂和耗时的过程。
此外,由于处理PDF和XPS文件通常涉及复杂的格式和布局,因此强烈建议使用成熟的第三方库,并仔细阅读其文档和示例代码,以了解如何处理这些文件格式。
相关文章:

如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt
文章目录 xps转txt方法一方法二 pdf转txt整页转txt提取pdf表格,并转为txt 总结另外参考XPS文件转换为TXT文件XPS文件转换为PDF文件PDF文件转换为TXT文件提取PDF表格并转为TXT示例代码(部分) 本文测试代码已上传,路径如下ÿ…...

【Samba】Ubuntu20.04 Windows 共享文件夹
【Samba】Ubuntu20.04 Windows 共享文件夹 前言整体思路检查 Ubuntu 端 和 Windows 网络通信是否正常创建共享文件夹安装并配置 Samba 服务器安装 Samba 服务器创建 Samba 用户编辑 Samba 配置文件重启 Samba 服务器 在 Windows 端 访问 Ubuntu 的共享文件夹 前言 本文基于 Ub…...
gradle和maven的区别以及怎么选择使用它们
目录 区别 1. 配置方式 2. 依赖管理 3. 构建性能 4. 灵活性和扩展性 5. 多项目构建 如何选择使用 选择 Maven 的场景 选择 Gradle 的场景 区别 1. 配置方式 Maven: 使用基于 XML 的 pom.xml 文件进行配置。所有的项目信息、依赖管理、构建插件等都在这个文…...
360大数据面试题及参考答案
数据清理有哪些方法? 数据清理是指发现并纠正数据文件中可识别的错误,包括检查数据一致性,处理无效值和缺失值等。常见的数据清理方法有以下几种: 去重处理:数据中可能存在重复的记录,这不仅会占用存储空间,还可能影响分析结果。通过对比每条记录的关键属性,若所有关键…...
Myeclipse最新版本 C1 2019.4.0
Myeclipse C1 2019.4.0下载地址:链接: https://pan.baidu.com/s/1MbOMLewvAdemoQ4FNfL9pQ 提取码: tmf6 1.1、什么是集成开发环境? ★集成开发环境讲究-站式开发,使用这个工具即可。有提示功能,有自动纠错功能。 ★集成开发环境可以让软件开…...
MySQL 9.2.0 的功能
MySQL 9.2.0 的功能 MySQL 9.2.0 的功能新增、弃用和删除内容如下: 新增功能 权限新增12:引入了CREATE_SPATIAL_REFERENCE_SYSTEM权限,拥有该权限的用户可执行CREATE SPATIAL REFERENCE SYSTEM、CREATE OR REPLACE SPATIAL REFERENCE SYSTEM…...

接口 V2 完善:分布式环境下的 WebSocket 实现与 Token 校验
🎯 本文档详细介绍了如何使用WebSocket协议优化客户端与服务端之间的通信,特别是在处理异步订单创建通知的场景中。通过引入WebSocket代替传统的HTTP请求-响应模式,实现了服务器主动向客户端推送数据的功能,极大地提高了实时性和效…...
微前端架构在前端开发中的实践与挑战
随着单页面应用(SPA)和前端框架如 React、Vue、Angular 的快速发展,现代前端应用的复杂度日益提升。尤其是当应用规模逐渐增大时,单一的代码库往往难以应对不同团队的协作和版本管理问题。为了应对这一挑战,微前端架构…...

【自学嵌入式(6)天气时钟:软硬件准备、串口模块开发】
天气时钟:软硬件准备、串口模块开发 软硬件准备接线及模块划分ESP8266开发板引脚图软件准备 串口模块编写串口介绍Serial库介绍 近期跟着网上一些教学视频,编写了一个天气时钟,本篇及往后数篇都将围绕天气时钟的制作过程展开。本文先解决硬件…...

macbook安装go语言
通过brew来安装go语言 使用brew命令时,一般都会通过brew search看看有哪些版本 brew search go执行后,返回了一堆内容,最下方展示 If you meant "go" specifically: It was migrated from homebrew/cask to homebrew/core. Cas…...
代码随想录算法训练营第三十八天-动态规划-完全背包-322. 零钱兑换
太难了 但听了前面再听这道题感觉递推公式也不是不难理解 动规五部曲 dp[j]代表装满容量为j(也就是目标值)的背包最少物品数量递推公式:dp[j] std::min(dp[j], dp[j - coins[i]] 1)当使用coins[i]这张纸币时,要向前找到容量为…...

小阿卡纳牌
小阿卡纳牌 风:热湿 火:热干 水:冷湿 土:冷干 火风:温度相同,但是湿度不同,二人可能会在短期内十分热情,但是等待热情消退之后,会趋于平淡。 湿度相同、温度不同&#x…...
DDD 和 TDD
领域驱动设计(DDD) DDD 是一种软件开发方法,强调通过与领域专家的密切合作来构建一个反映业务逻辑的模型。其核心思想是将业务逻辑和技术实现紧密结合,以便更好地解决复杂的业务问题。 DDD 的关键概念: 1. 领域模型 …...
Java学习教程,从入门到精通,JDBC插入记录语法及案例(104)
JDBC插入记录语法及案例 一、JDBC插入记录语法 在JDBC中,插入记录主要通过执行SQL的INSERT语句来实现。其基本语法如下: INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n);表名:需要插入记录的表的名称。列1, 列2, …,…...

Linux文件基本操作
Linux 的设计哲学 在 Linux 中,一切皆文件! 什么是文件? 文件是具有永久存储性,按特定字节顺序组成的命名数据集 文件可分为:文本文件,二进制文件 文本文件:每个文件存放一个 ASCII 码 存储…...
React 路由导航与传参详解
随着单页面应用(SPA)已经成为主流。React 作为最流行的前端框架之一,提供了强大的路由管理工具 react-router-dom,帮助开发者轻松实现页面导航和传参。本文将详细介绍如何使用 react-router-dom 构建路由导航、传参以及嵌套路由的…...
C#面试常考随笔6:ArrayList和 List的主要区别?
在 C# 中,ArrayList和List<T>(泛型列表)都可用于存储一组对象。推荐优先使用List<T>,因为它具有更好的类型安全性、性能和语法简洁性,并且提供了更丰富的功能。只有在需要与旧代码兼容或存储不同类型对象的…...

C#分页思路:双列表数据组合返回设计思路
一、应用场景 需要分页查询(并非全表查载入物理内存再筛选),返回列表1和列表2叠加的数据时 二、实现方式 列表1必查,列表2根据列表1的查询结果决定列表2的分页查询参数 三、示意图及其实现代码 1.示意图 黄色代表list1的数据&a…...

中科大:LLM检索偏好优化应对RAG知识冲突
📖标题:RPO: Retrieval Preference Optimization for Robust Retrieval-Augmented Generation 🌐来源:arXiv, 2501.13726 🌟摘要 🔸虽然检索增强生成(RAG)在利用外部知识方面表现出…...

知识库管理系统提升企业知识价值与工作效率的实践路径分析
内容概要 知识库管理系统在企业发展中的重要性日益凸显,尤其是在信息爆炸的时代。现代企业需要有效地管理和利用自身知识资产,以提升整体效率和竞争力。本文旨在探讨知识库管理系统的应用实践,围绕其在信息整理、知识共享及决策支持等方面的…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...