跳過到頁腳內容
使用IRONPDF

如何從PDF文件中提取表格式數據在C#中

在許多行業中,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 提取工具

今天,我們將使用 Docsumo 作為我們的在線 PDF 工具示例。 Docsumo 是一款在線 PDF 文檔 AI 提供的免費 PDF 表格提取工具。

如何從 PDF 文件中提取表格數據:圖 1

步驟二:上傳包含表格的 PDF

現在,單擊「上傳文件」按鈕以上傳要提取的 PDF 文件。 工具將立即開始處理您的 PDF。

如何從 PDF 文件中提取表格數據:圖 2

步驟三:查看並下載結果

一旦 Docsumo 完成處理 PDF,它將顯示提取的表格。 然後,您可以對表格結構進行調整,如添加和刪除行。 在這裡,您可以將表格下載為另一個 PDF、XLS、JSON 或文本格式。

如何從 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

如何從 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

如何從 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 文件

如何從 PDF 文件中提取表格數據:圖 6

輸出 CSV 文件

如何從 PDF 文件中提取表格數據:圖 7

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

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

提示與最佳實踐

在處理 PDF 表格時,遵循一些基本的最佳實踐可以幫助確保您最大限度地減少遇到任何錯誤或問題的機會。

  • 預處理 PDF:如果可能,對您的 PDF 進行預處理以確保格式一致,這可以簡化提取過程。
  • 驗證數據:始終驗證提取的數據以確保準確性和完整性。
  • 處理錯誤:實施錯誤處理以管理文本提取或解析失敗的情況,例如將您的代碼包裹在 try-catch 塊中。
  • 優化性能:對於大型 PDF,考慮優化文本提取和解析以應對性能問題。

IronPDF 授權

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

結論

使用IronPDF從 PDF 中提取表格是一種強大的自動化數據提取的方法,可以促進分析並將文件轉換為更易訪問的格式。 無論是處理簡單表格還是複雜、不規則的格式,IronPDF 提供了需要的工具來高效提取和處理表格數據。

使用 IronPDF,您可以簡化自動化數據輸入、文檔轉換和數據分析等工作流程。 IronPDF 提供的靈活性和先進功能使其成為處理各種基於 PDF 的任務的寶貴工具。

常見問題解答

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

您可以使用 IronPDF 從 C# 中的 PDF 文件中提取表格。使用 IronPDF 載入 PDF 文件,提取文本,然後以程式設計方式將文本解析為行和列。

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

PDF文件主要用於展示而非資料結構,這使得提取表格等結構化資料頗具挑戰性。 IronPDF等工具可以幫助我們有效地解析和提取這些數據。

從PDF文件中提取表格有什麼好處?

從 PDF 中提取表格有助於實現資料輸入自動化、執行資料分析、將文件轉換為更易於存取的格式,並確保審計流程的合規性。

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

IronPDF 能夠從複雜且不規則的表格格式中提取和處理表格數據,確保準確提取數據。

如何將提取的 PDF 表格資料轉換為 CSV 檔案?

使用 IronPDF 從 PDF 中提取和解析表格資料後,您可以使用StreamWriter將解析後的資料寫入 CSV 文件,從而將此資料匯出到 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 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。