PDFからテーブルのデータを抽出する

プログラムでPDFからテーブルを抽出する

PDFは文書交換の最も一般的な形式であるため、分析が必要な複数のデータセットを含む文書を考えてみましょう。この記事では、PDFからテーブルを抽出する方法について説明します。

Aspose.PDF for C++ は、開発者がPDFドキュメント内のテーブルからデータを抽出するために必要なツールを提供します。

この例は、PDFファイル内のテーブルから表形式のデータを取得するためのTableAbsorberクラスの使用を示しています。

次の例は、すべてのページからのテーブル抽出を示しています:

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オプションオブジェクトをインスタンス化
    auto excelSave = MakeObject<ExcelSaveOptions>();
    excelSave->set_Format(ExcelSaveOptions::ExcelFormat::CSV);

    // 出力をXLS形式で保存
    document->Save(_dataDir + outfilename, excelSave);
    std::clog << __func__ << ": Finish" << std::endl;
}