跳過到頁腳內容
使用IRONPDF

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

在許多行業中,PDF 文件是共享結構化文件(如報告、發票和資料表)的首選格式。 然而,由於 PDF 格式的特性,從 PDF 中提取數據,尤其是表格數據,可能具有挑戰性。 與結構化資料格式不同,PDF 主要用於演示,而不是資料擷取。

但是,借助功能強大的 C# PDF .NET 庫IronPDF ,您可以輕鬆地直接從 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 表格擷取工具。

如何在 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 頁面上的所有文本,並將其儲存在文本變數中。

然後,我們將文字分成行和列。 最後,在傳回此拆分過程的結果後,我們呼叫靜態方法 void WriteDataToCsv() ,該方法接受提取的拆分文本,並使用StreamWriter將其寫入我們的 CSV 檔案。

技巧和最佳實踐

在使用 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 檔案。

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 機器人,結合科技與創意的樂趣。