如何将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

方法一

csharp 复制代码
        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 "";
            }
        }

方法二

csharp 复制代码
 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

csharp 复制代码
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

csharp 复制代码
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中提取文本的简单示例:

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

相关推荐
lixww.cn2 小时前
ASP.NET Core MVC
c#·mvc·.netcore
我是苏苏3 小时前
C#高级:常用的扩展方法大全
java·windows·c#
ChoSeitaku4 小时前
Unity|小游戏复刻|见缝插针2(C#)
unity·c#·游戏引擎
lzhdim4 小时前
3、C#基于.net framework的应用开发实战编程 - 实现(三、二) - 编程手把手系列文章...
开发语言·c#·.net
SunkingYang5 小时前
C#编译报错: error CS1069: 未能在命名空间“System.Windows.Markup”中找到类型名“IComponentConnector”
c#·.net·错误·程序集·升级framework·error cs1069·error cs0538
秋月的私语5 小时前
c#启动程序时使用异步读取输出避免假死
java·前端·c#
H CHY7 小时前
二维数组一
开发语言·数据结构·c++·算法·青少年编程·c#·动态规划
lshzdq7 小时前
【设计模式】访问者模式(Visitor Pattern): visitor.visit(), accept()
设计模式·c#·访问者模式
军训猫猫头10 小时前
60.await与sleep的原理分析 C#例子 WPF例子
开发语言·ui·c#·wpf
朴拙数科14 小时前
PDF2WORD万能方法,如何控制Adobe dc pro,自动实现PDF转word
adobe·pdf·word