Skip to content

Edicao de Anotações

O PDF Oxide fornece acesso em nível DOM a anotações através do objeto PdfPage. You can read existing annotations, add new ones (links, highlights, sticky notes), modify annotation properties, remove annotations, and flatten them into página content.

Obtendo Anotações

Listar Todas as Anotações

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

Acessar por Índice

let page = doc.page(0)?;

if let Some(ann) = page.annotation(0) {
    println!("First annotation: {:?}", ann.subtype());
}

println!("Total annotations: {}", page.annotation_count());

Encontrar Anotações

By ID

let page = doc.page(0)?;
let id = page.annotations()[0].id();

if let Some(ann) = page.find_annotation(id) {
    println!("Found: {:?}", ann.subtype());
}

By Region

Encontrar anotações dentro de uma área retangular.

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());
}

By Type

use pdf_oxide::AnnotationSubtype;

let page = doc.page(0)?;
let highlights = page.find_annotations_by_type(AnnotationSubtype::Highlight);
println!("Found {} highlights", highlights.len());

Adicionando Anotações

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

Add a Text Highlight

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

Add a Sticky Note

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

Removendo Anotações

Remove by Index

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

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

Modificando Anotações

Access mutable annotations to change their properties.

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

Modify a Specific Annotation

let mut page = doc.page(0)?;

if let Some(ann) = page.annotation_mut(0) {
    ann.set_contents("First annotation - updated");
}

doc.save_page(page)?;

Mutable Find

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

Aplainando Anotações

O achatamento renderiza fluxos de aparência de anotações no conteúdo da página e remove os objetos de anotação. Isso torna as anotações permanentes e não editáveis.

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

Flatten All Annotations

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

Check and Undo Flatten Marking

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

Referência Completa da API

PdfPage Annotation Methods

Method Retorna Descrição
annotations() &[AnnotationWrapper] Get all annotations
annotation(index) Option<&AnnotationWrapper> Get annotation by index
annotations_mut() &mut [AnnotationWrapper] Get mutable annotations
annotation_mut(index) Option<&mut AnnotationWrapper> Get mutable annotation by index
annotation_count() usize Number of annotations
has_annotations_modified() bool Check if annotations were changed
add_annotation(ann) AnnotationId Add a new annotation
remove_annotation(index) Option<AnnotationWrapper> Remove by index
remove_annotation_by_id(id) Option<AnnotationWrapper> Remove by ID
find_annotation(id) Option<&AnnotationWrapper> Find by ID
find_annotation_mut(id) Option<&mut AnnotationWrapper> Find mutable by ID
find_annotations_in_region(rect) Vec<&AnnotationWrapper> Find in area
find_annotations_by_type(subtype) Vec<&AnnotationWrapper> Find by type

AnnotationWrapper Properties

Method Retorna Descrição
id() AnnotationId Identificador único
subtype() AnnotationSubtype Annotation type
rect() Rect Position and size
contents() Option<&str> Conteúdo de textos
color() Option<(f32, f32, f32)> Cor RGB
is_modified() bool Has been changed
is_new() bool Was added (not from source)
set_contents(text) () Set text contents
set_rect(rect) () Set position/size
set_color(r, g, b) () Set Cor RGB

DocumentEditor Annotation Methods

Method Retorna Descrição
flatten_page_annotations(page) Result<()> Flatten one página
flatten_all_annotations() Result<()> Flatten todas as páginas
is_page_marked_for_flatten(page) bool Verificar status de achatamento
unmark_page_for_flatten(page) () Cancel pending flatten

Exemplo Avançado: 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")?;

Páginas Relacionadas