PDF 文件是通过 Internet 交换文档的标准格式。发票和产品指南等文档通常以 PDF 的形式共享。在某些情况下,您可能有多个包含表格数据的发票,您需要进一步提取和处理这些数据。以编程方式提取这些数据会更有效。为此,本文将教您如何使用 C++ 从 PDF 表中提取数据。
用于从 PDF 文件中的表中提取数据的 C++ API
Aspose.PDF for C++ 是一个 C++ 库,允许您创建、阅读和更新 PDF 文件。此外,API 支持从 PDF 文件中的表格中提取数据。您可以通过 NuGet 安装 API,也可以直接从 下载 部分下载。
PM> Install-Package Aspose.PDF.Cpp
使用 C++ 从 PDF 表中提取数据
以下是从 PDF 表中提取数据的步骤。
- 使用 Document 类加载 PDF 文档。
- 使用 Document->getPages() 方法遍历文档的页面。
- 在每次迭代中,创建一个 TableAbsorber 类的实例,并使用 TableAbsorber->Visit(System::SharedPtr) 指定用于提取表格的页面页) 方法。
- 使用 TableAbsorber->getTableList() 方法获取表并对其进行迭代。
- 对于每个 AbsorbedTable,使用 AbsorbedTable->getRowList() 方法遍历行。
- 对于每个 AbsorbedRow,使用 AbsorbedRow->getCellList() 方法遍历单元格。
- 使用 AbsorbedCell->getTextFragments() 方法为每个 AbsorbedCell 获取 TextFragmentCollection 并循环遍历它。
- 使用 TextFragment->getSegments() 方法为每个 TextFragment 获取 TextSegmentCollection 并循环遍历它。
- 从每个 TextSegment 中检索文本并打印。
以下示例代码展示了如何使用 C++ 从 PDF 表中提取数据。
// 加载 PDF 文档
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Table_input3.pdf");
// 遍历文档的页面
for (auto page : pdfDocument->get_Pages())
{
// 创建 TableAbsorber 类的实例
auto absorber = MakeObject<TableAbsorber>();
absorber->Visit(page);
// 遍历表
for (auto table : absorber->get_TableList())
{
Console::WriteLine(u"Table");
// 遍历行
for (auto row : table->get_RowList())
{
// 遍历单元格
for (auto cell : row->get_CellList())
{
// 遍历文本片段
for (auto fragment : cell->get_TextFragments())
{
String string = u"";
// 遍历文本段
for (auto seg : fragment->get_Segments())
{
// 获取文本
string = String::Concat(string, seg->get_Text());
}
// 打印文本
Console::WriteLine(string);
}
}
Console::WriteLine();
}
}
}
从 PDF 页面特定区域的表中提取数据
要从 PDF 页面特定区域的表格中提取数据,请按照以下步骤操作。
- 使用 Document 类加载 PDF 文档。
- 使用 Document->getPages()->idxget(int32t index) 方法检索包含表格的页面。
- 循环注释并获取方形注释。
- 创建 TableAbsorber 类的实例,并使用 TableAbsorber->Visit(System::SharedPtr) 指定用于提取表格的页面页) 方法。
- 使用 TableAbsorber->getTableList() 方法获取表并对其进行迭代。
- 如果表在区域中,请执行以下步骤:
- 使用 AbsorbedTable->getRowList() 方法遍历 AbsorbedTable 的行。
- 对于每个 AbsorbedRow,使用 AbsorbedRow->getCellList() 方法遍历单元格。
- 使用 AbsorbedCell->getTextFragments() 方法为每个 AbsorbedCell 获取 TextFragmentCollection 并循环遍历它。
- 使用 TextFragment->getSegments() 方法为每个 TextFragment 获取 TextSegmentCollection 并循环遍历它。
- 从每个 TextSegment 中检索文本并打印它。
以下示例代码演示了如何使用 C++ 从 PDF 页面特定区域的表格中提取数据。
// 加载 PDF 文档
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Table_input4.pdf");
// 获取文档的第一页
auto page = pdfDocument->get_Pages()->idx_get(1);
// 遍历页面上的注解
for (auto annotation : page->get_Annotations())
{
// 检查注释类型
if (annotation->get_AnnotationType() == Annotations::AnnotationType::Square)
{
System::SharedPtr<SquareAnnotation> squareAnnotation = DynamicCast<SquareAnnotation>(annotation);
// 创建 TableAbsorber 类的实例
auto absorber = MakeObject<TableAbsorber>();
absorber->Visit(page);
// 遍历表
for (auto table : absorber->get_TableList())
{
// 检查表是否在区域中
if ((squareAnnotation->get_Rect()->get_LLX() < table->get_Rectangle()->get_LLX()) &&
(squareAnnotation->get_Rect()->get_LLY() < table->get_Rectangle()->get_LLY()) &&
(squareAnnotation->get_Rect()->get_URX() > table->get_Rectangle()->get_URX()) &&
(squareAnnotation->get_Rect()->get_URY() > table->get_Rectangle()->get_URY())
)
{
// 遍历行
for (auto row : table->get_RowList())
{
// 遍历单元格
for (auto cell : row->get_CellList())
{
// 遍历文本片段
for (auto fragment : cell->get_TextFragments())
{
String string = u"";
// 遍历文本段
for (auto seg : fragment->get_Segments())
{
// 获取文本
string = String::Concat(string, seg->get_Text());
}
// 打印文本
Console::WriteLine(string);
}
}
Console::WriteLine();
}
}
}
break;
}
}
获得免费许可证
为了在没有评估限制的情况下试用 API,您可以申请 免费的临时许可证。
结论
在本文中,您学习了如何使用 C++ 从 PDF 表中提取数据。此外,您还学习了如何从 PDF 页面特定区域的表格中提取数据。 Aspose.PDF for C++ API 为处理 PDF 文件提供了许多附加功能。您可以通过访问 官方文档 来详细探索 API。如有任何问题,请随时通过我们的 免费支持论坛 与我们联系。