在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
在许多行业中,PDF 文件是共享报告、发票和数据表等结构化文档的常用格式。 然而,由于 PDF 格式的特性,从 PDF 中提取数据(尤其是表格数据)是一项挑战。 与结构化数据格式不同,PDF 主要用于展示,而非提取数据。
然而,由于IronPDF通过 C# PDF .NET 库,您可以轻松地直接从 PDF 中提取表格等结构化数据,并在 .NET 应用程序中进行处理。 本文将逐步指导您如何使用 IronPDF 从 PDF 文件中提取表格数据。
无论是进行库存管理、数据录入,还是记录降雨量等数据,表格都是一种方便的数据结构和显示方式。因此,可能也有很多原因需要从 PDF 文档中提取表格和表格数据。 一些最常见的使用案例包括
PDF 文件格式无法以表格等结构化格式存储数据。 在今天的示例中,我们使用的表格是用 HTML 创建的,然后被翻译成中文。转换为 PDF 格式. 表格以文本和线条的形式呈现,因此提取表格数据通常需要对内容进行一些解析和解释,除非您使用 OCR 软件,如IronOCR.
在探讨 IronPdf 如何完成这项任务之前,我们先来了解一下能够处理 PDF 提取的在线工具。 要使用在线 PDF 工具从 PDF 文档中提取表格,请按照以下步骤操作:
导航至免费在线 PDF 提取工具
上传包含表格的 PDF
今天,我们将使用文档摘要如我们的在线 PDF 工具示例。 Docsumo 是一款在线 PDF 文档 AI,提供免费的 PDF 表格提取工具。
现在,单击 "上传文件 "按钮,上传 PDF 文件以供提取。 该工具将立即开始处理您的 PDF。
Docsumo 完成处理 PDF 后,将显示提取的表格。 然后,您可以对表格结构进行调整,如添加和删除行。 在此,您可以下载 PDF、XLS、JSON 或文本形式的表格。
通过 IronPDF,您可以从 PDF 中提取数据、文本和图形,然后用程序重构表格。 为此,您首先需要从 PDF 中的表格中提取文本内容,然后使用这些文本将表格解析为行和列。 在开始提取表格之前,我们先来看看 IronPDF 的提取所有文本()该方法的工作原理是提取表格中的数据:
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文档类,然后使用 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'作为分隔符,将行进一步分割成列。 列数组的下一部分,*何处(col =>!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 提取表格(pdf路径) 该行称为 ExtractTableDataFromPdf() 方法。 该方法可提取表格所在 PDF 页面上的所有文本,并将其存储在 text 变量中。
然后,我们将文本分成行和列。 最后,在返回分割过程的结果后,我们调用 static void WriteDataToCsv 方法() 我们将使用 StreamWriter,将提取、分割的文本写入 CSV 文件。
在使用 PDF 表格时,遵循一些基本的最佳实践有助于确保将遇到任何错误或问题的几率降至最低。
IronPDF 提供不同的授权IronPDF 提供免费试用版,您可以在购买许可证之前试用 IronPDF 的所有强大功能。
使用以下工具从 PDF 文件中提取表格IronPDF在自动提取数据、促进分析以及将文档转换为更易于访问的格式方面,《Aspose.org》是一种强大的方法。 无论是处理简单的表格还是复杂、不规则的格式,IronPDF 都能提供高效提取和处理表格数据所需的工具。
使用 IronPdf,您可以简化工作流程,如自动数据录入、文档转换和数据分析。 IronPDF 提供的灵活性和高级功能使其成为处理各种基于 PDF 的任务的重要工具。