C# 实战:高效将 PDF 转换为 Excel 的完整指南

引言

在许多业务场景中,我们需要从 PDF 文件中提取表格数据并转换为 Excel 格式,以便进行进一步分析或数据处理。C# 作为 .NET 生态的核心语言,提供了多种强大的库来实现 PDF 到 Excel 的转换。本文将深入探讨几种主流解决方案,并提供完整的代码示例。

一、主流 PDF 处理库对比

库名称 优点 缺点
iTextSharp (或 iText 7) 功能强大,社区活跃,支持文本和表格提取 AGPL 许可证可能影响商业使用
PDFsharp 开源,专注于 PDF 创建与操作 表格提取能力较弱
IronPDF 易于使用,支持 HTML 转 PDF 商业许可,价格较高
Spire.PDF 完整的 PDF 操作套件,包括转换功能 商业库,免费版有页数限制

二、使用 iTextSharp 提取 PDF 表格

iTextSharp 是 .NET 平台上广泛使用的 PDF 库,以下是一个提取 PDF 表格并写入 Excel 的基本示例:


// 安装 NuGet 包:Install-Package iTextSharp
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using System.Collections.Generic;
using System.IO;
using OfficeOpenXml; // EPPlus 库用于 Excel 操作

public List<List<string>> ExtractTableFromPdf(string pdfPath)
{
    var result = new List<List<string>>();
    PdfReader reader = new PdfReader(pdfPath);
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);

    for (int i = 1; i <= reader.NumberOfPages; i++)
    {
        var tableListener = new TableExtractionStrategy();
        parser.ProcessContent(i, tableListener);
        result.AddRange(tableListener.ExtractedTables);
    }

    reader.Close();
    return result;
}

// 自定义策略实现表格提取
public class TableExtractionStrategy : IRenderListener
{
    public List<List<string>> ExtractedTables { get; } = new List<List<string>>();
    private List<string> _currentRow = new List<string>();

    public void RenderText(TextRenderInfo renderInfo)
    {
        // 这里实现文本块的合并与表格行识别
        string text = renderInfo.GetText().Trim();
        if (!string.IsNullOrEmpty(text))
        {
            _currentRow.Add(text);
        }
    }

    public void BeginTextBlock() { }
    public void EndTextBlock()
    {
        if (_currentRow.Count > 0)
        {
            ExtractedTables.Add(new List<string>(_currentRow));
            _currentRow.Clear();
        }
    }
    public void RenderImage(ImageRenderInfo renderInfo) { }
}

三、将提取的数据写入 Excel

使用 EPPlus 库可以轻松将提取的数据写入 Excel 文件:


public void WriteToExcel(List<List<string>> data, string excelPath)
{
    using (var package = new ExcelPackage())
    {
        var sheet = package.Workbook.Worksheets.Add("PDF数据");
        int row = 1;
        foreach (var rowData in data)
        {
            int col = 1;
            foreach (var cellValue in rowData)
            {
                sheet.Cells[row, col].Value = cellValue;
                col++;
            }
            row++;
        }
        package.SaveAs(new FileInfo(excelPath));
    }
}

四、完整转换流程与异常处理

一个健壮的转换程序应该包括以下步骤:

  1. 输入验证:检查文件是否存在、格式是否正确。
  2. 页面遍历:处理多页 PDF 的情况。
  3. 表格识别:根据 PDF 结构(如使用流或图形对象)识别表格边界。
  4. 数据清洗:去除特殊字符、合并断行文本。
  5. 错误处理:使用 try-catch 捕获解析异常。

五、高级技巧与优化

  • 使用 OCR 处理扫描版 PDF:对于图像型 PDF,需集成 OCR 引擎(如 Tesseract)。
  • 并行处理多文件:使用 Parallel.ForEach 提高批量转换效率。
  • 自定义表格模板:针对不同 PDF 结构配置提取规则。

结语

C# 提供了丰富的工具链来实现 PDF 到 Excel 的转换。开发者应根据项目需求(如许可证、性能、准确性)选择合适的库,并注意处理复杂表格布局时的边界情况。通过合理的设计和优化,可以构建出高效可靠的 PDF 数据提取系统。