跳至頁尾內容
使用IRONPDF
如何用 C# 從 PDF 文件中提取表格資料 | IronPDF

如何使用ASP .NET建立PDF

在許多行業中,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

How to Extract Table Data from a PDF File in C

在我們探討IronPDF如何處理這項任務之前,讓我們先探討下能夠處理PDF提取的線上工具。 要使用線上PDF工具從PDF文件中提取表格,請遵循以下步驟:

  1. 前往免費線上PDF提取工具
  2. 上傳包含表格的PDF
  3. 查看並下載結果

步驟一:前往免費線上PDF提取工具

今天,我們將使用Docsumo作為我們的線上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的ExtractAllText()方法是如何通過提取表中的資料運作的:

using IronPDF;

class Program
{
    static void Main(string[] args)
    {
        // Load the PDF document
        PdfDocument pdf = PdfDocument.FromFile("example.pdf");

        // Extract all text from the PDF
        string text = pdf.ExtractAllText();

        // Output the extracted text to the console
        Console.WriteLine(text);
    }
}
using IronPDF;

class Program
{
    static void Main(string[] args)
    {
        // Load the PDF document
        PdfDocument pdf = PdfDocument.FromFile("example.pdf");

        // Extract all text from the PDF
        string text = pdf.ExtractAllText();

        // Output the extracted text to the console
        Console.WriteLine(text);
    }
}
Imports IronPDF

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Load the PDF document
		Dim pdf As PdfDocument = PdfDocument.FromFile("example.pdf")

		' Extract all text from the PDF
		Dim text As String = pdf.ExtractAllText()

		' Output the extracted text to the console
		Console.WriteLine(text)
	End Sub
End Class
$vbLabelText   $csharpLabel

在C#中從PDF檔案中提取表格資料:圖4

在這個例子中,我們已經使用PdfDocument類載入了PDF文件,然後使用ExtractAllText()方法提取了文件中的所有文字,最後在控制台顯示了文字。

使用IronPDF從文字中提取表格資料

從PDF中提取文字之後,表格將作為純文字中的一系列行和列出現。 您可以根據換行符(\n)來分割這個文字,然後根據一致的間距或分隔符如逗號或標籤進一步將行分割為列。 以下是一個基本的範例,如何從文字解析表格:

using IronPDF;
using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        // Load the PDF document
        PdfDocument pdf = PdfDocument.FromFile("table.pdf");

        // Extract all text from the PDF
        string text = pdf.ExtractAllText();

        // Split the text into lines (rows)
        string[] lines = text.Split('\n');

        foreach (string line in lines)
        {
            // Split the line into columns using the tab character
            string[] columns = line.Split('\t').Where(col => !string.IsNullOrWhiteSpace(col)).ToArray();
            Console.WriteLine("Row:");

            foreach (string column in columns)
            {
                Console.WriteLine("  " + column); // Output each column in the row
            }
        }
    }
}
using IronPDF;
using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        // Load the PDF document
        PdfDocument pdf = PdfDocument.FromFile("table.pdf");

        // Extract all text from the PDF
        string text = pdf.ExtractAllText();

        // Split the text into lines (rows)
        string[] lines = text.Split('\n');

        foreach (string line in lines)
        {
            // Split the line into columns using the tab character
            string[] columns = line.Split('\t').Where(col => !string.IsNullOrWhiteSpace(col)).ToArray();
            Console.WriteLine("Row:");

            foreach (string column in columns)
            {
                Console.WriteLine("  " + column); // Output each column in the row
            }
        }
    }
}
Imports Microsoft.VisualBasic
Imports IronPDF
Imports System
Imports System.Linq

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Load the PDF document
		Dim pdf As PdfDocument = PdfDocument.FromFile("table.pdf")

		' Extract all text from the PDF
		Dim text As String = pdf.ExtractAllText()

		' Split the text into lines (rows)
		Dim lines() As String = text.Split(ControlChars.Lf)

		For Each line As String In lines
			' Split the line into columns using the tab character
			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) ' Output each column in the row
			Next column
		Next line
	End Sub
End Class
$vbLabelText   $csharpLabel

在C#中從PDF檔案中提取表格資料:圖5

在這個範例中,我們採取了與之前相同的步驟來載入我們的PDF文件並提取文字。 然後,使用text.Split('\n'),根據換行符將提取的文字分割為行,並將結果儲存在lines陣列中。 然後使用foreach迴圈遍歷陣列中的行,使用line.Split('\t'),使用標籤字元'\t'作為分隔符進一步將行分割為列。 欄位陣列的下一部分,Where(col => !string.IsNullOrWhiteSpace(col)).ToArray(),過濾掉由於額外空格可能產生的空欄位,然後將欄位新增到欄位陣列中。

最後,我們將文字輸出到控制台視窗,並結構化為基本的行和列。

導出提取的表格資料至CSV

