PDF文档因其跨平台稳定性和格式保真度成为结构化数据存储的通用载体,但表格数据的可编辑性缺失导致人工转录效率低下且错误率高。通过C#我们能够实现自动化提取PDF表格,不仅能规避人工录入的错误风险,更可实现将PDF表格转化为CSV、Excel等适合数据分析处理的格式,从而直接对数据进行分析,或是将数据导入数据库。本文将介绍如何使用C#在.NET平台提取PDF表格并保存到文本、CSV已经Excel文件

  • 用C#提取PDF表格数据
  • 用C#提取PDF表格到CSV
  • 用C#导出PDF表格到Excel文件

本文所使用的方法需要用到免费的Free Spire.PDF for .NET,NuGet:PM> Install-Package FreeSpire.PDF

用C#提取PDF表格数据

我们可以使用库中的PdfTableExtractor类来处理PDF表格的提取,其中的PdfTableExtractor.ExtractTable()方法可以提取指定页面上的表格,然后返回一个列表。我们可以遍历表格,然后使用PdfTable.GetText()方法通过行列参数获取表格数据。以下是操作步骤:

  1. 导入所需模块。
  2. 创建PdfDocument对象,使用PdfDocument.LoadFromFile()方法载入PDF文档。
  3. 使用PdfDocument对象创建PdfTableExtractor实例。
  4. 遍历文档中的页面,使用PdfTableExtractor.ExtractTable()方法提取页面表格返回为列表。
  5. 如果列表不为空,则遍历提取到的表格,以及表格中的行、列,并使用PdfTable.GetText()方法获取单元格文本。
  6. 将提取到的表格数据写入文本。
  7. 释放资源。

代码示例

using Spire.Pdf;
using Spire.Pdf.Utilities;
using System.Text;

namespace ExtractPDFTableToText
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建PdfDocument类的实例
            PdfDocument pdf = new PdfDocument();

            // 加载PDF文档
            pdf.LoadFromFile("Sample.pdf");

            // 创建PdfTableExtractor类的实例
            PdfTableExtractor tableExtractor = new PdfTableExtractor(pdf);

            // 遍历PDF文档中的页面以提取表格
            for (int i = 0; i < pdf.Pages.Count; i++)
            {
                // 从当前页面提取表格
                PdfTable[] tables = tableExtractor.ExtractTable(i);
                // 如果表格列表不为空,则遍历这些表格
                if (tables != null)
                {
                    for (int j = 0; j < tables.Length; j++)
                    {
                        // 获取当前表格
                        PdfTable table = tables[j];
                        string tableData = "";
                        // 遍历表格中的行和列
                        for (int k = 0; k < table.GetRowCount(); k++)
                        {
                            for (int l = 0; l < table.GetColumnCount(); l++)
                            {
                                // 获取当前单元格中的文本
                                String cellText = table.GetText(k, l);
                                String cleanText = cellText.Replace("\r\n", "").Replace("\n", "");
                                if (l < table.GetColumnCount() - 1)
                                {
                                    tableData += cleanText + "\t";
                                }
                                else
                                {
                                    tableData += cleanText;
                                }
                            }
                            tableData += "\r\n";
                        }
                        // 将表格数据写入到一个文本文件
                        File.WriteAllText($"output/Page-{i + 1}-Table-{j + 1}.txt", tableData, Encoding.UTF8);
                    }
                }
            }
            // 释放资源
            pdf.Close();
        }
    }
}

提取结果
C#提取PDF表格写入文本文件

用C#提取PDF表格到CSV

我们也可以在提取到表格之后,对数据进行处理,使其符合CSV结构要求,然后以CSV表格格式写入到文件中。
代码示例

using Spire.Pdf;
using Spire.Pdf.Utilities;
using System.Text;

