You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET控制台应用(C#)读取PDF跨页表格解决方案咨询

.NET 8 读取跨页拆分的PDF表格解决方案

免费方案:PdfPig

PdfPig是开源的.NET PDF处理库,能精准识别表格单元格结构,避免iTextSharp左到右拼接文本的问题,还可自定义逻辑处理跨页拆分的行。

  • 安装依赖:通过NuGet安装 PdfPig,命令:
    Install-Package PdfPig
    
  • 核心实现代码:
    using UglyToad.PdfPig;
    using UglyToad.PdfPig.Content;
    using UglyToad.PdfPig.Tables;
    using System.Collections.Generic;
    using System.Linq;
    
    using (var document = PdfDocument.Open("target.pdf"))
    {
        // 读取第4到7页(页码从1开始,Skip(3)跳过前3页)
        var targetPages = document.GetPages().Skip(3).Take(4);
        var tableDetector = new TableDetector();
        var allTables = new List<Table>();
    
        // 提取每页的表格
        foreach (var page in targetPages)
        {
            allTables.AddRange(tableDetector.Detect(page));
        }
    
        // 合并跨页拆分的行
        var mergedRows = new List<List<string>>();
        List<string> pendingRow = null;
    
        foreach (var table in allTables)
        {
            int totalColumns = table.ColumnCount;
            foreach (var row in table.Rows)
            {
                var rowCells = row.Cells.Select(c => c.Text.Trim()).ToList();
                
                // 判断当前行是否为上一页截断的行续接
                if (pendingRow != null && rowCells.Count < totalColumns)
                {
                    // 合并单元格内容
                    for (int i = 0; i < rowCells.Count; i++)
                    {
                        pendingRow[i] += $" {rowCells[i]}";
                    }
                    mergedRows.Add(pendingRow);
                    pendingRow = null;
                }
                // 当前行是截断行,标记为待合并
                else if (rowCells.Count < totalColumns)
                {
                    pendingRow = rowCells;
                }
                // 完整行直接加入结果
                else
                {
                    mergedRows.Add(rowCells);
                }
            }
        }
    
        // 处理最后一条待合并的行
        if (pendingRow != null)
        {
            mergedRows.Add(pendingRow);
        }
    
        // 输出所有行数据
        foreach (var row in mergedRows)
        {
            System.Console.WriteLine(string.Join("\t", row));
        }
    }
    
  • 优势:完全免费开源,单元格识别准确,支持自定义跨页行合并逻辑,兼容.NET 8及旧版本。

付费方案:Syncfusion Essential PDF

Syncfusion是成熟的商业PDF库,内置表格自动识别与跨页合并功能,无需手动编写复杂的行合并逻辑,识别精度更高。

  • 安装依赖:通过NuGet安装 Syncfusion.Pdf.Net.Core,命令:
    Install-Package Syncfusion.Pdf.Net.Core
    
  • 核心实现代码:
    using Syncfusion.Pdf.Parsing;
    using Syncfusion.Pdf.Tables;
    
    // 加载PDF文档
    using var loadedDocument = new PdfLoadedDocument("target.pdf");
    var tableList = new List<PdfTable>();
    
    // 提取第4到7页的表格(索引从0开始,对应页码4-7)
    for (int pageIndex = 3; pageIndex < 7; pageIndex++)
    {
        var loadedPage = loadedDocument.Pages[pageIndex] as PdfLoadedPage;
        var pageTables = PdfTableExtractor.ExtractTable(loadedPage);
        tableList.AddRange(pageTables);
    }
    
    // 自动合并跨页表格(含拆分的行)
    var mergedTable = PdfTable.MergeTables(tableList.ToArray());
    
    // 遍历所有单元格数据
    for (int row = 0; row < mergedTable.Rows.Count; row++)
    {
        for (int col = 0; col < mergedTable.Columns.Count; col++)
        {
            string cellContent = mergedTable.Rows[row].Cells[col].Text;
            System.Console.Write($"{cellContent}\t");
        }
        System.Console.WriteLine();
    }
    
  • 优势:开箱即用的跨页表格处理,支持复杂表格(如合并单元格),官方技术支持完善,兼容.NET 8及旧版本。

特殊情况处理

如果PDF是扫描生成的图片格式,需先通过OCR转换为可编辑文本:

  • 免费方案:使用Tesseract.NET完成OCR,再用上述库提取表格
  • 付费方案:使用Syncfusion的OCR组件,一站式完成OCR与表格提取

内容的提问来源于stack exchange,提问作者Dejan Jovanovic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:55:33