Aspose.PDF FOSS for C++ で API ファサードを使用する方法
Aspose.PDF FOSS for C++ は、Aspose::Pdf::Facades 名前空間内で、上位レベルのファサードおよびエディタークラスのセットをまとめています — それらの中には PdfExtractor, PdfBookmarkEditor, PdfContentEditor, PdfAnnotationEditor, FormEditor, PdfFileEditor, PdfConverter が含まれます — 。各クラスはコア Document API の上に単一の文書保守タスクをラップし、ページやオブジェクトの走査を自分で実装しなくても、コンテンツの抽出、ブックマークの編集、フォームフィールドへの入力が可能です。このガイドは、既存の PDF から埋め込みファイル添付、ページテキスト、埋め込み画像を取得するために使用されるファサード PdfExtractor に焦点を当てます。
ステップバイステップガイド
ステップ 1: パッケージをインストールする
CMake のサブディレクトリとして Aspose.PDF FOSS for C++ を追加し、スタティックライブラリターゲットをリンクします:
git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.gitadd_subdirectory(Aspose.PDF-FOSS-for-Cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)ファサードコードを書く前に、ツールチェーンとリンクステップが正しく解決されていることを確認してください:
cmake -S . -B build
cmake --build buildC++20 コンパイラでクリーンビルドを行うと、aspose_pdf_foss が your_app にリンクされていることが確認できます。
ステップ 2: 必要なクラスをインポートする
PdfExtractor は aspose/pdf/facades/ の下にあり、コア名前空間からの Document と同じ場所にあります:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/facades/pdf_extractor.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Facades;ステップ 3: ドキュメントを PdfExtractor にバインドする
すべてのファサードクラスは共通の Facade 基底クラスから派生し、構築後にドキュメントにアタッチするための BindPdf(srcFile) と BindPdf(srcDoc) を公開します。PdfExtractor はコンストラクタで既に開かれた Document を直接受け取ることもでき、これが本ガイド全体で使用されているパターンです:
Document doc("input.pdf");
PdfExtractor extractor(doc);ステップ 4: 埋め込みファイル添付を抽出する
まず Document::EmbeddedFiles() を確認し、次に GetAttachNames() で添付ファイル名を読み取り、GetAttachment() を使って添付ファイルのバイトをディスクに書き出します:
#include <iostream>
if (doc.EmbeddedFiles().Count() > 0) {
std::vector<std::string> names = extractor.GetAttachNames();
for (const auto& name : names) {
std::cout << "Attachment: " << name << "\n";
}
// Writes the bytes of the first attachment to disk
extractor.GetAttachment("extracted_attachment.bin");
}ステップ 5: 各ページからテキストを抽出する
ExtractText() に続いて GetText() を使用すると、ドキュメント全体のテキストを単一ファイルに書き出します:
extractor.ExtractText();
extractor.GetText("extracted_text.txt");代わりにページごとに 1 つのファイルを取得するには、StartPage() / EndPage() でページ範囲を設定し、次にループで HasNextPageText() / GetNextPageText() を実行し、各呼び出しに固有の出力パスを与えます:
extractor.StartPage(1);
extractor.EndPage(doc.Pages().Count());
int pageNumber = extractor.StartPage();
while (extractor.HasNextPageText()) {
std::string outputFile = "page_" + std::to_string(pageNumber) + ".txt";
extractor.GetNextPageText(outputFile);
++pageNumber;
}ステップ 6: 埋め込み画像を抽出
ExtractImage() が画像カーソルを初期化します;HasNextImage() / GetNextImage() は画像を 1 つずつ順に処理し、渡したパスに書き込みます:
extractor.ExtractImage();
int imageIndex = 1;
while (extractor.HasNextImage()) {
std::string outputFile = "extracted_image_" + std::to_string(imageIndex);
if (extractor.GetNextImage(outputFile)) {
++imageIndex;
}
}一般的な問題と対策
GetAttachNames() 空のベクトルを返します。 ソースPDFには埋め込みファイルがありません。確認してください doc.EmbeddedFiles().Count() 添付メソッドを呼び出す前に PdfExtractor 添付ファイルがまったく存在しなかった文書から抽出しようとしないように。
ページテキストループが本体に入ることはありません。 HasNextPageText() returns false すぐに、もし StartPage() / EndPage() 設定されていなかった場合、あるいは文書の実際のページ数を超える範囲に設定されていた場合です。範囲は明示的に次から設定してください doc.Pages().Count() チェックする前に HasNextPageText().
GetNextImage() returns false 最初の呼び出し時に。 ExtractImage() イメージカーソルをプライムするために、チェックする前に一度呼び出す必要があります。 HasNextImage() または呼び出す GetNextImage(). 呼び出す GetNextImage() 事前の ExtractImage() 呼び出しは呼び出し側の観点から未定義です — 常に呼び出す ExtractImage() 最初に。
抽出された画像またはページテキストファイルはすべて、前のものに上書きされます。 GetNextImage() and GetNextPageText() それぞれが文字通りの出力パスを受け取ります。ファサードは一意のファイル名を自動で生成しません。ステップ5と6に示すように、イテレーションごとに別々のパスを作成してください(例として、インクリメントするカウンタを付加する方法があります)。
リンクエラー: 未定義の参照先 aspose_pdf_foss シンボル。 Confirm add_subdirectory() クローンされたリポジトリのルートを指し示し、かつ target_link_libraries() 名前を付ける aspose_pdf_foss ターゲットを正確に指定し、C++20 標準を設定した状態で your_app.
よくある質問
ファサード API とコアドキュメント API の違いは何ですか?
コア Document API(Document、PageCollection、Annotation など)は PDF オブジェクトモデルを直接公開します。PdfExtractor のようなファサードクラスはその上に位置し、特定のマルチステップタスク(コンテンツ抽出、ブックマーク編集、フォームフィールド入力)を、より狭く目的別に設計されたインターフェースの背後にパッケージ化します。
PdfExtractor を使用してコンテンツを抽出するのと同じ方法で、ブックマークを編集したりフォームフィールドに入力したりできますか?
はい。PdfBookmarkEditor(CreateBookmarks()、ModifyBookmarks()、ExtractBookmarks()、DeleteBookmarks() を含む) と FormEditor(AddField()、RemoveField()、SetFieldAttribute() を含む)は同じ Aspose::Pdf::Facades 名前空間にあり、ステップ2とステップ3に示されたのと同じ include/construct パターンに従います — それぞれが文書の異なる部分で動作するだけです。
PdfExtractor はパスワード保護された PDF を読み取れますか?
抽出メソッドを呼び出す前にパスワードを設定してください:
extractor.Password("owner-or-user-password");PdfExtractor::Password() は単純な読み書きプロパティなので、ExtractText()、ExtractImage()、または添付メソッドより先に設定する必要があります。
PDF に抽出すべきテキスト、画像、または添付ファイルがない場合はどうなりますか?
例外は投げられません。GetAttachNames() は空のベクターを返し、HasNextPageText() / HasNextImage() は最初のチェックで false を返すため、対応するループ本体は実行されません。
特定のファサードクラスに対してどのヘッダーをインクルードすればよいですか?
各ファサードクラスは aspose/pdf/facades/ 配下にクラス名と一致するヘッダーを持ちます:PdfExtractor 用の pdf_extractor.hpp、PdfBookmarkEditor 用の pdf_bookmark_editor.hpp、FormEditor 用の form_editor.hpp、そして Bookmark / Bookmarks 値タイプ用の bookmark.hpp です。