namespace ExtractPDFTableToText
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建PdfDocument类的实例
            PdfDocument pdf = new PdfDocument();

            // 加载PDF文档
            pdf.LoadFromFile("Sample.pdf");

            // 创建PdfTableExtractor类的实例
            PdfTableExtractor tableExtractor = new PdfTableExtractor(pdf);

            // 遍历PDF文档中的页面以提取表格
            for (int i = 0; i < pdf.Pages.Count; i++)
            {
                // 从当前页面提取表格
                PdfTable[] tables = tableExtractor.ExtractTable(i);
                // 如果表格列表不为空,则遍历这些表格
                if (tables != null)
                {
                    for (int j = 0; j < tables.Length; j++)
                    {
                        // 获取当前表格
                        PdfTable table = tables[j];
                        string tableData = "";
                        // 遍历表格中的行和列
                        for (int k = 0; k < table.GetRowCount(); k++)
                        {
                            for (int l = 0; l < table.GetColumnCount(); l++)
                            {
                                // 获取当前单元格的文本
                                String cellText = table.GetText(k, l);
                                // 处理文本以避免破坏CSV结构
                                String cleanText = CleanCsvField(cellText);
                                if (l < table.GetColumnCount() - 1)
                                {
                                    tableData += cleanText + ", ";
                                }
                                else
                                {
                                    tableData += cleanText;
                                }
                            }
                            tableData += "\r\n";
                        }
                        // 将表格数据写入到一个CSV文件
                        File.WriteAllText($"output/Page-{i + 1}-Table-{j + 1}.csv", tableData, Encoding.UTF8);
                    }
                }
            }
            // 释放资源
            pdf.Close();
        }

        // 函数用于移除可能会破坏CSV结构的字符
        private static string CleanCsvField(string field)
        {
            // 移除所有类型的换行符并修剪空格
            field = field.Replace("\r\n", "").Replace("\n", "").Replace("\r", "").Trim();

            bool mustQuote = field.Contains(",") || field.Contains("\"");
            if (mustQuote)
            {
                // 将每个双引号替换为两个双引号,并用双引号包围整个字段
                return "\"" + field.Replace("\"", "\"\"") + "\"";
            }
            return field;
        }
    }
}

提取结果
.NET提取PDF表格写入CSV文件

用C#导出PDF表格到Excel文件

我们还可以搭配使用Free Spire.XLS for .NET(NuGet:PM> Install-Package FreeSpire.XLS),将提取到的表格数据写入到新建的Excel文件中。以下是操作步骤:

  1. 导入所需模块。
  2. 创建PdfDocument对象,使用PdfDocument.LoadFromFile()方法载入PDF文档。
  3. 创建Workbook对象,从而新建一个Excel工作簿,并使用Workbook.Worksheets.Clear()方法清除默认工作表。
  4. 使用PdfDocument对象创建PdfTableExtractor实例。
  5. 遍历文档中的页面,使用PdfTableExtractor.ExtractTable()方法提取页面表格返回为列表。
  6. 如果列表不为空,则遍历提取到的表格,使用Workbook.Worksheets.Add()为每个表格创建一个工作表。
  7. 遍历表格中的行、列,使用PdfTable.GetText()方法获取单元格文本,然后使用Worksheet.Range[].Text属性将单元格文本写入到工作表中。
  8. 使用Workbook.SaveToFile()方法保存Excel工作簿。
  9. 释放资源。

代码示例

using Spire.Pdf;
using Spire.Pdf.Utilities;
using Spire.Xls;

namespace ExtractPDFTableToText
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建PdfDocument类的实例
            PdfDocument pdf = new PdfDocument();

            // 加载PDF文档
            pdf.LoadFromFile("Sample.pdf");

            // 创建Workbook类的实例
            Workbook workbook = new Workbook();
            // 移除默认的工作表
            workbook.Worksheets.Clear();

            // 创建PdfTableExtractor类的实例
            PdfTableExtractor tableExtractor = new PdfTableExtractor(pdf);

            // 遍历PDF文档中的页面以提取表格
            for (int i = 0; i < pdf.Pages.Count; i++)
            {
                // 从当前页面提取表格
                PdfTable[] tables = tableExtractor.ExtractTable(i);
                // 如果表格列表不为空,则遍历这些表格
                if (tables != null)
                {
                    for (int j = 0; j < tables.Length; j++)
                    {
                        // 获取当前表格
                        PdfTable table = tables[j];
                        // 在工作簿中创建一个工作表
                        Worksheet sheet = workbook.Worksheets.Add($"Page-{i + 1}-Table-{j + 1}");
                        // 遍历表格中的行和列
                        for (int k = 0; k < table.GetRowCount(); k++)
                        {
                            for (int l = 0; l < table.GetColumnCount(); l++)
                            {
                                // 获取当前单元格的文本
                                String cellText = table.GetText(k, l);
                                // 移除换行符
                                String cleanText = cellText.Replace("\r\n", "").Replace("\n", "");
                                // 将单元格文本写入到工作表中对应的单元格
                                sheet.Range[k + 1, l + 1].Text = cleanText;
                            }
                        }
                        // 自动调整列宽
                        for (int m = 0; m < sheet.AllocatedRange.ColumnCount; m++)
                        {
                            sheet.AutoFitColumn(m + 1);
                        }
                    }
                }
            }

            // 保存工作簿
            workbook.SaveToFile("output/PDFTables.xlsx", ExcelVersion.Version2016);

            // 释放资源
            pdf.Close();
            workbook.Dispose();
        }
    }
}

提取结果
C#提取PDF表格到Excel工作表

本文演示了如何使用C#在.NET中提取PDF文档中的表格数据,并写入到文本、CSV以及Excel文件中。


大丸子
72 声望6 粉丝