使用IRONPDF

如何用 C# 从 PDF 文件中提取表格数据

发布 2024年十月23日
分享:

在许多行业中,PDF 文件是共享报告、发票和数据表等结构化文档的常用格式。 然而,由于 PDF 格式的特性,从 PDF 中提取数据(尤其是表格数据)是一项挑战。 与结构化数据格式不同,PDF 主要用于展示,而非提取数据。

然而,由于IronPDF通过 C# PDF .NET 库,您可以轻松地直接从 PDF 中提取表格等结构化数据,并在 .NET 应用程序中进行处理。 本文将逐步指导您如何使用 IronPDF 从 PDF 文件中提取表格数据。

何时需要从 PDF 文档中提取表格?

无论是进行库存管理、数据录入,还是记录降雨量等数据,表格都是一种方便的数据结构和显示方式。因此,可能也有很多原因需要从 PDF 文档中提取表格和表格数据。 一些最常见的使用案例包括

  • 数据录入自动化: 从 PDF 报告或发票中的表格中提取数据可以实现数据库或电子表格填充等流程的自动化。
  • 数据分析: 企业通常会收到 PDF 格式的结构化报告。 提取表格可以让您以编程方式分析这些数据。
  • 文档转换: 将表格数据提取为 Excel 或 CSV 等更易于访问的格式,以便于操作、存储和共享。
  • 审计与合规性: 对于法律或财务记录,以编程方式从 PDF 文档中提取表格数据有助于实现审计自动化并确保合规性。

PDF 表格如何工作?

PDF 文件格式无法以表格等结构化格式存储数据。 在今天的示例中,我们使用的表格是用 HTML 创建的,然后被翻译成中文。转换为 PDF 格式. 表格以文本和线条的形式呈现,因此提取表格数据通常需要对内容进行一些解析和解释,除非您使用 OCR 软件,如IronOCR.

如何用 C# 从 PDF 文件中提取表格数据;

在探讨 IronPdf 如何完成这项任务之前,我们先来了解一下能够处理 PDF 提取的在线工具。 要使用在线 PDF 工具从 PDF 文档中提取表格,请按照以下步骤操作:

  1. 导航至免费在线 PDF 提取工具

  2. 上传包含表格的 PDF

  3. 查看并下载结果

第一步:导航至免费在线 PDF 提取工具

今天,我们将使用文档摘要如我们的在线 PDF 工具示例。 Docsumo 是一款在线 PDF 文档 AI,提供免费的 PDF 表格提取工具。

如何用 C# 从 PDF 文件中提取表格数据:图 1

第二步:上传包含表格的 PDF

现在,单击 "上传文件 "按钮,上传 PDF 文件以供提取。 该工具将立即开始处理您的 PDF。

如何用 C# 从 PDF 文件中提取表格数据:图 2

第三步:查看并下载结果

Docsumo 完成处理 PDF 后,将显示提取的表格。 然后,您可以对表格结构进行调整,如添加和删除行。 在此,您可以下载 PDF、XLS、JSON 或文本形式的表格。

如何用 C# 从 PDF 文件中提取表格数据:图 3

使用 IronPDF 提取表格数据

通过 IronPDF,您可以从 PDF 中提取数据、文本和图形,然后用程序重构表格。 为此,您首先需要从 PDF 中的表格中提取文本内容,然后使用这些文本将表格解析为行和列。 在开始提取表格之前,我们先来看看 IronPDF 的提取所有文本()该方法的工作原理是提取表格中的数据:

