アノテーション編集
PDF Oxide は PdfPage オブジェクトを通じてアノテーションへの DOM レベルのアクセスを提供します。 You can read existing annotations, add new ones (links, highlights, sticky notes), modify annotation properties, remove annotations, and flatten them into page content.
アノテーションの取得
全アノテーションの一覧
from pdf_oxide import PdfDocument
doc = PdfDocument("annotated.pdf")
page = doc.page(0)
for ann in page.annotations():
print(f"Type: {ann.subtype}")
print(f"Rect: {ann.rect}")
if ann.contents:
print(f"Contents: {ann.contents}")
import { WasmPdfDocument } from "pdf-oxide-wasm";
const doc = new WasmPdfDocument(bytes);
const annotations = doc.getAnnotations(0);
for (const ann of annotations) {
console.log(`Type: ${ann.subtype}`);
console.log(`Rect: ${JSON.stringify(ann.rect)}`);
if (ann.contents) {
console.log(`Contents: ${ann.contents}`);
}
}
doc.free();
use pdf_oxide::api::Pdf;
let mut doc = Pdf::open("annotated.pdf")?;
let page = doc.page(0)?;
for ann in page.annotations() {
println!("Type: {:?}", ann.subtype());
println!("Rect: {:?}", ann.rect());
if let Some(contents) = ann.contents() {
println!("Contents: {}", contents);
}
if let Some(color) = ann.color() {
println!("Color: {:?}", color);
}
}
インデックスでアクセス
let page = doc.page(0)?;
if let Some(ann) = page.annotation(0) {
println!("First annotation: {:?}", ann.subtype());
}
println!("Total annotations: {}", page.annotation_count());
アノテーションの検索
ID で検索
let page = doc.page(0)?;
let id = page.annotations()[0].id();
if let Some(ann) = page.find_annotation(id) {
println!("Found: {:?}", ann.subtype());
}
領域で検索
矩形領域内の注釈を検索します。
use pdf_oxide::geometry::Rect;
let page = doc.page(0)?;
let region = Rect::new(0.0, 700.0, 612.0, 92.0);
let top_annotations = page.find_annotations_in_region(region);
for ann in top_annotations {
println!("Annotation in header area: {:?}", ann.subtype());
}
タイプで検索
use pdf_oxide::AnnotationSubtype;
let page = doc.page(0)?;
let highlights = page.find_annotations_by_type(AnnotationSubtype::Highlight);
println!("Found {} highlights", highlights.len());
アノテーションの追加
リンクの追加
doc = PdfDocument("input.pdf")
page = doc.page(0)
# Add a clickable URL link
page.add_link(100, 700, 150, 12, "https://example.com")
doc.save_page(page)
doc.save("with-link.pdf")
use pdf_oxide::api::Pdf;
use pdf_oxide::writer::LinkAnnotation;
use pdf_oxide::geometry::Rect;
let mut doc = Pdf::open("input.pdf")?;
let mut page = doc.page(0)?;
let link = LinkAnnotation::uri(
Rect::new(100.0, 700.0, 150.0, 12.0),
"https://example.com"
);
page.add_annotation(link);
doc.save_page(page)?;
doc.save("with-link.pdf")?;
テキストハイライトの追加
doc = PdfDocument("input.pdf")
page = doc.page(0)
# Yellow highlight
page.add_highlight(100, 700, 200, 12, (1.0, 1.0, 0.0))
doc.save_page(page)
doc.save("highlighted.pdf")
use pdf_oxide::writer::TextMarkupAnnotation;
use pdf_oxide::TextMarkupType;
use pdf_oxide::geometry::Rect;
let mut doc = Pdf::open("input.pdf")?;
let mut page = doc.page(0)?;
let highlight = TextMarkupAnnotation::from_rect(
TextMarkupType::Highlight,
Rect::new(100.0, 700.0, 200.0, 12.0),
).with_color(1.0, 1.0, 0.0); // Yellow
page.add_annotation(highlight);
doc.save_page(page)?;
doc.save("highlighted.pdf")?;
付箋の追加
doc = PdfDocument("input.pdf")
page = doc.page(0)
page.add_note(50, 750, "Review this section before publishing.")
doc.save_page(page)
doc.save("with-notes.pdf")
use pdf_oxide::writer::TextAnnotation;
use pdf_oxide::geometry::Rect;
let mut doc = Pdf::open("input.pdf")?;
let mut page = doc.page(0)?;
let note = TextAnnotation::new(
Rect::new(50.0, 750.0, 24.0, 24.0),
"Review this section before publishing."
);
page.add_annotation(note);
doc.save_page(page)?;
doc.save("with-notes.pdf")?;
アノテーションの削除
インデックスで削除
doc = PdfDocument("input.pdf")
page = doc.page(0)
# Remove the first annotation
page.remove_annotation(0)
doc.save_page(page)
doc.save("cleaned.pdf")
let mut page = doc.page(0)?;
page.remove_annotation(0); // Returns Option<AnnotationWrapper>
doc.save_page(page)?;
ID で削除
let mut page = doc.page(0)?;
// Get the ID of an annotation to remove
let ann_id = page.annotations()[0].id();
page.remove_annotation_by_id(ann_id);
doc.save_page(page)?;
doc.save("cleaned.pdf")?;
アノテーションの変更
プロパティを変更するために可変注釈にアクセスします。
let mut page = doc.page(0)?;
// Modify annotations through mutable access
for ann in page.annotations_mut() {
// Change contents text
ann.set_contents("Updated comment");
// Change position
ann.set_rect(pdf_oxide::geometry::Rect::new(100.0, 700.0, 200.0, 20.0));
// Change color
ann.set_color(1.0, 0.0, 0.0); // Red
}
doc.save_page(page)?;
doc.save("modified.pdf")?;
特定のアノテーションを変更
let mut page = doc.page(0)?;
if let Some(ann) = page.annotation_mut(0) {
ann.set_contents("First annotation - updated");
}
doc.save_page(page)?;
ミュータブル検索
let mut page = doc.page(0)?;
let target_id = page.annotations()[0].id();
if let Some(ann) = page.find_annotation_mut(target_id) {
ann.set_contents("Found and updated");
ann.set_color(0.0, 1.0, 0.0); // Green
}
doc.save_page(page)?;
アノテーションのフラット化
フラット化は注釈のアピアランスストリームをページコンテンツにレンダリングし、注釈オブジェクトを削除します。 This makes annotations permanent and non-editable.
単一ページのフラット化
doc = PdfDocument("annotated.pdf")
doc.flatten_page_annotations(0)
doc.save("flat.pdf")
import { WasmPdfDocument } from "pdf-oxide-wasm";
const doc = new WasmPdfDocument(bytes);
doc.flattenPageAnnotations(0);
const output = doc.save();
doc.free();
let mut editor = DocumentEditor::open("annotated.pdf")?;
editor.flatten_page_annotations(0)?;
editor.save("flat.pdf")?;
全アノテーションのフラット化
doc = PdfDocument("annotated.pdf")
doc.flatten_all_annotations()
doc.save("flat.pdf")
import { WasmPdfDocument } from "pdf-oxide-wasm";
const doc = new WasmPdfDocument(bytes);
doc.flattenAllAnnotations();
const output = doc.save();
doc.free();
let mut editor = DocumentEditor::open("annotated.pdf")?;
editor.flatten_all_annotations()?;
editor.save("flat.pdf")?;
フラット化マーキングの確認と取り消し
doc.flatten_page_annotations(0)
print(doc.is_page_marked_for_flatten(0)) # True
doc.unmark_page_for_flatten(0)
print(doc.is_page_marked_for_flatten(0)) # False
editor.flatten_page_annotations(0)?;
assert!(editor.is_page_marked_for_flatten(0));
editor.unmark_page_for_flatten(0);
assert!(!editor.is_page_marked_for_flatten(0));
完全な API リファレンス
PdfPage Annotation Methods
| Method | Returns | 説明 |
|---|---|---|
annotations() |
&[AnnotationWrapper] |
すべての注釈を取得 |
annotation(index) |
Option<&AnnotationWrapper> |
インデックスで注釈を取得 |
annotations_mut() |
&mut [AnnotationWrapper] |
可変注釈を取得 |
annotation_mut(index) |
Option<&mut AnnotationWrapper> |
Get mutable annotation by index |
annotation_count() |
usize |
アノテーション数 |
has_annotations_modified() |
bool |
アノテーションが変更されたか確認 |
add_annotation(ann) |
AnnotationId |
新しいアノテーションを追加 |
remove_annotation(index) |
Option<AnnotationWrapper> |
インデックスで削除 |
remove_annotation_by_id(id) |
Option<AnnotationWrapper> |
IDで削除 |
find_annotation(id) |
Option<&AnnotationWrapper> |
IDで検索 |
find_annotation_mut(id) |
Option<&mut AnnotationWrapper> |
IDでミュータブル検索 |
find_annotations_in_region(rect) |
Vec<&AnnotationWrapper> |
領域内を検索 |
find_annotations_by_type(subtype) |
Vec<&AnnotationWrapper> |
タイプで検索 |
AnnotationWrapper Properties
| Method | Returns | 説明 |
|---|---|---|
id() |
AnnotationId |
一意の識別子 |
subtype() |
AnnotationSubtype |
注釈タイプ |
rect() |
Rect |
位置とサイズ |
contents() |
Option<&str> |
テキストコンテンツ |
color() |
Option<(f32, f32, f32)> |
RGB色 |
is_modified() |
bool |
変更されている |
is_new() |
bool |
追加された(ソースからではない) |
set_contents(text) |
() |
テキストコンテンツを設定 |
set_rect(rect) |
() |
位置/サイズを設定 |
set_color(r, g, b) |
() |
Set RGB色 |
DocumentEditor Annotation Methods
| Method | Returns | 説明 |
|---|---|---|
flatten_page_annotations(page) |
Result<()> |
1ページをフラット化 |
flatten_all_annotations() |
Result<()> |
全ページをフラット化 |
is_page_marked_for_flatten(page) |
bool |
フラット化ステータスを確認 |
unmark_page_for_flatten(page) |
() |
保留中のフラット化をキャンセル |
応用例: Annotation Review Workflow
use pdf_oxide::api::Pdf;
use pdf_oxide::writer::{TextAnnotation, TextMarkupAnnotation};
use pdf_oxide::{AnnotationSubtype, TextMarkupType};
use pdf_oxide::geometry::Rect;
let mut doc = Pdf::open("draft.pdf")?;
let count = doc.page_count()?;
for i in 0..count {
let mut page = doc.page(i)?;
// Find all text containing "TODO"
let todos = page.find_text_containing("TODO");
for t in &todos {
// Add a highlight over the TODO text
let highlight = TextMarkupAnnotation::from_rect(
TextMarkupType::Highlight,
t.bbox(),
).with_color(1.0, 0.5, 0.0); // Orange
page.add_annotation(highlight);
// Add a note next to it
let note = TextAnnotation::new(
Rect::new(t.bbox().x - 30.0, t.bbox().y, 24.0, 24.0),
&format!("TODO found: {}", t.text()),
);
page.add_annotation(note);
}
doc.save_page(page)?;
}
doc.save("reviewed.pdf")?;
関連ページ
- Text Editing – テキストコンテンツを直接変更
- Redaction – 墨消しアノテーションでコンテンツを墨消し
- Page Operations – ページレベル操作
- Form Field Editing – インタラクティブフォームフィールド