Skip to content

Обзор редактирования

PDF Oxide предоставляет два уровня API для редактирования существующих PDF: высокоуровневый класс Pdf (рекомендуется) и низкоуровневый DocumentEditor. Оба позволяют открыть PDF, модифицировать его содержимое и метаданные, отслеживать изменения и сохранить результат.

Открытие PDF для редактирования

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("input.pdf")

Редактор инициализируется лениво при первом изменении. Вы можете начать чтение сразу, а редактор активируется при вызове любого мутирующего метода, такого как set_title() или page().

WASM

import { WasmPdfDocument } from "pdf-oxide-wasm";

const bytes = new Uint8Array(/* file bytes */);
const doc = new WasmPdfDocument(bytes);

Rust

Используйте унифицированный API Pdf:

use pdf_oxide::api::Pdf;

let mut doc = Pdf::open("input.pdf")?;

Или используйте DocumentEditor напрямую для низкоуровневого управления:

use pdf_oxide::editor::DocumentEditor;

let mut editor = DocumentEditor::open("input.pdf")?;

Проверка наличия изменений

Перед сохранением можно проверить, были ли внесены изменения:

Python

doc = PdfDocument("input.pdf")
print(doc.is_modified)  # False -- no changes yet

doc.set_title("Updated Title")
print(doc.is_modified)  # True

Rust

let mut doc = Pdf::open("input.pdf")?;
assert!(!doc.is_modified());

doc.editor().unwrap().set_title("Updated Title");
assert!(doc.is_modified());

Сохранение

Python

doc = PdfDocument("input.pdf")
doc.set_title("New Title")
doc.save("output.pdf")

WASM

import { WasmPdfDocument } from "pdf-oxide-wasm";

const bytes = new Uint8Array(/* file bytes */);
const doc = new WasmPdfDocument(bytes);
doc.setTitle("New Title");
const output = doc.save();
doc.free();

Rust

let mut doc = Pdf::open("input.pdf")?;
doc.editor().unwrap().set_title("New Title");
doc.save("output.pdf")?;

// Or save to a new path
doc.save_as("copy.pdf")?;

Метод save() по умолчанию выполняет полную перезапись PDF. Для расширенных параметров сохранения (инкрементальные обновления, шифрование) см. Шифрование и безопасность.

Метаданные документа

Чтение и запись стандартных полей метаданных PDF: заголовок, автор, тема и ключевые слова.

Python

from pdf_oxide import PdfDocument

doc = PdfDocument("input.pdf")

# Set metadata
doc.set_title("Quarterly Report")
doc.set_author("Jane Smith")
doc.set_subject("Q4 2025 Financial Results")
doc.set_keywords("finance, quarterly, 2025")

doc.save("output.pdf")

WASM

import { WasmPdfDocument } from "pdf-oxide-wasm";

const bytes = new Uint8Array(/* file bytes */);
const doc = new WasmPdfDocument(bytes);

// Set metadata
doc.setTitle("Quarterly Report");
doc.setAuthor("Jane Smith");
doc.setSubject("Q4 2025 Financial Results");
doc.setKeywords("finance, quarterly, 2025");

const output = doc.save();
doc.free();

Rust

use pdf_oxide::editor::DocumentEditor;

let mut editor = DocumentEditor::open("input.pdf")?;

// Read metadata
if let Some(title) = editor.title()? {
    println!("Current title: {}", title);
}
if let Some(author) = editor.author()? {
    println!("Current author: {}", author);
}
if let Some(subject) = editor.subject()? {
    println!("Current subject: {}", subject);
}
if let Some(keywords) = editor.keywords()? {
    println!("Current keywords: {}", keywords);
}

// Set metadata
editor.set_title("Quarterly Report");
editor.set_author("Jane Smith");
editor.set_subject("Q4 2025 Financial Results");
editor.set_keywords("finance, quarterly, 2025");

editor.save("output.pdf")?;

