PDF アノテーションの操作
PDF アノテーションの操作
C++ 用 Aspose.PDF FOSS の PDF アノテーションは、Annotation 基底クラスとその具体的なサブタイプ(TextAnnotation、LinkAnnotation、HighlightAnnotation、FreeTextAnnotation、CircleAnnotation、WatermarkAnnotation、WidgetAnnotation など)で表現されます。各ページは Page.Annotations() を通じてアノテーションを公開し、AnnotationCollection を返します。本ガイドでは、ページへのアノテーションの追加、イテレーションと削除、既存ドキュメントからのアノテーションの読み取り、リンクアクションの添付、外観のカスタマイズ、そしてアノテーションのフラッティングについて説明します。
ページへのアノテーションの追加
具体的なアノテーションインスタンスを作成し、Rectangle で位置を設定し、AnnotationCollection.Add() を使ってページのコレクションに追加します。TextAnnotation は、ページ上の点に固定された付箋スタイルのコメントを表します:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
#include <aspose/pdf/rectangle.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& page = doc.Pages()[1];
Aspose::Pdf::Annotations::TextAnnotation note(doc);
note.Rect(Aspose::Pdf::Rectangle(100.0, 700.0, 200.0, 720.0, false));
note.Contents("Reviewed and approved");
page.Annotations().Add(note);
doc.Save("annotated.pdf");
}Annotation.Contents() / Contents(value) はノートテキストの取得と設定を行い、Annotation.Rect() / Rect(value) はページ上でアノテーションの位置を決定します。
アノテーションのイテレーションと削除
AnnotationCollection はカウント、インデックスアクセス、メンバーシップのチェック、値またはインデックスによる削除をサポートします:
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& annotations = doc.Pages()[1].Annotations();
std::cout << "Annotation count: " << annotations.Count() << "\n";
for (int i = 0; i < annotations.Count(); ++i) {
std::cout << "Contents: " << annotations[i].Contents() << "\n";
}
if (annotations.Count() > 0) {
annotations.Delete(0); // remove by index
}
annotations.Clear(); // remove everything
}AnnotationCollection.Contains(annotation) と Remove(annotation) は特定のアノテーション参照に対して動作します;Delete(index) は位置で削除し、Delete(annotation) はインデックスを必要とせず特定のアノテーションを削除します。IsReadOnly() はコレクションが変更可能かどうかを報告します。
既存のドキュメントからアノテーションを読み取る
ドキュメントがロードされると、アノテーションはすでに設定されており、何も追加せずに検査できます。Annotation.AnnotationType() はサブタイプ(AnnotationType::Text、AnnotationType::Highlight、AnnotationType::Link、AnnotationType::FreeText、AnnotationType::FileAttachment、AnnotationType::Watermark、その他)を報告します:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/annotation_type.hpp>
int main() {
Aspose::Pdf::Document doc("annotated.pdf");
auto& annotations = doc.Pages()[1].Annotations();
for (int i = 0; i < annotations.Count(); ++i) {
auto& a = annotations[i];
if (a.AnnotationType() == Aspose::Pdf::Annotations::AnnotationType::Text) {
std::cout << "Note: " << a.Contents() << "\n";
}
}
}アノテーションの順序とサブタイプは保存/再読み込みの往復で保持されるため、ドキュメントを読み込んだ後に Annotations() をインデックス付けするコードは、ファイルが書き込まれたときと同じシーケンスを見ることができます。
リンクアノテーションとアクション
LinkAnnotation はページにクリック可能な領域を付加し、アクティブ化されたときに PdfAction をディスパッチします。NamedAction は事前定義されたナビゲーションターゲットへジャンプし、JavascriptAction は ECMAScript 文字列を実行し、SubmitFormAction は FileSpecification を介して URL にフォームデータを投稿します:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/link_annotation.hpp>
#include <aspose/pdf/annotations/named_action.hpp>
#include <aspose/pdf/annotations/predefined_action.hpp>
#include <aspose/pdf/rectangle.hpp>
int main() {
Aspose::Pdf::Document doc;
auto page = doc.Pages().Add();
Aspose::Pdf::Annotations::LinkAnnotation link(
page, Aspose::Pdf::Rectangle(0.0, 0.0, 100.0, 20.0, false));
link.Action(Aspose::Pdf::Annotations::NamedAction(
Aspose::Pdf::Annotations::PredefinedAction::LastPage));
page.Annotations().Add(link);
doc.Save("linked.pdf");
}LinkAnnotation.Action(value) は任意の PdfAction サブタイプを受け取り内部でクローンするため、アノテーションはアクションの独自コピーを保持します。LinkAnnotation.Destination() / Destination(value) はアクションの代わりに明示的なナビゲーションターゲットを設定し、Highlighting() / Highlighting(value) はリンクがクリックされたときに表示されるビジュアルフィードバックを制御します。
アノテーションの外観:枠線、フラグ、カラー
すべてのAnnotationは、Border、AnnotationFlagsのビットフィールド、そして外観を描画するために使用されるColorを公開します:
#include <aspose/pdf/annotations/border_style.hpp>
#include <aspose/pdf/annotations/annotation_flags.hpp>
#include <aspose/pdf/color.hpp>
// 'note' is an existing Annotation reference, e.g. from AnnotationCollection.
note.Border().Width(2);
note.Border().Style(Aspose::Pdf::Annotations::BorderStyle::Dashed);
note.Flags(Aspose::Pdf::Annotations::AnnotationFlags::Print);
note.Color(Aspose::Pdf::Color::Red());Border.Style()はBorderStyle::Solid、Dashed、Beveled、Inset、またはUnderlineを受け入れます。Border.Effect()はさらに、BorderEffect::Cloudyアウトラインをサポートし、EffectIntensity()がその強さを制御します。AnnotationFlagsはビットフィールドです — Print、NoZoom、ReadOnly、LockedContentsなどの値を組み合わせて、表示内容を変更せずにビューア内でアノテーションの動作を制御します。
アノテーションのフラット化
単一のアノテーションは、Annotation.Flatten()を直接呼び出すことでフラット化(ページコンテンツにマージされ、インタラクティブでなくなる)できます:
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("annotated.pdf");
auto& annotations = doc.Pages()[1].Annotations();
for (int i = 0; i < annotations.Count(); ++i) {
annotations[i].Flatten();
}
doc.Save("flattened.pdf");
}文書全体のアノテーション操作では、PdfAnnotationEditorはAPI全体で使用されている共通のFacadeパターンに従います:BindPdf()でソース文書をバインドし、1つ以上のアノテーション操作を適用し、最後にSave()で結果を書き出します:
#include <aspose/pdf/facades/pdf_annotation_editor.hpp>
int main() {
Aspose::Pdf::Facades::PdfAnnotationEditor editor;
editor.BindPdf("annotated.pdf");
editor.FlatteningAnnotations();
editor.Save("flattened.pdf");
}PdfAnnotationEditor.DeleteAnnotations()はバインドされた文書からすべてのアノテーションを削除します;DeleteAnnotations(annotType)は削除を単一のAnnotationTypeに限定します。ImportAnnotationsFromXfdf(xfdfFile)とImportAnnotationsFromFdf(fdfFile)は他のPDFビューアからエクスポートされたアノテーションデータを読み込みます。
ヒントとベストプラクティス
- 新しく作成したアノテーションは、
Document.Save()を呼び出す前に必ずPage.Annotations()に追加してください — コレクションに追加されていないアノテーションは出力ファイルに書き込まれません。 - アノテーションがまだ存在しているか確信がない場合は、
AnnotationCollection.Contains(annotation)を使用してからRemove()を呼び出してください;Remove()は、アノテーションが存在しないときに例外を投げる代わりにfalseを返します。 - 信頼できない、またはサードパーティの PDF ファイルからロードされたアノテーションを反復処理する際、サブタイプの挙動に対してキャストや分岐を行う前に
Annotation.AnnotationType()を確認してください。 - 文書をアーカイブする前に
Annotation.Flatten()(ドキュメント全体の場合はPdfAnnotationEditor.FlatteningAnnotations())でアノテーションをフラット化し、他のツールのレビューアがあなたが作成した外観と同じものを確認できるようにします。 AnnotationFlagsはビットフィールドです — フラグを列挙型の基となる整数値と組み合わせて使用し、同時に複数のフラグが有効になる可能性があることを前提にしてください。
一般的な問題
| 問題 | 原因 | 修正 |
|---|---|---|
| 保存後に注釈が表示されない | 注釈は構築されましたが、Page.Annotations() に追加されませんでした | doc.Save() の前に page.Annotations().Add(annotation) を呼び出す |
Remove() は false を返します | 渡された注釈参照が現在コレクション内のエントリと一致しません | 最初に Contains() を使用するか、Delete(index) でインデックス指定で削除してください |
| リロード後に注釈タイプが間違っています | コードは AnnotationType() を確認せずに特定のサブタイプを前提としています | オブジェクトを特定のサブタイプとして扱う前に、Annotation.AnnotationType() で分岐してください |
| 割り当て後にリンクアクションが未設定のように見えます | ローカル変数 PdfAction がスコープを抜けました;LinkAnnotation.Action() は元のオブジェクトではなく注釈のクローンコピーを返します | 元のローカル変数を保持するのではなく、link.Action() を通してアクションを再取得してください |
PdfAnnotationEditor 操作は効果がありません | BindPdf() が呼び出されなかったか、存在しないパスで呼び出されました | FlatteningAnnotations() または DeleteAnnotations() を呼び出す前に、BindPdf() が成功することを確認してください |
FAQ
PDF ページにコメント形式のアノテーションを追加するにはどうすればよいですか?
対象の Document を持つ TextAnnotation を作成し、その Rect() と Contents() を設定してから、保存前に page.Annotations() に追加します。
自分が見ている注釈の種類はどうやって確認できますか?
Annotation.AnnotationType() を呼び出すと、AnnotationType 列挙型の値が返されます。たとえば Text、Link、Highlight、FreeText、FileAttachment、または Watermark です。
1つの注釈が複数のフラグを持つことはできますか?
はい。AnnotationFlags はビットフィールドであり(Default、Invisible、Hidden、Print、NoZoom、ReadOnly、LockedContents など)、複数のフラグを1つの注釈に組み合わせることができます。
1つの注釈をフラット化することと、ドキュメント全体をフラット化することの違いは何ですか?
Annotation.Flatten() は単一の注釈をそのページのコンテンツにマージします。PdfAnnotationEditor.FlatteningAnnotations()(ページ範囲でオプション的にスコープ指定でき、AnnotationType は start、end、annotType を受け取るオーバーロードを介して指定できます)は、1回の呼び出しで結合されたドキュメント全体にわたってフラット化します。
ドキュメントから特定のタイプの注釈をすべて削除するにはどうすればいいですか?
PdfAnnotationEditor.BindPdf() でドキュメントをバインドし、DeleteAnnotations(annotType) を対象の AnnotationType で呼び出し、最後に結果を Save() します。
API Reference 概要
| クラス/メソッド | 説明 |
|---|---|
Annotation | すべての PDF アノテーションサブタイプの抽象基底クラス |
Annotation.Rect() / Rect(value) | annotation のバウンディング矩形を取得または設定します |
Annotation.Contents() / Contents(value) | アノテーションのテキストコンテンツを取得または設定します |
Annotation.AnnotationType() | このアノテーションの AnnotationType 列挙値を返します |
Annotation.Flags() / Flags(value) | 取得または設定する AnnotationFlags ビットフィールド |
Annotation.Border() / Border(value) | 注釈の Border を取得または設定します |
Annotation.Color() / Color(value) | アノテーションの表示 Color を取得または設定します |
Annotation.Flatten() | このアノテーションをページコンテンツにマージし、非インタラクティブにします |
AnnotationCollection | ページ上のアノテーションの順序付けられたコレクションで、Page.Annotations() によって返されます |
AnnotationCollection.Add(annotation) / Add(annotation, considerRotation) | コレクションにアノテーションを追加します |
AnnotationCollection.Count() | コレクション内のアノテーション数を返します |
AnnotationCollection.Contains(annotation) | コレクションが指定されたアノテーションを保持しているかどうかを報告します |
AnnotationCollection.Remove(annotation) | 特定のアノテーションを削除します; 見つからない場合は false を返します |
AnnotationCollection.Delete(index) / Delete(annotation) | インデックスまたは参照でアノテーションを削除します |
AnnotationCollection.Clear() | コレクションからすべてのアノテーションを削除します |
TextAnnotation | 付箋スタイルのアノテーション(Open() と Icon()(TextIcon)) |
LinkAnnotation | クリック可能な領域が Action() / Action(value) を介して PdfAction を送出します |
LinkAnnotation.Destination() / Destination(value) | 明示的なナビゲーション ターゲットを取得または設定します。 |
HighlightAnnotation | テキストの一部にハイライト色を付けます |
FreeTextAnnotation | テキストのコールアウトを表示します; Justification()、DefaultAppearanceObject()、Callout()で設定されます |
CircleAnnotation | アノテーションの矩形内に楕円を描画します |
WatermarkAnnotation | オーバーレイアノテーションに Opacity() / Opacity(value) アクセサを使用します |
WidgetAnnotation | フォームフィールドの外観注釈(ReadOnly()、Required()、Exportable()、DefaultAppearance()) |
NamedAction | 事前定義されたナビゲーションアクション(PredefinedAction 列挙型)を LinkAnnotation に添付可能 |
JavascriptAction | Script() / GetECMAScriptString() を介して ECMAScript 文字列を実行 |
SubmitFormAction | Url() / Url(value) を介して FileSpecification URL にフォームデータを POST |
Border | 注釈の境界線は Width()、Style()(BorderStyle)、Effect()(BorderEffect)です |
PdfAnnotationEditor | 文書全体の注釈のインポート、変更、フラット化、削除を行うファサード |
PdfAnnotationEditor.FlatteningAnnotations() | 結合された文書全体の注釈をフラット化します |
PdfAnnotationEditor.DeleteAnnotations(annotType) | 指定された AnnotationType のすべての注釈を削除します |
PdfAnnotationEditor.ImportAnnotationsFromXfdf(xfdfFile) | XFDF ファイルから注釈をインポートします |