PDF 已成为众多领域中使用最广泛的文档格式之一。在各种情况下,它用于生成数据以表格形式出现的发票。在这种情况下,您可能需要解析 PDF 以编程方式从表中读取数据。为此,本文介绍了如何使用 C# 从 PDF 表中提取数据。
C# API 从 PDF 中提取表格
为了从 PDF 文件中的表格中提取数据,我们将使用 Aspose.PDF for .NET。它是一个强大的 API,提供了广泛的 PDF 操作功能。您可以 下载 API 或使用 NuGet 安装它。
PM> Install-Package Aspose.PDF
在 C# 中从 PDF 表中提取数据
以下是使用 C# 从 PDF 中的表中提取数据的步骤。
- 使用 Document 类加载 PDF 文档。
- 使用 Document.Pages 集合循环浏览 PDF 中的页面。
- 在每次迭代中,初始化 TableAbsorber 对象并使用 TableAbsorber.Visit(Page) 方法访问所选页面。
- 在嵌套循环中,遍历 TableAbsorber.TableList 集合中的表列表。
- 对于集合中的每个 AbsorbedTable,遍历 AbsorbedTable.RowList 中的行集合。
- 对于集合中的每个 AbsorbedRow,遍历 AbsorbedRow.CellList 中的单元格集合。
- 最后,循环遍历每个 AbsorbedCell 的 TextFragments 集合并打印文本。
以下代码示例展示了如何在 C# 中从 PDF 表中提取文本。
// 加载源 PDF 文档
Aspose.Pdf.Document pdfDocument = new Aspose.Pdf.Document("sample.pdf");
// 循环浏览页面
foreach (var page in pdfDocument.Pages)
{
// 创建表格吸收器并访问页面
Aspose.Pdf.Text.TableAbsorber absorber = new Aspose.Pdf.Text.TableAbsorber();
absorber.Visit(page);
// 循环遍历每个吸收的表
foreach (AbsorbedTable table in absorber.TableList)
{
Console.WriteLine("Table");
// 循环遍历表中的每一行
foreach (AbsorbedRow row in table.RowList)
{
// 循环遍历行中的每个单元格
foreach (AbsorbedCell cell in row.CellList)
{
// 循环遍历文本片段
foreach (TextFragment fragment in cell.TextFragments)
{
var sb = new StringBuilder();
foreach (TextSegment seg in fragment.Segments)
sb.Append(seg.Text);
Console.Write($"{sb.ToString()}|");
}
}
Console.WriteLine();
}
}
}
从页面的特定区域提取表格
以下是使用 C# 从 PDF 中页面的特定部分提取表格的步骤。
- 使用 Document 类加载 PDF 文档。
- 从 Document.Pages 集合中选择所需的 Page。
- 提取页面的 Square 注释。
- 初始化 TableAbsorber 对象并使用 TableAbsorber.Visit(Page) 方法访问页面。
- 在嵌套循环中,遍历 TableAbsorber.TableList 集合中的表列表。
- 如果表在区域中,则执行以下步骤。
- 遍历 AbsorbedTable.RowList 中的行集合。
- 对于集合中的每个 AbsorbedRow,遍历 AbsorbedRow.CellList 中的单元格集合。
- 最后,循环遍历每个 AbsorbedCell 的 TextFragments 集合并打印文本。
以下代码示例展示了如何从 PDF 页面的特定区域提取表格。
// 加载源 PDF 文档
Aspose.Pdf.Document pdfDocument = new Aspose.Pdf.Document("sample.pdf");
// 选择页面并提取其方形注释
var page = pdfDocument.Pages[1];
var squareAnnotation =
page.Annotations.FirstOrDefault(ann => ann.AnnotationType == Annotations.AnnotationType.Square)
as Annotations.SquareAnnotation;
// 创建表格吸收器并访问页面
Aspose.Pdf.Text.TableAbsorber absorber = new Aspose.Pdf.Text.TableAbsorber();
absorber.Visit(page);
// 循环遍历列表中的每个吸收表
foreach (AbsorbedTable table in absorber.TableList)
{
var isInRegion = (squareAnnotation.Rect.LLX < table.Rectangle.LLX) &&
(squareAnnotation.Rect.LLY < table.Rectangle.LLY) &&
(squareAnnotation.Rect.URX > table.Rectangle.URX) &&
(squareAnnotation.Rect.URY > table.Rectangle.URY);
if (isInRegion)
{
// 循环遍历表格的每一行
foreach (AbsorbedRow row in table.RowList)
{
// 循环遍历行中的每个单元格
foreach (AbsorbedCell cell in row.CellList)
{
// 循环遍历文本片段并打印文本
foreach (TextFragment fragment in cell.TextFragments)
{
var sb = new StringBuilder();
foreach (TextSegment seg in fragment.Segments)
{
sb.Append(seg.Text);
}
var text = sb.ToString();
Console.Write($"{text}|");
}
}
Console.WriteLine();
}
}
}
获得免费许可证
您可以使用 临时许可证 使用 Aspose.PDF for .NET,而不受评估限制。
结论
在本文中,您学习了如何使用 C# 从 PDF 中的表中提取数据。此外,您还了解了如何从 PDF 页面的特定区域提取表格。您可以使用 文档 探索有关 C# PDF API 的更多信息。此外,您可以在我们的 论坛 上发布您的查询。