Skip to content

Редагування анотацій

PDF Oxide надає доступ на рівні DOM до анотацій через об’єкт PdfPage. Ви можете читати існуючі анотації, додавати нові (посилання, виділення, нотатки), змінювати властивості анотацій, видаляти анотації та згладжувати їх у вміст сторінки.

Отримання анотацій

Перелічити всі анотації

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)?;

Згладжування анотацій

Згладжування рендерить потоки зовнішнього вигляду анотацій у вміст сторінки та видаляє об’єкти анотацій. Це робить анотації постійними та нередагованими.

Згладжування однієї сторінки

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

Метод Повертає Опис
annotations() &[AnnotationWrapper] Отримати всі анотації
annotation(index) Option<&AnnotationWrapper> Отримати анотацію за індексом
annotations_mut() &mut [AnnotationWrapper] Отримати змінювані анотації
annotation_mut(index) Option<&mut AnnotationWrapper> Отримати змінювану анотацію за індексом
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

Метод Повертає Опис
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) () Задати RGB-колір

Методи анотацій DocumentEditor

Метод Повертає Опис
flatten_page_annotations(page) Result<()> Згладити одну сторінку
flatten_all_annotations() Result<()> Згладити всі сторінки
is_page_marked_for_flatten(page) bool Перевірити статус згладжування
unmark_page_for_flatten(page) () Скасувати незавершене згладжування

Розширений приклад: процес перегляду анотацій

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")?;

Пов’язані сторінки