从PDF中的表格提取数据

从PDF中以编程方式提取表格

由于PDF是交换文档的最常见格式,让我们考虑一个包含多个数据集的文档,这些数据集需要进行分析。在本文中,我们将描述如何从PDF中提取表格。

Aspose.PDF for C++ 为开发人员提供了从PDF文档中的表格中提取数据所需的工具。

此示例演示了使用 TableAbsorber 类从PDF文件中的表格中检索表格数据。

以下示例显示了从所有页面提取表格:

void ExtractTable() {
    std::clog << __func__ << ": Start" << std::endl;
    // 用于路径名的字符串
    String _dataDir("C:\\Samples\\Parsing\\");

    // 用于文件名的字符串
    String infilename("sample-table.pdf");

    auto document = MakeObject<Document>(_dataDir + infilename);
    auto absorber = MakeObject<TableAbsorber>();

    // 扫描页面
    for (auto page : document->get_Pages()) {
        absorber->Visit(page);
        for (auto table : absorber->get_TableList()) {
        std::cout << "Table" << std::endl;
        // 迭代行列表
        for (auto row : table->get_RowList()) {
            // 迭代单元格列表
            for (auto cell : row->get_CellList()) {
                String sb;
                for (auto fragment : cell->get_TextFragments()) {
                sb += fragment->get_Text();
                }
                std::cout << sb << "|";
            }
            std::cout << std::endl;
        }
        }
    }
    std::clog << __func__ << ": Finish" << std::endl;
}

提取 PDF 页面特定区域中的表格

每个吸收的表格都有 Rectangle 属性,用于描述页面上表格的位置。

因此,如果需要提取位于特定区域的表格,则必须使用特定坐标。

以下示例显示如何提取用方形注释标记的表格:

void ExtractMarkedTable()
{
    std::clog << __func__ << ": Start" << std::endl;
    // 路径名的字符串
    String _dataDir("C:\\Samples\\Parsing\\");

    // 文件名的字符串
    String infilename("sample-table.pdf");


    auto document = MakeObject<Document>(_dataDir + infilename);
    auto absorber = MakeObject<TableAbsorber>();

    auto page = document->get_Pages()->idx_get(1);
    auto sqa = MakeObject<Aspose::Pdf::Annotations::SquareAnnotation>(page, Rectangle::get_Trivial());
    auto annotationSelector = MakeObject<Aspose::Pdf::Annotations::AnnotationSelector>(sqa);


    auto list = annotationSelector->get_Selected();
    if (list->get_Count() == 0) {
        std::cerr << "Marked tables not found.." << std::endl;
        return;
    }

    auto squareAnnotation = System::DynamicCast<Aspose::Pdf::Annotations::SquareAnnotation>(list->idx_get(1));

    absorber->Visit(page);

    for (auto table : absorber->get_TableList())
    {
        auto isInRegion =
        (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());

        if (isInRegion)
        {
        for (auto row : table->get_RowList()) {
            // 遍历单元格列表
            for (auto cell : row->get_CellList()) {
                String sb;
                for (auto fragment : cell->get_TextFragments()) {
                sb += fragment->get_Text();
                }
                std::cout << sb << "|";
            }
            std::cout << std::endl;
        }
        }
    }
    std::clog << __func__ << ": Finish" << std::endl;
}

从 PDF 提取表格数据并存储到 CSV 文件

以下示例显示了如何提取表格并将其存储为 CSV 文件。要了解如何将 PDF 转换为 Excel 电子表格,请参阅将 PDF 转换为 Excel文章。

void ExtractTableSaveCSV()
{
    std::clog << __func__ << ": Start" << std::endl;
    // 路径名称的字符串
    String _dataDir("C:\\Samples\\Parsing\\");

    // 文件名的字符串
    String infilename("sample-table.pdf");
    String outfilename("PDFToXLS_out.csv");

    // 打开文档
    auto document = MakeObject<Document>(_dataDir + infilename);

    // 实例化 ExcelSave Option 对象
    auto excelSave = MakeObject<ExcelSaveOptions>();
    excelSave->set_Format(ExcelSaveOptions::ExcelFormat::CSV);

    // 以 XLS 格式保存输出
    document->Save(_dataDir + outfilename, excelSave);
    std::clog << __func__ << ": Finish" << std::endl;
}