Skip to content

Editar anotaciones

PDF Oxide proporciona acceso a nivel DOM a las anotaciones a través del objeto PdfPage. Puede leer anotaciones existentes, agregar nuevas (enlaces, resaltados, notas adhesivas), modificar propiedades de anotaciones, eliminar anotaciones y aplanarlas en el contenido de la página.

Obtener anotaciones

Listar todas las anotaciones

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

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

Buscar anotaciones

Por ID

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

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

Por región

Buscar anotaciones dentro de un área rectangular.

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

Por tipo

use pdf_oxide::AnnotationSubtype;

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

Agregar anotaciones

Agregar un enlace

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

Agregar un resaltado de texto

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

Agregar una nota adhesiva

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

Eliminar anotaciones

Eliminar por índice

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

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

Modificar anotaciones

Acceda a anotaciones mutables para cambiar sus propiedades.

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

Modificar una anotación específica

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

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

doc.save_page(page)?;

Búsqueda mutable

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

Aplanar anotaciones

El aplanamiento renderiza los streams de apariencia de las anotaciones en el contenido de la página y elimina los objetos de anotación. Esto hace que las anotaciones sean permanentes y no editables.

Aplanar una sola página

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

Aplanar todas las anotaciones

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

Verificar y deshacer marcado de aplanamiento

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

Referencia completa de la API

Métodos de anotación de PdfPage

Método Retorna Descripción
annotations() &[AnnotationWrapper] Obtener todas las anotaciones
annotation(index) Option<&AnnotationWrapper> Obtener anotación por índice
annotations_mut() &mut [AnnotationWrapper] Obtener anotaciones mutables
annotation_mut(index) Option<&mut AnnotationWrapper> Obtener anotación mutable por índice
annotation_count() usize Número de anotaciones
has_annotations_modified() bool Verificar si las anotaciones fueron cambiadas
add_annotation(ann) AnnotationId Agregar una nueva anotación
remove_annotation(index) Option<AnnotationWrapper> Eliminar por índice
remove_annotation_by_id(id) Option<AnnotationWrapper> Eliminar por ID
find_annotation(id) Option<&AnnotationWrapper> Buscar por ID
find_annotation_mut(id) Option<&mut AnnotationWrapper> Buscar mutable por ID
find_annotations_in_region(rect) Vec<&AnnotationWrapper> Buscar en área
find_annotations_by_type(subtype) Vec<&AnnotationWrapper> Buscar por tipo

Propiedades de AnnotationWrapper

Método Retorna Descripción
id() AnnotationId Identificador único
subtype() AnnotationSubtype Tipo de anotación
rect() Rect Posición y tamaño
contents() Option<&str> Contenido de texto
color() Option<(f32, f32, f32)> Color RGB
is_modified() bool Ha sido cambiado
is_new() bool Fue agregado (no del origen)
set_contents(text) () Establecer contenido de texto
set_rect(rect) () Establecer posición/tamaño
set_color(r, g, b) () Set Color RGB

Métodos de anotación de DocumentEditor

Método Retorna Descripción
flatten_page_annotations(page) Result<()> Aplanar una página
flatten_all_annotations() Result<()> Aplanar todas las páginas
is_page_marked_for_flatten(page) bool Verificar estado de aplanamiento
unmark_page_for_flatten(page) () Cancelar aplanamiento pendiente

Ejemplo avanzado: flujo de trabajo de revisión de anotaciones

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