PDFファイルは、インターネットを介してドキュメントを交換するための標準形式です。請求書や製品ガイドなどのドキュメントは通常、PDF形式で共有されます。表形式のデータを含む複数の請求書があり、さらに抽出して処理する必要がある場合があります。プログラムでこのデータを抽出する方が効率的です。そのために、この記事では、C++を使用してPDFテーブルからデータを抽出する方法を説明します。
PDFファイルのテーブルからデータを抽出するためのC++API
Aspose.PDF for C++は、PDFファイルを作成、読み取り、更新できるC++ライブラリです。さらに、APIはPDFファイルのテーブルからのデータの抽出をサポートしています。 APIは、NuGetからインストールするか、ダウンロードセクションから直接ダウンロードできます。
PM> Install-Package Aspose.PDF.Cpp
C++を使用してPDFテーブルからデータを抽出する
以下は、PDFテーブルからデータを抽出する手順です。
- Documentクラスを使用してPDFドキュメントをロードします。
- Document->getPages()メソッドを使用して、ドキュメントのページを繰り返し処理します。
- 各反復で、TableAbsorberクラスのインスタンスを作成し、TableAbsorber->Visit(System::SharedPtr page)メソッド。
- TableAbsorber->get_TableList()メソッドを使用してテーブルを取得し、それらを反復処理します。
- AbsorbedTableごとに、AbsorbedTable->get_RowList()メソッドを使用して行を反復処理します。
- AbsorbedRowごとに、AbsorbedRow->get_CellList()メソッドを使用してセルを反復処理します。
- AbsorbedCell->get_TextFragments()メソッドを使用して、AbsorbedCellごとにTextFragmentCollectionを取得し、ループします。
- TextFragment->get_Segments()メソッドを使用して、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->get_Pages()->idx_get(int32_t index)メソッドを使用して、テーブルを含むページを取得します。
- 注釈をループして、正方形の注釈を取得します。
- TableAbsorberクラスのインスタンスを作成し、TableAbsorber->Visit(System::SharedPtr page)メソッド。
- TableAbsorber->get_TableList()メソッドを使用してテーブルを取得し、それらを反復処理します。
- テーブルがリージョン内にある場合は、次の手順を実行します。
- AbsorbedTable->get_RowList()メソッドを使用して、AbsorbedTableの行を反復処理します。
- AbsorbedRowごとに、AbsorbedRow->get_CellList()メソッドを使用してセルを反復処理します。
- AbsorbedCell->get_TextFragments()メソッドを使用して、AbsorbedCellごとにTextFragmentCollectionを取得し、ループします。
- TextFragment->get_Segments()メソッドを使用して、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の詳細を調べることができます。ご不明な点がございましたら、無料サポートフォーラムまでお気軽にお問い合わせください。