跳至頁尾內容
使用 IRONPDF

如何在 C# 讀取 PDF 表格

從 PDF 文件中提取結構化表格資料是 C# 開發人員經常需要做的事情,對於資料分析、報告或將資訊整合到其他系統中至關重要。 然而,PDF 的主要設計目的是為了實現一致的視覺呈現,而不是直接提取資料。 這使得在 C# 中以程式設計方式從 PDF 文件中讀取表格成為一項具有挑戰性的任務,尤其是表格可能千差萬別——從簡單的基於文字的網格到具有合併單元格的複雜佈局,甚至是作為圖像嵌入在掃描文件中的表格。

本指南提供了一個全面的 C# 教程,介紹如何使用 IronPDF 提取 PDF 表格。 我們將主要探索如何利用 IronPDF 強大的文字擷取功能來存取和解析基於文字的 PDF 中的表格資料。 我們將討論該方法的有效性,提供解析策略,並就如何處理提取的資訊提供見解。 此外,我們還將探討應對更複雜情況的策略,包括掃描的 PDF 檔案。


使用 C# 從 PDF 提取表格資料的關鍵步驟

  1. 安裝 IronPDF C# 庫( https://nuget.org/packages/IronPdf/ )以進行 PDF 處理。
    2.(可選示範步驟)使用 IronPDF 的RenderHtmlAsPdf從 HTML 字串建立帶有表格的範例 PDF。 (請參閱"(示範步驟)建立包含表格資料的 PDF 文件"部分)
  2. 載入任意 PDF 文檔,並使用ExtractAllText方法檢索其原始文字內容。 (See section: Extract All Text Containing Table Data from the PDF)
  3. 實作 C# 邏輯來解析擷取的文字並辨識表格行和儲存格。 (See section: Parsing Extracted Text to Reconstruct Table Data in C#)
  4. 輸出結構化表格資料或將其儲存到 CSV 檔案以供進一步使用。 (See section: Parsing Extracted Text to Reconstruct Table Data in C#)
  5. 考慮使用 OCR 等高階技術處理掃描的 PDF 檔案(稍後討論)。

IronPDF - C# PDF 庫

IronPDF 是一個用於在 .NET 中操作 PDF 的 C# .NET 庫解決方案 ( https://ironpdf.com/ ),它可以幫助開發人員在其軟體應用程式中輕鬆讀取、建立和編輯 PDF 文件。 它強大的 Chromium 引擎能夠以高精度和高速度將 HTML 文件渲染成 PDF 文件。 它允許開發人員無縫地將不同格式的文件轉換為 PDF 格式,反之亦然。 它支援最新的 .NET 框架,包括 .NET 7、.NET 6、.NET 5、.NET 4、.NET Core 和 .NET Standard。

此外,IronPDF .NET API 還使開發人員能夠輕鬆地操作和編輯 PDF,添加頁眉和頁腳,更重要的是,還能從 PDF 中提取文字、圖像以及(我們將看到的)表格資料。

一些重要功能包括:

使用 IronPDF 庫在 C# 中擷取表格資料的步驟

為了從 PDF 文件中提取表格數據,我們將建立一個 C# 專案:

  1. Visual Studio:確保您已安裝 Visual Studio(例如,2022)。 如果沒有,請從 Visual Studio 網站( https://visualstudio.microsoft.com/downloads/ )下載。
    2.創建專案:

3.安裝 IronPDF:
*使用 Visual Studio NuGet 套件管理器:

 在解決方案資源管理器中右鍵單擊您的項目,然後選擇"管理 NuGet 套件..."

    [如何在 C# 中讀取 PDF 表格,圖 5:工具和管理 NuGet 套件](/static-assets/pdf/blog/csharp-read-pdf-table-tutorial/csharp-read-pdf-table-tutorial-5.webp)
    **工具與管理 NuGet 套件**

 * 在 NuGet 套件管理員中,瀏覽至"IronPdf",然後按一下"安裝"。
    [如何在 C# 中讀取 PDF 表格,圖 6:工具和管理 NuGet 套件](/static-assets/pdf/blog/csharp-read-pdf-table-tutorial/csharp-read-pdf-table-tutorial-6.webp)
    **工具與管理 NuGet 套件**

*直接下載 NuGet 套件:*造訪 IronPDF 的 NuGet 套件頁面( https://www.nuget.org/packages/IronPdf/ )。 下載 IronPDF .DLL 庫:**從 IronPDF 官方網站下載,並在您的專案中引用該 DLL。

(示範步驟)建立包含表格資料的 PDF 文檔

在本教程中,我們將首先根據 HTML 字串建立一個包含簡單表格的範例 PDF。 這為我們提供了一個已知的 PDF 結構,可以用來示範提取過程。 在實際應用中,你會載入你預先存在的 PDF 檔案。

新增 IronPDF 命名空間,並可選擇設定您的許可證金鑰(IronPDF 可免費用於開發,但若要進行無浮水印的商業部署,則需要許可證):

using IronPdf;
using System;       // For StringSplitOptions, Console
using System.IO;    // For StreamWriter

// Apply your license key if you have one. Otherwise, IronPDF runs in trial mode.
// License.LicenseKey = "YOUR-TRIAL/PURCHASED-LICENSE-KEY";
using IronPdf;
using System;       // For StringSplitOptions, Console
using System.IO;    // For StreamWriter

// Apply your license key if you have one. Otherwise, IronPDF runs in trial mode.
// License.LicenseKey = "YOUR-TRIAL/PURCHASED-LICENSE-KEY";
$vbLabelText   $csharpLabel

以下是範例表格的 HTML 程式碼:

string HTML = "<html>" +
        "<style>" +
            "table, th, td {" +
                "border:1px solid black;" +
            "}" +
        "</style>" +
        "<body>" +
            "<h1>A Simple table example</h1>" + // Corrected typo: h1 not h2
            "<table>" +
                "<tr>" +
                    "<th>Company</th>" +
                    "<th>Contact</th>" +
                    "<th>Country</th>" +
               "</tr>" +
                "<tr>" +
                    "<td>Alfreds Futterkiste</td>" +
                    "<td>Maria Anders</td>" +
                    "<td>Germany</td>" +
                "</tr>" +
                "<tr>" +
                    "<td>Centro comercial Moctezuma</td>" +
                    "<td>Francisco Chang</td>" +
                    "<td>Mexico</td>" +
                "</tr>" +
            "</table>" +
            "<p>To understand the example better, we have added borders to the table.</p>" +
        "</body>" +
        "</html>";
string HTML = "<html>" +
        "<style>" +
            "table, th, td {" +
                "border:1px solid black;" +
            "}" +
        "</style>" +
        "<body>" +
            "<h1>A Simple table example</h1>" + // Corrected typo: h1 not h2
            "<table>" +
                "<tr>" +
                    "<th>Company</th>" +
                    "<th>Contact</th>" +
                    "<th>Country</th>" +
               "</tr>" +
                "<tr>" +
                    "<td>Alfreds Futterkiste</td>" +
                    "<td>Maria Anders</td>" +
                    "<td>Germany</td>" +
                "</tr>" +
                "<tr>" +
                    "<td>Centro comercial Moctezuma</td>" +
                    "<td>Francisco Chang</td>" +
                    "<td>Mexico</td>" +
                "</tr>" +
            "</table>" +
            "<p>To understand the example better, we have added borders to the table.</p>" +
        "</body>" +
        "</html>";
HTML

現在,使用ChromePdfRenderer從這段 HTML 產生 PDF:

var renderer = new ChromePdfRenderer();
PdfDocument pdfDocument = renderer.RenderHtmlAsPdf(HTML);
pdfDocument.SaveAs("table_example.pdf");
Console.WriteLine("Sample PDF 'table_example.pdf' created.");
var renderer = new ChromePdfRenderer();
PdfDocument pdfDocument = renderer.RenderHtmlAsPdf(HTML);
pdfDocument.SaveAs("table_example.pdf");
Console.WriteLine("Sample PDF 'table_example.pdf' created.");
$vbLabelText   $csharpLabel

SaveAs方法用於儲存 PDF 檔案。 產生的table_example.pdf檔案將如下所示(基於 HTML 的概念圖):

如何在 C# 中讀取 PDF 表格,圖 7:在 NuGet 套件管理器 UI 中搜尋 IronPDF 在 NuGet 套件管理器 UI 中搜尋 IronPDF

從PDF文件中提取所有包含表格資料的文字。

要提取表格數據,我們首先載入 PDF(可以是剛剛建立的 PDF,也可以是任何現有的 PDF),然後使用ExtractAllText方法。 此方法從 PDF 頁面中提取所有文字內容。

// Load the PDF (if you just created it, it's already loaded in pdfDocument)
// If loading an existing PDF:
// PdfDocument pdfDocument = PdfDocument.FromFile("table_example.pdf"); 
// Or use the one created above:
string allText = pdfDocument.ExtractAllText();
// Load the PDF (if you just created it, it's already loaded in pdfDocument)
// If loading an existing PDF:
// PdfDocument pdfDocument = PdfDocument.FromFile("table_example.pdf"); 
// Or use the one created above:
string allText = pdfDocument.ExtractAllText();
$vbLabelText   $csharpLabel

allText變數現在保存了 PDF 中的所有文字內容。 您可以將其顯示出來以查看原始提取結果:

Console.WriteLine("\n--- Raw Extracted Text ---");
Console.WriteLine(allText);
Console.WriteLine("\n--- Raw Extracted Text ---");
Console.WriteLine(allText);
$vbLabelText   $csharpLabel

如何在 C# 中讀取 PDF 表格,圖 8:要提取文字的 PDF 文件 要提取文字的PDF文件

使用 C# 解析提取的文字以重建表格數據

提取出原始文字後,下一個挑戰是解析該字串以識別和建立表格資料。 這步驟很大程度取決於PDF文件中表格的一致性和格式。

通用解析策略:

1.識別行分隔符號:換行符號( \n\r\n )是常見的行分隔符號。
2.識別列分隔符號:一行中的儲存格可能由多個空格、製表符或特定的已知字元(例如"'")分隔。|' 或 ';')。 有時,如果列在視覺上對齊,但缺少清晰的文字分隔符,您可以根據一致的間距模式推斷結構,儘管這更複雜。 3.過濾非表格內容: ExtractAllText方法取得所有文字。 你需要運用邏輯來提取實際構成表格的文本,例如尋找標題關鍵字或跳過前言/後言文本。

C# 的String.Split方法是實作此功能的基本工具。 以下範例嘗試從我們的樣本中僅提取表格行,並過濾掉包含句點的行(這是針對此特定範例的簡單啟發式方法):

Console.WriteLine("\n--- Parsed Table Data (Simple Heuristic) ---");
string[] textLines = allText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in textLines)
{
    // Simple filter: skip lines with a period, assuming they are not table data in this example
    // and skip lines that are too short or headers if identifiable
    if (line.Contains(".") || line.Contains("A Simple table example") || line.Length < 5) 
    {
        continue;
    }
    else
    {
        // Further split line into cells based on expected delimiters (e.g., multiple spaces)
        // This part requires careful adaptation to your PDF's table structure
        // Example: string[] cells = line.Split(new[] { "  ", "\t" }, StringSplitOptions.None);
        Console.WriteLine(line); // For now, just print the filtered line
    }
}
Console.WriteLine("\n--- Parsed Table Data (Simple Heuristic) ---");
string[] textLines = allText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in textLines)
{
    // Simple filter: skip lines with a period, assuming they are not table data in this example
    // and skip lines that are too short or headers if identifiable
    if (line.Contains(".") || line.Contains("A Simple table example") || line.Length < 5) 
    {
        continue;
    }
    else
    {
        // Further split line into cells based on expected delimiters (e.g., multiple spaces)
        // This part requires careful adaptation to your PDF's table structure
        // Example: string[] cells = line.Split(new[] { "  ", "\t" }, StringSplitOptions.None);
        Console.WriteLine(line); // For now, just print the filtered line
    }
}
$vbLabelText   $csharpLabel

這段程式碼將文字分割成行。 if條件是一個非常基本的篩選器,適用於本範例中的非表格文字。 在實際應用中,您需要更強大的邏輯來準確識別和解析表格的行和單元格。

簡單過濾後的文字輸出:

如何在 C# 中讀取 PDF 表格,圖 9:控制台顯示提取的文本 控制台顯示提取的文字。

文本解析方法的重要考慮因素:

*最適合:*具有簡單、一致的表格結構和清晰的文字分隔符號的文字型 PDF。
局限性:**此方法可能難以應對以下情況:

  • 包含合併儲存格或複雜巢狀結構的表格。
  • 表格中列是透過視覺間距而不是文字分隔符號來定義的。
  • 表格以影像形式嵌入(需要 OCR)。
  • PDF 產生過程中的差異導致文字擷取順序不一致。

您可以將篩選後的行(理想情況下代表表格行)儲存到 CSV 檔案中:

using (StreamWriter file = new StreamWriter("parsed_table_data.csv", false))
{
    file.WriteLine("Company,Contact,Country"); // Write CSV Header
    foreach (string line in textLines)
    {
        if (line.Contains(".") || line.Contains("A Simple table example") || line.Length < 5)
        {
            continue;
        }
        else
        {
            // For a real CSV, you'd split 'line' into cells and join with commas
            // E.g., string[] cells = line.Split(new[] {"  "}, StringSplitOptions.RemoveEmptyEntries);
            // string csvLine = string.Join(",", cells);
            // file.WriteLine(csvLine);
            file.WriteLine(line.Replace("  ", ",").Trim()); // Basic replacement for this example
        }
    }
}
Console.WriteLine("\nFiltered table data saved to parsed_table_data.csv");
using (StreamWriter file = new StreamWriter("parsed_table_data.csv", false))
{
    file.WriteLine("Company,Contact,Country"); // Write CSV Header
    foreach (string line in textLines)
    {
        if (line.Contains(".") || line.Contains("A Simple table example") || line.Length < 5)
        {
            continue;
        }
        else
        {
            // For a real CSV, you'd split 'line' into cells and join with commas
            // E.g., string[] cells = line.Split(new[] {"  "}, StringSplitOptions.RemoveEmptyEntries);
            // string csvLine = string.Join(",", cells);
            // file.WriteLine(csvLine);
            file.WriteLine(line.Replace("  ", ",").Trim()); // Basic replacement for this example
        }
    }
}
Console.WriteLine("\nFiltered table data saved to parsed_table_data.csv");
$vbLabelText   $csharpLabel

C#中更複雜的PDF表格擷取策略

從複雜的或基於圖像的 PDF 表格中提取資料通常需要比簡單的文字解析更高級的技術。 IronPDF 提供以下功能:

*使用 IronOCR 對掃描表格的功能:如果表格位於影像中(例如,掃描的 PDF),則僅使用ExtractAllText()無法擷取它們。 IronOCR的文字偵測功能可以先將這些影像轉換為文字。

// Conceptual OCR usage (refer to IronOCR's documentation for detailed implementation)
// Install Package IronOcr
using IronOcr;
using (var ocrInput = new OcrInput("scanned_pdf_with_table.pdf"))
{
     ocrInput.TargetDPI = 300; // Good DPI for OCR accuracy
     var ocrResult = new IronOcr().Read(ocrInput);
     string ocrExtractedText = ocrResult.Text;
     // Now, apply parsing logic to 'ocrExtractedText'
     Console.WriteLine("\n--- OCR Extracted Text for Table Parsing ---");
     Console.WriteLine(ocrExtractedText);
}
// Conceptual OCR usage (refer to IronOCR's documentation for detailed implementation)
// Install Package IronOcr
using IronOcr;
using (var ocrInput = new OcrInput("scanned_pdf_with_table.pdf"))
{
     ocrInput.TargetDPI = 300; // Good DPI for OCR accuracy
     var ocrResult = new IronOcr().Read(ocrInput);
     string ocrExtractedText = ocrResult.Text;
     // Now, apply parsing logic to 'ocrExtractedText'
     Console.WriteLine("\n--- OCR Extracted Text for Table Parsing ---");
     Console.WriteLine(ocrExtractedText);
}
$vbLabelText   $csharpLabel

如需詳細指導,請造訪 IronOCR 文件(https://ironsoftware.com/csharp/ocr/ )。 OCR辨識之後,你需要解析得到的文字字串。

*基於座標的文字擷取(進階):雖然 IronPDF 的ExtractAllText()提供了文字流,但在某些情況下,了解每個文字片段的 x、y 座標可能會有所幫助。 如果 IronPDF 提供 API 來取得具有邊界框資訊的文字(請查看目前文件),這將允許進行更複雜的空間解析,以根據視覺對齊方式重建表格。

*將 PDF 轉換為其他格式: IronPDF 可以將 PDF 轉換為 HTML 等結構化格式。 通常情況下,解析 HTML 表格比解析原始 PDF 文字更直接。

PdfDocument pdfToConvert = PdfDocument.FromFile("your_document.pdf");
string htmlOutput = pdfToConvert.ToHtmlString();
// Then use an HTML parsing library (e.g., HtmlAgilityPack) to extract tables from htmlOutput.
PdfDocument pdfToConvert = PdfDocument.FromFile("your_document.pdf");
string htmlOutput = pdfToConvert.ToHtmlString();
// Then use an HTML parsing library (e.g., HtmlAgilityPack) to extract tables from htmlOutput.
$vbLabelText   $csharpLabel

*模式識別和正規表示式:對於具有非常可預測的模式但分隔符號不一致的表格,對提取的文字應用複雜的正規表示式有時可以隔離表格資料。

選擇合適的策略取決於來源 PDF 的複雜性和一致性。 對於許多包含文字表格的常見商務文檔,IronPDF 的ExtractAllText功能結合智慧的 C# 解析邏輯非常有效。而對於影像表格,其 OCR 功能則至關重要。

概括

本文示範如何使用 IronPDF 從 C# 中的 PDF 文件中提取表格數據,主要專注於利用ExtractAllText()方法和後續的字串解析。 我們已經看到,雖然這種方法對於基於文字的表格非常有效,但對於更複雜的場景(例如基於圖像的表格),可以使用 IronPDF 的 OCR 功能或先將 PDF 轉換為其他格式來解決。

IronPDF 為 .NET 開發人員提供了一套功能強大的工具包,簡化了許多與 PDF 相關的任務,從建立和編輯到全面的資料擷取。 它提供了諸如ExtractTextFromPage之類的頁面特定提取方法,並支援將markdownDOCX等格式轉換為 PDF。

IronPDF 可免費用於開發,並提供免費試用許可證,供用戶測試其全部商業功能。 對於生產環境部署,我們提供多種授權選項。

如需更多詳細資訊和進階用例,請參閱 IronPDF 官方文件和範例(https://ironpdf.com/

常見問題解答

如何使用 C# 以程式設計方式讀取 PDF 文件中的表格?

您可以使用 IronPDF 的 `ExtractAllText` 方法從 PDF 文件中提取原始文字。提取後,您可以使用 C# 解析此文字以識別表格行和單元格,從而實現結構化資料提取。

使用 C# 從 PDF 擷取表格資料涉及哪些步驟?

該過程包括安裝 IronPDF 庫,使用 `ExtractAllText` 方法檢索文本,解析此文本以識別表格,並可選擇將結構化資料儲存為 CSV 等格式。

如何在C#中處理包含表格的掃描版PDF檔案?

對於掃描的 PDF 文件,IronPDF 可以利用 OCR(光學字元辨識)將表格影像轉換為文本,然後解析文字以提取表格資料。

IronPDF能否將PDF文件轉換為其他格式以便更輕鬆地提取表格?

是的,IronPDF 可以將 PDF 轉換為 HTML,從而允許開發人員使用 HTML 解析技術來簡化表格提取。

IronPDF 是否適用於從複雜的 PDF 表格中提取數據?

IronPDF 提供 OCR 和基於座標的文字擷取等進階功能,可用於處理複雜的表格佈局,包括合併儲存格或不一致分隔符號的表格佈局。

如何將 IronPDF 整合到 .NET Core 應用程式中?

IronPDF 與 .NET Core 應用程式相容。您可以透過 Visual Studio 中的 NuGet 套件管理器安裝庫來整合它。

在 C# 中使用 IronPDF 進行 PDF 處理有哪些好處?

IronPDF 提供了一系列功能,用於建立、編輯和提取 PDF 中的數據,包括支援 OCR 和轉換為各種格式,使其成為 .NET 開發人員的強大工具。

從 PDF 文件中提取表格資料時,常見的挑戰有哪些?

挑戰包括處理複雜的表格佈局,例如合併的單元格、嵌入為圖像的表格以及不一致的分隔符,這可能需要高級解析策略或 OCR。

我該如何開始使用 IronPDF 進行 PDF 處理?

首先,透過 NuGet 套件管理器安裝 IronPDF 庫,或從 IronPDF 網站下載安裝。此設定對於在 C# 專案中使用其 PDF 處理功能至關重要。

使用 IronPDF 需要許可證嗎?

IronPDF 可免費用於開發用途,但商業部署需要許可證才能移除浮水印。我們提供免費試用許可證,方便您測試其全部功能。

IronPDF 在從 PDF 中提取表格時是否相容於 .NET 10?

是的。 IronPDF 支援 .NET 10(以及 .NET 9、8、7、6、Core、Standard 和 Framework),因此所有表格提取功能在 .NET 10 應用程式中無需修改即可運行。

柯蒂斯·週
技術撰稿人

Curtis Chau擁有卡爾頓大學電腦科學學士學位,專長於前端開發,精通Node.js、TypeScript、JavaScript和React。他熱衷於打造直覺美觀的使用者介面,喜歡使用現代框架,並擅長撰寫結構清晰、視覺效果出色的使用者手冊。

除了開發工作之外,柯蒂斯對物聯網 (IoT) 也抱有濃厚的興趣,致力於探索硬體和軟體整合的創新方法。閒暇時,他喜歡玩遊戲和製作 Discord 機器人,將他對科技的熱愛與創造力結合。