現在我們已經介紹了如何從PDF文件中提取表格,讓我們看看可以對提取的資料做什麼。 將提取的表格導出為CSV文件是一種處理表格資料並自動化執行如資料輸入等任務的有效方式。 在這個例子中,我們用模擬資料填充了一個表格,在這個例子中是某周的每日降雨量,從PDF中提取了表格,然後將其導出為CSV文件。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using IronPDF;

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);

        // Extract text from the first page
        var text = pdf.ExtractTextFromPage(0); 
        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);
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using IronPDF;

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);

        // Extract text from the first page
        var text = pdf.ExtractTextFromPage(0); 
        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
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports IronPDF

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)

		' Extract text from the first page
		Dim text = pdf.ExtractTextFromPage(0)
		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) OrElse 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
$vbLabelText   $csharpLabel

範例PDF文件

在C#中從PDF檔案中提取表格資料:圖6

輸出CSV文件

在C#中從PDF檔案中提取表格資料:圖7

如您所見,我們已成功將PDF表格導出為CSV。首先,我們載入了包含表格的PDF並建立了一個新的CSV文件路徑。 在此之後,我們使用該var tableData = ExtractTableDataFromPdf(pdfPath)行提取了表格,這裡調用了ExtractTableDataFromPdf()方法。 該方法提取表格所在的PDF頁面上的所有文字,並將其儲存在text變數中。

然後,我們將文字分割為行和列。 最後,從該分割過程返回結果後,我們調用該方法static void WriteDataToCsv(),該方法將提取的拆分後的文字使用StreamWriter寫入我們的CSV文件。

提示和最佳實踐

在處理PDF表格時,遵循一些基本的最佳實踐可以幫助確保您將遇到的錯誤或問題降至最低。

  • 預處理PDF:如果可能,預先處理您的PDF以確保一致的格式,這可以簡化提取過程。
  • 驗證資料:始終驗證提取的資料以確保其準確性和完整性。
  • 處理錯誤:實施錯誤處理來管理文字提取或解析失敗的情況,例如將您的程式碼包裝在try-catch塊中。
  • 優化性能:對於大容量PDF,考慮優化文字提取和解析以處理性能問題。

IronPDF授權

IronPDF提供不同的授權選項,允許您在承諾購買授權之前試用IronPDF提供的所有強大功能。

結論

使用IronPDF從PDF中提取表格是一種強大的方式,能夠自動化資料提取、促進分析以及將文件轉換為更易於存取的格式。 無論是處理簡單表格還是複雜、不規則的格式,IronPDF都提供了提取和處理表格資料所需的工具,效率極高。

借助IronPDF,您可以簡化自動化資料輸入、文件轉換和資料分析等工作流程。 IronPDF提供的靈活性和高級功能使其成為處理各種基於PDF的任務的寶貴工具。

常見問題

如何使用 C# 從 PDF 中提取表格?

您可以使用 IronPDF 來從 PDF 中提取表格。在 IronPDF 中載入 PDF 文件,提取文字,然後以程式化方式將文字解析為行和列。

為什麼從 PDF 文件中提取表格資料是困難的?

PDF 主要設計為展示用途而非資料結構,這使得提取結構化資料如表格具有挑戰性。像 IronPDF 這樣的工具有助於有效地解釋和提取這些資料。

從 PDF 中提取表格有哪些好處?

從 PDF 中提取表格有助於自動化資料輸入、進行資料分析、將文件轉換成更易於存取的格式,以及在審核過程中確保合規性。

您如何處理 PDF 提取中的複雜表格格式?

IronPDF 提供了從複雜且不規則的表格格式中提取和處理表格資料的功能,確保資料提取的準確性。

將提取的 PDF 表格資料轉換為 CSV 的過程是什麼?

using IronPDF 從 PDF 中提取和解析表格資料後,您可以通過使用 StreamWriter 寫入已解析資料到 CSV 文件。

PDF 表格提取有哪些最佳實踐?

對 PDF 進行預處理以保持格式一致,驗證提取資料,實施錯誤處理,並在處理大型 PDF 文件時優化性能。

IronPDF 是否可以幫助進行審核和合規性任務?

是的,IronPDF 可以從 PDF 中提取表格資料並將其轉換為像 Excel 或 CSV 格式,有助於審核和合規性,使資料的審查和分析更加便捷。

IronPDF 提供哪些授權選項?

IronPDF 提供各種授權選項,包括試用版本,您可以在購買完整授權前探索其功能。

提取 PDF 表格時可能會出現哪些常見故障排除場景?

常見問題包括表格式不一致和文字提取錯誤。使用 IronPDF 的強大功能可以幫助減少這些挑戰,提供準確的解析能力。

IronPDF 是否完全相容 .NET 10,它如何有助於表格提取流程?

是的——IronPDF 支援 .NET 10(以及 .NET 9、8、7、6、Core、Standard 和 Framework),這意味著您可以在最新的 .NET 10 專案中使用它,沒有配置問題。建構在 .NET 10 上的開發人員受益於運行時性能改進,如減少分配和增強的 JIT 編譯器優化,這有助於加快 PDF 處理和表格提取操作。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話