在生產環境中測試,無水印。
在任何需要的地方都能運行。
獲得 30 天的全功能產品。
在幾分鐘內上手運行。
試用產品期間完全訪問我們的支援工程團隊
在許多行業中,PDF 文件是共享結構化文檔(如報告、發票和數據表)的首選格式。 然而,由於 PDF 格式的特性,從 PDF 中提取數據,尤其是涉及到表格時,可能會很具挑戰性。 與結構化數據格式不同,PDF 主要是為演示而設計的,而不是用於數據提取。
然而,使用IronPDF,一個強大的 C# PDF .NET 函式庫,您可以輕鬆地直接從 PDF 中提取像表格這樣的結構化數據,並在您的 .NET 應用程式中處理它們。 本文將逐步引導您如何使用IronPDF從PDF文件中提取表格數據。
表格是一種方便的結構和顯示數據的方式,無論是進行庫存管理、數據輸入、記錄降雨量等數據。因此,可能也有很多原因需要從PDF文件中提取表格和表格數據。 一些最常見的使用案例包括:
PDF 檔案格式不具備以表格等結構格式儲存資料的原生功能。 我們今天範例中使用的表格是用 HTML 建立的,然後轉換為 PDF 格式。 表格以文本和線條的形式呈現,因此提取表格數據通常需要對內容進行一些解析和解讀,除非您使用 OCR 軟體,如IronOCR。
在我們探討IronPDF如何解決此任務之前,我們先來探索一個能夠處理PDF提取的在線工具。 要使用在線 PDF 工具從 PDF 文件中提取表格,請按照以下步驟操作:
導航至免費的線上 PDF 提取工具
上傳包含表格的 PDF 文件
今天,我們將使用Docsumo作為我們的在線 PDF 工具範例。 Docsumo 是一款線上 PDF 文件 AI,提供免費的 PDF 表格提取工具。
現在,點擊「上傳文件」按鈕以上傳您的 PDF 文件進行提取。 該工具將立即開始處理您的 PDF。
一旦Docsumo處理完PDF,便會顯示提取的表格。 然後,您可以對表結構進行調整,例如添加和刪除行。 在這裡,您可以將表格下載為 PDF、XLS、JSON 或文字。
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)
在此範例中,我們使用PdfDocument類載入了PDF文件,然後使用ExtractAllText()方法提取文件中的所有文本,最後在控制台上顯示文本。
從 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
在此範例中,我們遵循相同的步驟來載入 PDF 文件並提取文本。 然後,使用text.Split('\n'),我們將提取的文本根據換行符拆分成行,並將結果存儲在lines數組中。 接著使用 foreach
迴圈來遍歷陣列中的行,並使用 line.Split('\t') 進一步將行根據分隔符 '\t'(Tab 字元)分割成欄。 columns 陣列的下一部分,Where(col => !string.IsNullOrWhiteSpace(col)).ToArray() 會過濾掉由於多餘空格而可能產生的空列,然後將列添加到陣列中。
最後,我們透過基本的行列結構將文本寫入控制台輸出窗口。
現在我們已經介紹了如何從 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
正如您所見,我們已成功將 PDF 表格匯出為 CSV。首先,我們載入了包含表格的 PDF 並創建了一個新的 CSV 文件路徑。 在這之後,我們使用var tableData = ExtractTableDataFromPdf(pdfPath)這行來提取表格,其中調用了ExtractTableDataFromPdf()方法。 此方法提取包含表格的 PDF 頁面上的所有文本,並將其存儲在text變數中。
然後,我們將文本拆分為行和列。 最後,在返回此分割過程的結果後,我們調用方法static void WriteDataToCsv(),該方法將提取並分割的文本使用StreamWriter寫入我們的CSV文件。
在處理 PDF 表格時,遵循一些基本最佳實踐可以幫助確保最小化遇到任何錯誤或問題的機會。
IronPDF 提供不同的許可證,讓您在購買許可證之前親自試用 IronPDF 所提供的所有強大功能。
使用IronPDF從PDF中提取表格是一種自動化數據提取、促進分析和將文件轉換為更易於訪問格式的強大方法。 無論是處理簡單表格還是複雜、不規則的格式,IronPDF 提供了高效提取和處理表格數據所需的工具。
使用 IronPDF,您可以簡化工作流程,如自動化資料輸入、文件轉換和資料分析。 IronPDF 提供的靈活性和先進功能使其成為處理各種 PDF 任務的寶貴工具。