using IronPDF;
PdfDocument pdf = PdfDocument.FromFile("example.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
using IronPDF;
PdfDocument pdf = PdfDocument.FromFile("example.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
Imports IronPDF
Private pdf As PdfDocument = PdfDocument.FromFile("example.pdf")
Private text As String = pdf.ExtractAllText()
Console.WriteLine(text)
VB   C#

如何用 C# 从 PDF 文件中提取表格数据:图 4

在本例中,我们使用PDF文档类,然后使用 ExtractAllText() 提取文档中所有文本的方法,最后将文本显示在控制台上。

使用 IronPDF 从文本中提取表格数据

从 PDF 中提取文本后,表格将显示为一系列纯文本行和列。 您可以根据换行来分割此文本(\n)然后根据一致的间距或分隔符(如逗号或制表符)进一步将行分成列。 以下是如何从文本中解析表格的基本示例:

using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("table.pdf");
string text = pdf.ExtractAllText();
string[] lines = text.Split('\n');
foreach (string line in lines)
{
    string[] columns = line.Split('\t').Where(col => !string.IsNullOrWhiteSpace(col)).ToArray();
    Console.WriteLine("Row: ");
    foreach (string column in columns)
    {
        Console.WriteLine("  " + column);
    }
}
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("table.pdf");
string text = pdf.ExtractAllText();
string[] lines = text.Split('\n');
foreach (string line in lines)
{
    string[] columns = line.Split('\t').Where(col => !string.IsNullOrWhiteSpace(col)).ToArray();
    Console.WriteLine("Row: ");
    foreach (string column in columns)
    {
        Console.WriteLine("  " + column);
    }
}
Imports Microsoft.VisualBasic
Imports IronPdf
Private pdf As PdfDocument = PdfDocument.FromFile("table.pdf")
Private text As String = pdf.ExtractAllText()
Private lines() As String = text.Split(ControlChars.Lf)
For Each line As String In lines
	Dim columns() As String = line.Split(ControlChars.Tab).Where(Function(col) Not String.IsNullOrWhiteSpace(col)).ToArray()
	Console.WriteLine("Row: ")
	For Each column As String In columns
		Console.WriteLine("  " & column)
	Next column
Next line
VB   C#

如何用 C# 从 PDF 文件中提取表格数据:图 5

在本例中,我们按照之前的相同步骤加载 PDF 文档并提取文本。 然后,使用text.Split('\n') 我们根据换行将提取的文本分成几行,并将结果存储在 lines 数组中。 然后使用一个 foreach 循环来遍历数组中的行,其中line.Split('\t') 使用制表符'\t'作为分隔符,将行进一步分割成列。 列数组的下一部分,*何处(col =>!string.IsNullOrWhiteSpace(语种)).ToArray()在翻译过程中,翻译人员必须注意以下几点: * 过滤掉因额外空格而可能出现的空列,然后将这些列添加到列数组中。

最后,我们将文本写入控制台输出窗口,并对行和列进行基本结构化。

将提取的表格数据导出为 CSV

现在,我们已经介绍了如何从 PDF 文件中提取表格,让我们来看看如何处理提取的数据。 将导出的表格导出为 CSV 文件是处理表格数据和自动执行数据录入等任务的一种有用方法。 在本例中,我们用模拟数据填充了一个表格,在本例中是一周内的日降雨量,从 PDF 中提取表格,然后将其导出为 CSV 文件。

class Program
{
    static void Main(string[] args)
    {
        string pdfPath = "table.pdf";
        string csvPath = "output.csv";
        // Extract and parse table data
        var tableData = ExtractTableDataFromPdf(pdfPath);
        // Write the extracted data to a CSV file
        WriteDataToCsv(tableData, csvPath);
        Console.WriteLine($"Data extracted and saved to {csvPath}");
    }
    static List<string[]> ExtractTableDataFromPdf(string pdfPath)
    {
        var pdf = PdfDocument.FromFile(pdfPath);
        var text = pdf.ExtractTextFromPage(0); // Extract text from the first page
        var rows = new List<string[]>();
        // Split text into lines (rows)
        var lines = text.Split('\n');
        // Variable to hold column values temporarily
        var tempColumns = new List<string>();
        foreach (var line in lines)
        {
            var trimmedLine = line.Trim();
            // Check for empty lines or lines that don't contain table data
            if (string.IsNullOrEmpty(trimmedLine) 
 trimmedLine.Contains("Header"))
            {
                continue;
            }
            // Split line into columns. Adjust this based on how columns are separated.
            var columns = trimmedLine.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
            if (columns.Length > 0)
            {
                // Add columns to temporary list
                tempColumns.AddRange(columns);
                rows.Add(tempColumns.ToArray());
                tempColumns.Clear(); // Clear temporary list after adding to rows
            }
        }
        return rows;
    }
    static void WriteDataToCsv(List<string[]> data, string csvPath)
    {
        using (var writer = new StreamWriter(csvPath))
        {
            foreach (var row in data)
            {
                // Join columns with commas and quote each field to handle commas within data
                var csvRow = string.Join(",", row.Select(field => $"\"{field.Replace("\"", "\"\"")}\""));
                writer.WriteLine(csvRow);
            }
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        string pdfPath = "table.pdf";
        string csvPath = "output.csv";
        // Extract and parse table data
        var tableData = ExtractTableDataFromPdf(pdfPath);
        // Write the extracted data to a CSV file
        WriteDataToCsv(tableData, csvPath);
        Console.WriteLine($"Data extracted and saved to {csvPath}");
    }
    static List<string[]> ExtractTableDataFromPdf(string pdfPath)
    {
        var pdf = PdfDocument.FromFile(pdfPath);
        var text = pdf.ExtractTextFromPage(0); // Extract text from the first page
        var rows = new List<string[]>();
        // Split text into lines (rows)
        var lines = text.Split('\n');
        // Variable to hold column values temporarily
        var tempColumns = new List<string>();
        foreach (var line in lines)
        {
            var trimmedLine = line.Trim();
            // Check for empty lines or lines that don't contain table data
            if (string.IsNullOrEmpty(trimmedLine) 
 trimmedLine.Contains("Header"))
            {
                continue;
            }
            // Split line into columns. Adjust this based on how columns are separated.
            var columns = trimmedLine.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
            if (columns.Length > 0)
            {
                // Add columns to temporary list
                tempColumns.AddRange(columns);
                rows.Add(tempColumns.ToArray());
                tempColumns.Clear(); // Clear temporary list after adding to rows
            }
        }
        return rows;
    }
    static void WriteDataToCsv(List<string[]> data, string csvPath)
    {
        using (var writer = new StreamWriter(csvPath))
        {
            foreach (var row in data)
            {
                // Join columns with commas and quote each field to handle commas within data
                var csvRow = string.Join(",", row.Select(field => $"\"{field.Replace("\"", "\"\"")}\""));
                writer.WriteLine(csvRow);
            }
        }
    }
}
Imports Microsoft.VisualBasic

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim pdfPath As String = "table.pdf"
		Dim csvPath As String = "output.csv"
		' Extract and parse table data
		Dim tableData = ExtractTableDataFromPdf(pdfPath)
		' Write the extracted data to a CSV file
		WriteDataToCsv(tableData, csvPath)
		Console.WriteLine($"Data extracted and saved to {csvPath}")
	End Sub
	Private Shared Function ExtractTableDataFromPdf(ByVal pdfPath As String) As List(Of String())
		Dim pdf = PdfDocument.FromFile(pdfPath)
		Dim text = pdf.ExtractTextFromPage(0) ' Extract text from the first page
		Dim rows = New List(Of String())()
		' Split text into lines (rows)
		Dim lines = text.Split(ControlChars.Lf)
		' Variable to hold column values temporarily
		Dim tempColumns = New List(Of String)()
		For Each line In lines
			Dim trimmedLine = line.Trim()
			' Check for empty lines or lines that don't contain table data
			If String.IsNullOrEmpty(trimmedLine) trimmedLine.Contains("Header") Then
				Continue For
			End If
			' Split line into columns. Adjust this based on how columns are separated.
			Dim columns = trimmedLine.Split( { " "c, ControlChars.Tab }, StringSplitOptions.RemoveEmptyEntries)
			If columns.Length > 0 Then
				' Add columns to temporary list
				tempColumns.AddRange(columns)
				rows.Add(tempColumns.ToArray())
				tempColumns.Clear() ' Clear temporary list after adding to rows
			End If
		Next line
		Return rows
	End Function
	Private Shared Sub WriteDataToCsv(ByVal data As List(Of String()), ByVal csvPath As String)
		Using writer = New StreamWriter(csvPath)
			For Each row In data
				' Join columns with commas and quote each field to handle commas within data
				Dim csvRow = String.Join(",", row.Select(Function(field) $"""{field.Replace("""", """""")}"""))
				writer.WriteLine(csvRow)
			Next row
		End Using
	End Sub
