文章目錄
- 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文件通常涉及復雜的格式和布局,因此強烈建議使用成熟的第三方庫,并仔細閱讀其文檔和示例代碼,以了解如何處理這些文件格式。