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