Обзор редактирования
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")?;
Связанные страницы
- Редактирование текста — поиск и замена текста, изменение шрифтов и позиционирования
- Операции со страницами — поворот, обрезка, объединение и извлечение страниц
- Редактирование полей форм — заполнение, добавление и сведение полей форм
- Шифрование и безопасность — защита паролем и настройка разрешений