使用 IRONPDF

如何從 PDF 文件中提取表格數據(使用 C#)

發佈 2024年10月23日
分享:

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

然而,隨著IronPDF使用強大的 C# PDF .NET 函式庫,您可以輕鬆地從 PDF 中提取結構化數據,如表格,並在您的 .NET 應用程式中進行處理。 本文將逐步引導您如何使用IronPDF從PDF文件中提取表格數據。

何時需要從 PDF 文件中提取表格?

表格是一種方便的結構和顯示數據的方式,無論是進行庫存管理、數據輸入、記錄降雨量等數據。因此,可能也有很多原因需要從PDF文件中提取表格和表格數據。 一些最常見的使用案例包括:

  • 自動化數據輸入: 從 PDF 報告或發票中的表格提取數據可以自動化填充資料庫或電子表格等過程。
  • 數據分析: 企業通常以 PDF 格式接收結構化報告。 提取表格可讓您以程式化方式分析這些數據。
  • 文件轉換: 將表格數據提取為更易於訪問的格式,例如 Excel 或 CSV,使操作、存儲和共享更加便利。
  • 審計與合規性: 對於法律或財務記錄,透過程式化地從 PDF 文件中提取表格數據可以幫助自動化審計並確保合規性。

PDF 表格如何運作?

PDF 檔案格式不具備以表格等結構格式儲存資料的原生功能。 我們今天示例中使用的表格是用 HTML 創建的,然後被轉換為 PDF 格式. 表格會被顯示為文字和線條,因此,提取表格數據通常需要一些解析和解釋內容,除非您使用像 IronOCR 這樣的 OCR 軟體。IronOCR.

如何從 PDF 檔案中擷取表格資料(C#)

在我們探討IronPDF如何解決此任務之前,我們先來探索一個能夠處理PDF提取的在線工具。 要使用在線 PDF 工具從 PDF 文件中提取表格,請按照以下步驟操作:

  1. 導航至免費的線上 PDF 提取工具

  2. 上傳包含表格的 PDF 文件

  3. 查看並下載結果

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

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

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

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

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

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

步驟三:查看並下載結果

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

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

使用 IronPDF 提取表格數據

IronPDF 允許您從 PDF 提取數據、文本和圖形,然後可以用來以程式方式重建表格。 為此,您首先需要從 PDF 中提取表格的文本內容,然後使用該文本將表格解析為行和列。 在我們開始提取表格之前,讓我們來看看IronPDF的ExtractAllText()方法通過提取表格內的數據來運作:

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#

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

在此範例中,我們已使用該PDF文件加载PdfDocumentclass,然後使用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' 作為分隔符。 接下來是欄位陣列的一部分,Where(列 =>!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 檔案

如何從 PDF 檔案中提取表格數據(以 C# 編寫):圖 7

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

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

提示和最佳實踐

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

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

IronPDF 授權

IronPDF 提供不同的授權提供,可以讓您在購買授權之前親自嘗試 IronPDF 所提供的所有強大功能。

結論

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

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

< 上一頁
如何製作 C# PDF 轉換器
下一個 >
如何在 ASP .NET 中使用 C# 將 HTML 轉換為 PDF

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >