在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
在許多行業中,PDF 文件是共享結構化文檔(如報告、發票和數據表)的首選格式。 然而,由於 PDF 格式的特性,從 PDF 中提取數據,尤其是涉及到表格時,可能會很具挑戰性。 與結構化數據格式不同,PDF 主要是為演示而設計的,而不是用於數據提取。
然而,隨著IronPDF使用強大的 C# PDF .NET 函式庫,您可以輕鬆地從 PDF 中提取結構化數據,如表格,並在您的 .NET 應用程式中進行處理。 本文將逐步引導您如何使用IronPDF從PDF文件中提取表格數據。
表格是一種方便的結構和顯示數據的方式,無論是進行庫存管理、數據輸入、記錄降雨量等數據。因此,可能也有很多原因需要從PDF文件中提取表格和表格數據。 一些最常見的使用案例包括:
PDF 檔案格式不具備以表格等結構格式儲存資料的原生功能。 我們今天示例中使用的表格是用 HTML 創建的,然後被轉換為 PDF 格式. 表格會被顯示為文字和線條,因此,提取表格數據通常需要一些解析和解釋內容,除非您使用像 IronOCR 這樣的 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)
在此範例中,我們已使用該PDF文件加载PdfDocumentclass,然後使用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' 作為分隔符。 接下來是欄位陣列的一部分,Where(列 =>!string.IsNullOrWhiteSpace(列)).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) line,其名為 ExtractTableDataFromPdf() 方法。 此方法提取位於表格所在的 PDF 頁面上的所有文本,並將其存儲在 text** 變量中。
然後,我們將文本拆分為行和列。 最後,在從此分割過程返回結果後,我們調用方法 static void WriteDataToCsv()將提取和拆分後的文本寫入我們的CSV文件,使用StreamWriter**。
在處理 PDF 表格時,遵循一些基本最佳實踐可以幫助確保最小化遇到任何錯誤或問題的機會。
IronPDF 提供不同的授權提供,可以讓您在購買授權之前親自嘗試 IronPDF 所提供的所有強大功能。
使用從 PDF 中提取表格 IronPDF是一種強大的方法,可以自動化數據提取、促進分析,並將文件轉換為更易於訪問的格式。 無論是處理簡單表格還是複雜、不規則的格式,IronPDF 提供了高效提取和處理表格數據所需的工具。
使用 IronPDF,您可以簡化工作流程,如自動化資料輸入、文件轉換和資料分析。 IronPDF 提供的靈活性和先進功能使其成為處理各種 PDF 任務的寶貴工具。