Початок роботи з PDF Oxide (Rust)
PDF Oxide — найшвидший Rust-crate для роботи з PDF із вбудованим видобуванням тексту: у середньому 0,8 мс та 100 % успіху на 3 830 PDF. Одна бібліотека — видобування, створення й редагування.
Встановлення
Додайте pdf_oxide до вашого Cargo.toml:
[dependencies]
pdf_oxide = "0.3"
Feature-прапорці
Вмикайте лише ті можливості, які вам потрібні:
# Типово -- видобування тексту, створення, редагування
pdf_oxide = "0.3"
# Рендеринг сторінок у зображення
pdf_oxide = { version = "0.3", features = ["rendering"] }
# Генерація штрих-кодів
pdf_oxide = { version = "0.3", features = ["barcodes"] }
# Цифрові підписи
pdf_oxide = { version = "0.3", features = ["signatures"] }
# Конвертація Office-документів (DOCX, XLSX, PPTX)
pdf_oxide = { version = "0.3", features = ["office"] }
# Усе
pdf_oxide = { version = "0.3", features = ["full"] }
Відкриття PDF
Завантажте файл через PdfDocument::open() і перегляньте метадані.
use pdf_oxide::PdfDocument;
let doc = PdfDocument::open("research-paper.pdf")?;
println!("Pages: {}", doc.page_count());
println!("PDF version: {}", doc.version());
Видобування тексту
Звичайний текст
use pdf_oxide::PdfDocument;
let doc = PdfDocument::open("report.pdf")?;
let text = doc.extract_text(0)?;
println!("{text}");
Текстові спани
extract_spans() повертає Vec<TextSpan> — для кожного фрагмента тексту з однаковим стилем доступні метадані шрифту.
use pdf_oxide::PdfDocument;
let doc = PdfDocument::open("paper.pdf")?;
let spans = doc.extract_spans(0)?;
for span in &spans {
println!("'{}' at ({:.1}, {:.1}) font={} size={:.1}",
span.text, span.x, span.y, span.font_name, span.font_size);
}
Поля TextSpan:
| Поле | Тип | Опис |
|---|---|---|
text |
String |
Вміст тексту |
x |
f64 |
Горизонтальна координата в пунктах |
y |
f64 |
Вертикальна координата в пунктах |
font_name |
String |
PostScript-ім’я шрифту |
font_size |
f64 |
Розмір шрифту в пунктах |
bbox |
Rect |
Обмежувальний прямокутник |
Видобування за символами
extract_chars() повертає Vec<TextChar> із точним розташуванням кожного символу.
use pdf_oxide::PdfDocument;
let doc = PdfDocument::open("paper.pdf")?;
let chars = doc.extract_chars(0)?;
for ch in chars.iter().take(10) {
println!("'{}' at ({:.1}, {:.1}) size={:.1} font={}",
ch.char, ch.x, ch.y, ch.font_size, ch.font_name);
}
Поля TextChar:
| Поле | Тип | Опис |
|---|---|---|
char |
char |
Символ Unicode |
x |
f64 |
Горизонтальна координата в пунктах |
y |
f64 |
Вертикальна координата в пунктах |
font_size |
f64 |
Розмір шрифту в пунктах |
font_name |
String |
PostScript-ім’я шрифту |
bbox |
Rect |
Обмежувальний прямокутник |
Конвертація в Markdown
Перетворіть сторінку на Markdown із настроюваними параметрами.
use pdf_oxide::PdfDocument;
use pdf_oxide::converters::ConversionOptions;
let doc = PdfDocument::open("paper.pdf")?;
let options = ConversionOptions { detect_headings: true, ..Default::default() };
let md = doc.to_markdown(0, &options)?;
println!("{md}");
Конвертація в HTML
use pdf_oxide::PdfDocument;
let doc = PdfDocument::open("paper.pdf")?;
let html = doc.to_html(0)?;
println!("{html}");
Видобування зображень
extract_images() повертає метадані та сирі дані кожного зображення сторінки — включно із зображеннями у потоках вмісту та вкладених Form XObjects.
use pdf_oxide::PdfDocument;
let doc = PdfDocument::open("brochure.pdf")?;
let images = doc.extract_images(0)?;
for (i, img) in images.iter().enumerate() {
println!("Image {i}: {}x{} {} {}bpc ({} bytes)",
img.width, img.height, img.color_space,
img.bits_per_component, img.data.len());
}
Збережіть зображення одразу на диск за допомогою extract_images_to_files():
let doc = PdfDocument::open("brochure.pdf")?;
let paths = doc.extract_images_to_files(0, "output_dir")?;
for path in &paths {
println!("Saved: {}", path.display());
}
Створення PDF
Фабричні методи
Тип Pdf пропонує зручні фабричні методи.
use pdf_oxide::api::Pdf;
let mut pdf = Pdf::from_markdown("# Hello World\n\nThis is a PDF.")?;
pdf.save("output.pdf")?;
let mut pdf = Pdf::from_html("<h1>Invoice</h1><p>Amount: $42</p>")?;
pdf.save("invoice.pdf")?;
let mut pdf = Pdf::from_text("Plain text content.")?;
pdf.save("notes.pdf")?;
let mut pdf = Pdf::from_image("scan.jpg")?;
pdf.save("scan.pdf")?;
Fluent-API через PdfBuilder
Повний контроль над метаданими, форматом сторінки та полями:
use pdf_oxide::api::PdfBuilder;
use pdf_oxide::writer::PageSize;
let mut pdf = PdfBuilder::new()
.title("Annual Report")
.author("Acme Corp")
.page_size(PageSize::A4)
.margins(72.0, 72.0, 72.0, 72.0)
.font_size(11.0)
.from_markdown("# Annual Report\n\n...")?;
pdf.save("annual-report.pdf")?;
Низькорівневий API через DocumentBuilder
Розміщуйте текст, фігури та зображення з піксельною точністю:
use pdf_oxide::writer::DocumentBuilder;
let mut builder = DocumentBuilder::new();
builder.add_page(612.0, 792.0)
.text("Hello, world!", 72.0, 720.0, 12.0)
.rect(100.0, 600.0, 200.0, 50.0)
.image_at("logo.png", 400.0, 700.0, 100.0, 50.0)?;
builder.save("custom.pdf")?;
Пошук
Шукайте текст по всьому документу або вмикайте додаткові параметри.
use pdf_oxide::api::Pdf;
let pdf = Pdf::open("manual.pdf")?;
// Простий пошук по всіх сторінках
let results = pdf.search("configuration")?;
for r in &results {
println!("Page {}: '{}' at ({:.0}, {:.0})", r.page, r.text, r.x, r.y);
}
use pdf_oxide::api::{Pdf, SearchOptions};
let pdf = Pdf::open("manual.pdf")?;
let opts = SearchOptions {
case_sensitive: false,
whole_word: true,
max_results: Some(50),
..Default::default()
};
let results = pdf.search_with_options("configuration", &opts)?;
Редагування
DocumentEditor
Відкрийте наявний PDF для структурних правок — повороту сторінок чи роботи з полями форм.
use pdf_oxide::api::Pdf;
let mut pdf = Pdf::open_editor("form-template.pdf")?;
// Повернути сторінку
pdf.rotate_page(0, 90)?;
// Додати поле форми
pdf.add_text_field("name", [100.0, 700.0, 300.0, 720.0])?;
pdf.add_checkbox("agree", [100.0, 650.0, 120.0, 670.0], false)?;
pdf.save("modified.pdf")?;
DOM-подібне редагування сторінки
Обходьте елементи сторінки та змінюйте текст на місці.
use pdf_oxide::api::Pdf;
let mut pdf = Pdf::open("document.pdf")?;
let mut page = pdf.page(0)?;
// Знайти текстові елементи
for t in page.find_text_containing("Draft") {
println!("Found '{}' at {:?}", t.text(), t.bbox());
}
// Замінити текст
let matches = page.find_text_containing("Draft");
for t in &matches {
page.set_text(t.id(), "Final")?;
}
pdf.save_page(page)?;
pdf.save("updated.pdf")?;
Обробка помилок
Усі операції, що можуть завершитися невдало, повертають Result<T, PdfError>. Перелік PdfError покриває основні сценарії збою.
use pdf_oxide::PdfDocument;
use pdf_oxide::PdfError;
fn extract(path: &str) -> Result<String, PdfError> {
let doc = PdfDocument::open(path)?;
doc.extract_text(0)
}
match extract("file.pdf") {
Ok(text) => println!("{text}"),
Err(PdfError::Io(e)) => eprintln!("I/O error: {e}"),
Err(PdfError::Parse(msg)) => eprintln!("Parse error: {msg}"),
Err(PdfError::Password) => eprintln!("Password required"),
Err(PdfError::PageOutOfRange { index, count }) => {
eprintln!("Page {index} does not exist ({count} pages total)");
}
Err(e) => eprintln!("Error: {e}"),
}
Варіанти PdfError:
| Варіант | Опис |
|---|---|
Io |
Помилка файлової системи або вводу-виводу |
Parse |
Пошкоджена структура PDF |
Password |
Документ зашифровано, пароль не передано |
PageOutOfRange |
Запитуваний індекс сторінки перевищує кількість сторінок |
Наступні кроки
- Швидкий старт Python – використання PDF Oxide з Python
- Видобування тексту – детальні параметри та приклади
- Створення PDF – розширене створення з PdfBuilder, шифруванням і метаданими
- Редагування – зміни в наявних PDF, анотації та поля форм
- Довідник API – повна документація API