Информация о документе

Исходный путь и версия

use pdf_oxide::editor::DocumentEditor;

let editor = DocumentEditor::open("input.pdf")?;

// Path to the original file
println!("Source: {}", editor.source_path());

// PDF version as (major, minor)
let (major, minor) = editor.version();
println!("PDF version: {}.{}", major, minor);

// Количество страниц
println!("Pages: {}", editor.current_page_count());

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

DocumentEditor

Метод Возвращает Описание
open(path) Result<DocumentEditor> Открыть PDF для редактирования
is_modified() bool Проверить, были ли внесены изменения
source_path() &str Путь к исходному PDF
source() &PdfDocument Доступ к исходному документу только для чтения
version() (u8, u8) PDF version (major, minor)
current_page_count() usize Количество страниц в документе
title() Result<Option<String>> Получить заголовок документа
set_title(title) () Установить заголовок документа
author() Result<Option<String>> Получить автора документа
set_author(author) () Установить автора документа
subject() Result<Option<String>> Получить тему документа
set_subject(subject) () Установить тему документа
keywords() Result<Option<String>> Получить ключевые слова документа
set_keywords(keywords) () Установить ключевые слова документа
save(path) Result<()> Сохранить с полной перезаписью
save_with_options(path, options) Result<()> Сохранение с пользовательскими параметрами

Pdf (Unified API)

Метод Возвращает Описание
Pdf::open(path) Result<Pdf> Открыть PDF для редактирования
Pdf::open_editor(path) Result<DocumentEditor> Open directly as DocumentEditor
is_modified() bool Check if changes exist
save(path) Result<()> Сохранение документа
save_as(path) Result<()> Save to a new path
page(index) Result<PdfPage> Get a page for DOM editing
save_page(page) Result<()> Save a modified page back
editor() Option<&mut DocumentEditor> Доступ к базовому редактору

EditableDocument Trait

Трейт EditableDocument определяет основной контракт редактирования:

pub trait EditableDocument {
    fn get_info(&mut self) -> Result<DocumentInfo>;
    fn set_info(&mut self, info: DocumentInfo) -> Result<()>;
    fn page_count(&mut self) -> Result<usize>;
    fn get_page_info(&mut self, index: usize) -> Result<PageInfo>;
    fn remove_page(&mut self, index: usize) -> Result<()>;
    fn move_page(&mut self, from: usize, to: usize) -> Result<()>;
    fn duplicate_page(&mut self, index: usize) -> Result<usize>;
    fn save(&mut self, path: impl AsRef<Path>) -> Result<()>;
    fn save_with_options(&mut self, path: impl AsRef<Path>, options: SaveOptions) -> Result<()>;
}

Полный процесс редактирования

Этот пример демонстрирует полный сеанс редактирования: открытие, проверка, изменение метаданных, редактирование содержимого и сохранение.

Python

from pdf_oxide import PdfDocument

# Open the document
doc = PdfDocument("report.pdf")
print(f"Pages: {doc.page_count()}")

# Update metadata
doc.set_title("Annual Report 2025")
doc.set_author("Finance Team")

# Edit text on page 0
page = doc.page(0)
for text in page.find_text_containing("DRAFT"):
    page.set_text(text.id, "FINAL")
doc.save_page(page)

# Save
doc.save("report-final.pdf")

Rust

use pdf_oxide::api::Pdf;

let mut doc = Pdf::open("report.pdf")?;
println!("Pages: {}", doc.page_count()?);

// Update metadata
{
    let editor = doc.editor().unwrap();
    editor.set_title("Annual Report 2025");
    editor.set_author("Finance Team");
}

// Edit text on page 0
let mut page = doc.page(0)?;
let drafts = page.find_text_containing("DRAFT");
for t in &drafts {
    page.set_text(t.id(), "FINAL")?;
}
doc.save_page(page)?;

// Save
doc.save("report-final.pdf")?;

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