Skip to content

Замазывание

PDF Oxide поддерживает двухфазный процесс замазывания в соответствии со спецификацией PDF: сначала помечаются области для замазывания с помощью аннотаций замазывания, затем замазывание применяется для отрисовки цветных наложений, скрывающих содержимое. Такой подход даёт возможность проверки перед окончательным скрытием конфиденциальной информации.

Процесс замазывания

Стандартный процесс редактирования состоит из трёх шагов:

  1. Пометить — добавить аннотации замазывания для определения содержимого к скрытию
  2. Проверить — проверить помеченные области перед применением (необязательно)
  3. Применить — отрисовать наложения и удалить аннотации замазывания
  4. Сохранить — записать замазанный PDF на диск

Шаг 1: Добавление аннотаций замазывания

Используйте API аннотаций PdfPage для добавления аннотаций замазывания, помечающих области для удаления.

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

Шаг 2: Применение замазывания

После размещения аннотаций замазывания примените их для отрисовки цветных наложений поверх помеченных областей. Этот шаг находит все аннотации замазывания, рендерит наложения и удаляет аннотации замазывания.

Применение на одной странице

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

Применение на всех страницах

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

Проверка статуса замазывания

Проверка, помечена ли страница

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

Отмена ожидающего замазывания

Если вы передумали до сохранения, снимите пометку со страницы для отмены ожидающего замазывания.

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

Полный процесс замазывания

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: Применить все замазывания
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")?;

Полный справочник API

DocumentEditor Redaction Methods

Метод Возвращает Описание
apply_page_redactions(page) Result<()> Применить редактирование на одной странице
apply_all_redactions() Result<()> Применить замазывание на всех страницах
is_page_marked_for_redaction(page) bool Проверить, есть ли ожидающее замазывание
unmark_page_for_redaction(page) () Отменить ожидающее замазывание for a page

Python (PdfDocument) Methods

Метод Параметры Описание
apply_page_redactions(page) page: int Применить редактирование на одной странице
apply_all_redactions() Применить замазывание на всех страницах
is_page_marked_for_redaction(page) page: int Проверить статус замазывания
unmark_page_for_redaction(page) page: int Отменить ожидающее замазывание

Важные замечания

  • Визуальное наложение: замазывание рисует цветной прямоугольник поверх помеченной области. Данные базового потока содержимого визуально скрыты, но могут присутствовать в файле. Для полного удаления рекомендуется сочетать замазывание с полной перезаписью при сохранении.
  • Двухфазный процесс: всегда сначала добавляйте аннотации замазывания, затем вызывайте apply_page_redactions() или apply_all_redactions(). Вызов apply без аннотаций замазывания не имеет эффекта.
  • Необратимо: после сохранения визуальное наложение является постоянным. Всегда работайте с копией оригинального документа.
  • Цвет: по умолчанию замазывание использует чёрное наложение. Используйте RedactAnnotation с параметрами цвета для пользовательских цветов наложения.

Связанные страницы