End Class
VB   C#

PDF 文件样本

如何用 C# 从 PDF 文件中提取表格数据:图 6

输出 CSV 文件

如何用 C# 从 PDF 文件中提取表格数据:图 7

如您所见,我们已成功将 PDF 表格导出为 CSV。首先,我们加载了包含表格的 PDF,并创建了一个新的 CSV 文件路径。 之后,我们使用 var tableData = ExtractTableDataFromPdf 提取表格(pdf路径) 该行称为 ExtractTableDataFromPdf() 方法。 该方法可提取表格所在 PDF 页面上的所有文本,并将其存储在 text 变量中。

然后,我们将文本分成行和列。 最后,在返回分割过程的结果后,我们调用 static void WriteDataToCsv 方法() 我们将使用 StreamWriter,将提取、分割的文本写入 CSV 文件。

提示和最佳实践

在使用 PDF 表格时,遵循一些基本的最佳实践有助于确保将遇到任何错误或问题的几率降至最低。

  • 预处理 PDF: 如果可能,对 PDF 进行预处理,以确保格式一致,从而简化提取过程。
  • 验证数据: 始终验证提取的数据,以确保准确性和完整性。
  • 处理错误: 实施错误处理,以管理文本提取或解析失败的情况,例如将代码封装在 try-catch 块中。
  • 优化性能: 对于大型 PDF,可考虑优化文本提取和解析,以处理性能问题。

IronPDF 许可

IronPDF 提供不同的授权IronPDF 提供免费试用版,您可以在购买许可证之前试用 IronPDF 的所有强大功能。

结论

使用以下工具从 PDF 文件中提取表格IronPDF在自动提取数据、促进分析以及将文档转换为更易于访问的格式方面,《Aspose.org》是一种强大的方法。 无论是处理简单的表格还是复杂、不规则的格式,IronPDF 都能提供高效提取和处理表格数据所需的工具。

使用 IronPdf,您可以简化工作流程,如自动数据录入、文档转换和数据分析。 IronPDF 提供的灵活性和高级功能使其成为处理各种基于 PDF 的任务的重要工具。

< 前一页
如何制作 C# PDF 转换器
下一步 >
如何在 ASP .NET 中使用 C# 将 HTML 转换为 PDF

准备开始了吗? 版本: 2024.12 刚刚发布

免费NuGet下载 总下载量: 11,622,374 查看许可证 >