如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt

news/2025/1/30 11:50:27/

文章目录

  • xpstxt
    • 方法一
    • 方法二
  • pdftxt
  • 总结
  • 另外参考
      • XPS文件转换为TXT文件
      • XPS文件转换为PDF文件
      • PDF文件转换为TXT文件
      • 提取PDF表格并转为TXT
      • 示例代码(部分)

本文测试代码已上传,路径如下:
https://download.csdn.net/download/y601500359/90312050
xps部分内容如图
在这里插入图片描述

xpstxt_6">xpstxt

使用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();}

在这里插入图片描述

pdftxt_108">pdftxt

txt_110">整页转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();
}

在这里插入图片描述

pdftxt_143">提取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文件

  1. 将XPS转换为PDF(如果需要中间格式):

    • 可以使用System.Printing.PrintQueueXpsDocumentWriter类将XPS文件打印到PDF打印机(如果安装了支持PDF的打印机驱动程序)。
    • 或者,使用第三方库如Xps2PdfDinoPDF等来进行转换
  2. 将PDF转换为TXT

    • 使用PDF解析库(如iTextSharpPdfSharpAspose.PDFMuPDF的.NET绑定等)来读取PDF内容。
    • 解析PDF文本内容,可能需要处理PDF中的文本布局、字体和编码。
    • 解析后的文本写入TXT文件。

由于直接从XPS到TXT的转换较为罕见,且中间可能需要处理复杂的格式和布局,因此通常建议先将XPS转换为PDF,再从PDF中提取文本。

XPS文件转换为PDF文件

如上所述,可以使用System.Printing.PrintQueueXpsDocumentWriter类将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文件通常涉及复杂的格式和布局,因此强烈建议使用成熟的第三方库,并仔细阅读其文档和示例代码,以了解如何处理这些文件格式。


http://www.ppmy.cn/news/1567880.html

相关文章

C/C++中的#define和const的特点与区别

在C和C中&#xff0c;#define和const都可以用来定义常量&#xff0c;但它们在使用方式和语义上有很大的不同。下面将详细对比它们的特点和使用场景。 #define 定义方式&#xff1a; #define是预处理器指令&#xff0c;用于定义宏。它在编译前被处理&#xff0c;将代码中的所有出…

go 循环处理无限极数据

数据表结构&#xff1a; CREATE TABLE permission (id int(11) NOT NULL AUTO_INCREMENT COMMENT 权限ID,permission_name varchar(255) DEFAULT NULL COMMENT 权限名称,permission_url varchar(255) DEFAULT NULL COMMENT 权限路由,status tinyint(1) DEFAULT NULL COMMENT 权…

Layui 列表根据不同数据展示不同内容,并展示对应颜色

Layui 列表根据不同数据展示不同内容&#xff0c;并展示对应颜色 let cols [[{title: 模板编码, field: templateCode, align: center},{title: 消息内容, field: messageContent, align: center},{title: 消息状态, field: messageStatus, align: center, templet: function …

【starrocks学习】之catalog

目录 一、介绍 二、Catalog的分类 三、使用方法 四、简单示例 一、介绍 ‌StarRocks的Catalog功能‌是一种数据目录管理工具&#xff0c;用于同时管理和查询内部和外部数据。StarRocks从2.3版本开始支持Catalog功能&#xff0c;允许用户在一个系统中方便地访问和查询存储在…

【云安全】云原生-K8S-搭建/安装/部署

一、准备3台虚拟机 务必保证3台是同样的操作系统&#xff01; 1、我这里原有1台centos7&#xff0c;为了节省资源和效率&#xff0c;打算通过“创建链接克隆”2台出来 2、克隆之前&#xff0c;先看一下是否存在k8s相关组件&#xff0c;或者docker相关组件 3、卸载原有的docker …

PostgreSQL 约束

PostgreSQL 约束 在数据库设计中,约束(Constraint)是一种规则,用于确保数据库中的数据满足特定的条件。PostgreSQL 作为一款功能强大的开源关系型数据库管理系统,提供了多种约束类型,以帮助开发者维护数据的一致性和准确性。本文将详细介绍 PostgreSQL 中常见的约束类型…

OpenAI掀桌子!免费版ChatGPT,提供o3-mini模型!

逆天免费用 今天凌晨&#xff0c;OpenAI联合创始人兼首席执行官Sam Altman宣布了一个大消息——免费版ChatGPT&#xff0c;将提供o3-mini模型&#xff01; 网页们纷纷不淡定了 看来OpenAI&#xff0c;这o3-mini还没正式上线呢&#xff0c;就免费开放使用了。 不过还是要感谢…

ML基础-Jupyter notebook中的魔法命令

在 Jupyter Notebook 或 IPython 环境中&#xff0c;“魔法命令”&#xff08;Magic Commands&#xff09;是一些以百分号&#xff08;%&#xff09;或惊叹号&#xff08;!)开头的特殊命令&#xff0c;用于执行一些与代码运行环境相关的操作&#xff0c;而不仅仅是执行普通的 P…