Skip to content

Redacción

PDF Oxide soporta un flujo de trabajo de redacción en dos fases siguiendo la especificación PDF: primero, marcar regiones para redacción usando anotaciones de redacción, luego aplicar las redacciones para dibujar capas de color que ocultan el contenido. Este enfoque le da un paso de revisión antes de ocultar permanentemente la información sensible.

Flujo de trabajo de redacción

El proceso estándar de redacción tiene tres pasos:

  1. Marcar – Agregar anotaciones de redacción para identificar contenido a ocultar
  2. Revisar – Inspeccionar regiones marcadas antes de aplicar (opcional)
  3. Aplicar – Dibujar capas superpuestas y eliminar anotaciones de redacción
  4. Guardar – Escribir el PDF redactado en disco

Paso 1: agregar anotaciones de redacción

Use la API de anotaciones de PdfPage para agregar anotaciones de redacción que marquen regiones para eliminar.

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("confidential.pdf")
page = doc.page(0)

# Find sensitive text and mark it for redaction
for t in page.find_text_containing("SSN"):
    bbox = t.bbox  # (x, y, width, height)
    page.add_highlight(bbox[0], bbox[1], bbox[2], bbox[3], (0.0, 0.0, 0.0))

doc.save_page(page)

Rust

use pdf_oxide::api::Pdf;
use pdf_oxide::writer::RedactAnnotation;
use pdf_oxide::geometry::Rect;

let mut doc = Pdf::open("confidential.pdf")?;
let mut page = doc.page(0)?;

// Mark a specific region for redaction
let redact = RedactAnnotation::new(
    Rect::new(100.0, 700.0, 200.0, 14.0)
);
page.add_annotation(redact);

// Mark all text containing "SSN" for redaction
let sensitive = page.find_text_containing("SSN");
for t in &sensitive {
    let redact = RedactAnnotation::new(t.bbox());
    page.add_annotation(redact);
}

doc.save_page(page)?;

Paso 2: aplicar redacciones

Una vez que las anotaciones de redacción estén en su lugar, aplíquelas para dibujar capas de color sobre las regiones marcadas. Este paso encuentra todas las anotaciones de redacción, renderiza las capas superpuestas y elimina las anotaciones de redacción.

Aplicar en una sola página

doc = PdfDocument("marked.pdf")
doc.apply_page_redactions(0)
doc.save("redacted.pdf")
import { WasmPdfDocument } from "pdf-oxide-wasm";

const doc = new WasmPdfDocument(bytes);
doc.applyPageRedactions(0);
const output = doc.save();
doc.free();
use pdf_oxide::editor::DocumentEditor;

let mut editor = DocumentEditor::open("marked.pdf")?;
editor.apply_page_redactions(0)?;
editor.save("redacted.pdf")?;

Aplicar en todas las páginas

doc = PdfDocument("marked.pdf")
doc.apply_all_redactions()
doc.save("redacted.pdf")
import { WasmPdfDocument } from "pdf-oxide-wasm";

const doc = new WasmPdfDocument(bytes);
doc.applyAllRedactions();
const output = doc.save();
doc.free();
let mut editor = DocumentEditor::open("marked.pdf")?;
editor.apply_all_redactions()?;
editor.save("redacted.pdf")?;

Verificar estado de redacción

Verificar si una página está marcada

doc = PdfDocument("input.pdf")
doc.apply_page_redactions(0)

print(doc.is_page_marked_for_redaction(0))  # True (before save)
let mut editor = DocumentEditor::open("input.pdf")?;
editor.apply_page_redactions(0)?;

assert!(editor.is_page_marked_for_redaction(0));

Cancelar redacciones pendientes

Si cambia de opinión antes de guardar, desmarque una página para cancelar la redacción pendiente.

doc.unmark_page_for_redaction(0)
print(doc.is_page_marked_for_redaction(0))  # False
editor.unmark_page_for_redaction(0);
assert!(!editor.is_page_marked_for_redaction(0));

Flujo de trabajo de redacción completo

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("sensitive-report.pdf")

# Step 1: Add redaction annotations via the DOM
for i in range(doc.page_count()):
    page = doc.page(i)

    # Mark SSN patterns
    for t in page.find_text_containing("SSN"):
        bbox = t.bbox
        page.add_highlight(bbox[0], bbox[1], bbox[2], bbox[3], (0.0, 0.0, 0.0))

    # Mark email addresses
    for t in page.find_text_containing("@"):
        bbox = t.bbox
        page.add_highlight(bbox[0], bbox[1], bbox[2], bbox[3], (0.0, 0.0, 0.0))

    doc.save_page(page)

# Step 2: Apply all redactions
doc.apply_all_redactions()

# Step 3: Save the redacted document
doc.save("report-redacted.pdf")

Rust

use pdf_oxide::api::Pdf;
use pdf_oxide::writer::RedactAnnotation;

let mut doc = Pdf::open("sensitive-report.pdf")?;
let count = doc.page_count()?;

// Step 1: Mark regions for redaction
for i in 0..count {
    let mut page = doc.page(i)?;

    // Find and mark sensitive text
    let ssn_matches = page.find_text_containing("SSN");
    for t in &ssn_matches {
        let redact = RedactAnnotation::new(t.bbox());
        page.add_annotation(redact);
    }

    let email_matches = page.find_text_containing("@");
    for t in &email_matches {
        let redact = RedactAnnotation::new(t.bbox());
        page.add_annotation(redact);
    }

    doc.save_page(page)?;
}

// Step 2: Apply redactions
let editor = doc.editor().unwrap();
editor.apply_all_redactions()?;

// Step 3: Save
doc.save("report-redacted.pdf")?;

Referencia completa de la API

Métodos de redacción de DocumentEditor

Método Retorna Descripción
apply_page_redactions(page) Result<()> Aplicar redacciones en una sola página
apply_all_redactions() Result<()> Aplicar redacciones en todas las páginas
is_page_marked_for_redaction(page) bool Verificar si la página tiene redacciones pendientes
unmark_page_for_redaction(page) () Cancelar redacciones pendientes de una página

Métodos Python (PdfDocument)

Method Parameters Descripción
apply_page_redactions(page) page: int Aplicar redacciones en una sola página
apply_all_redactions() Aplicar redacciones en todas las páginas
is_page_marked_for_redaction(page) page: int Check redaction status
unmark_page_for_redaction(page) page: int Cancel pending redactions

Notas importantes

  • Capa visual: La redacción dibuja un rectángulo de color sobre el área marcada. Los datos del content stream subyacente están visualmente ocultos pero pueden seguir presentes en el archivo. Para eliminación completa, considere combinar la redacción con un guardado de reescritura completa.
  • Proceso de dos fases: Siempre agregue anotaciones de redacción primero, luego llame a apply_page_redactions() o apply_all_redactions(). Llamar a apply sin anotaciones de redacción no tiene efecto.
  • Irreversible: Una vez guardado, la capa visual es permanente. Siempre trabaje en una copia del documento original.
  • Color: Por defecto, las redacciones usan una capa negra. Use RedactAnnotation con opciones de color para colores de capa personalizados.

Páginas relacionadas