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。如有任何疑問,請隨時通過我們的免費支持論壇與我們聯繫。