Skip to content

Работа с изображениями

PDF Oxide предоставляет два уровня манипуляций с изображениями: низкоуровневые операции через DocumentEditor для перемещения и изменения размеров изображений по имени XObject, и доступ на уровне DOM через PdfPage для запроса метаданных изображений. Оба подхода работают с изображениями, уже встроенными в PDF.

Получение изображений страницы

DocumentEditor: информация об изображениях низкого уровня

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

from pdf_oxide import PdfDocument

doc = PdfDocument("brochure.pdf")
images = doc.page_images(0)

for img in images:
    print(f"Name: {img['name']}")
    print(f"Position: ({img['x']:.1f}, {img['y']:.1f})")
    print(f"Size: {img['width']:.1f} x {img['height']:.1f}")
    print(f"Matrix: {img['matrix']}")
import { WasmPdfDocument } from "pdf-oxide-wasm";

const doc = new WasmPdfDocument(bytes);
const images = doc.pageImages(0);

for (const img of images) {
  console.log(`Name: ${img.name}`);
  console.log(`Position: (${img.x}, ${img.y})`);
  console.log(`Size: ${img.width} x ${img.height}`);
}
doc.free();
use pdf_oxide::editor::DocumentEditor;

let mut editor = DocumentEditor::open("brochure.pdf")?;
let images = editor.get_page_images(0)?;

for img in &images {
    println!("Name: {}", img.name);
    println!("Bounds: {:?}", img.bounds);  // [x, y, width, height]
    println!("Matrix: {:?}", img.matrix);  // [a, b, c, d, e, f]
}

Возвращаемая структура ImageInfo содержит:

Поле Тип Описание
name String Имя XObject (e.g., "Im0", "Image1")
bounds [f32; 4] Позиция и размер [x, y, width, height]
matrix [f32; 6] Полная матрица трансформации [a, b, c, d, e, f]

PdfPage: информация об изображениях на уровне DOM

DOM API предоставляет более богатые метаданные о каждом изображении.

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

for img in page.find_images():
    print(f"BBox: {img.bbox}")
    print(f"Format: {img.format}")
    print(f"Размеры: {img.dimensions}")
let mut doc = Pdf::open("brochure.pdf")?;
let page = doc.page(0)?;

for img in page.find_images() {
    println!("BBox: {:?}", img.bbox());
    println!("Format: {:?}", img.format());
    println!("Размеры: {:?}", img.dimensions());
    println!("Aspect ratio: {:.2}", img.aspect_ratio());
    println!("Grayscale: {}", img.is_grayscale());

    if let Some(alt) = img.alt_text() {
        println!("Alt text: {}", alt);
    }
    if let Some((h_dpi, v_dpi)) = img.resolution() {
        println!("Resolution: {:.0} x {:.0} DPI", h_dpi, v_dpi);
    }
}

Перемещение изображений

Переместить изображение to a new position on the page without changing its size.

doc = PdfDocument("input.pdf")
images = doc.page_images(0)

# Move the first image to position (100, 500)
doc.reposition_image(0, images[0]["name"], 100, 500)
doc.save("moved.pdf")
import { WasmPdfDocument } from "pdf-oxide-wasm";

const doc = new WasmPdfDocument(bytes);
const images = doc.pageImages(0);

// Move the first image to position (100, 500)
doc.repositionImage(0, images[0].name, 100, 500);
const output = doc.save();
doc.free();
let mut editor = DocumentEditor::open("input.pdf")?;
let images = editor.get_page_images(0)?;

// Move the first image
editor.reposition_image(0, &images[0].name, 100.0, 500.0)?;
editor.save("moved.pdf")?;

Изменение размеров изображений

Изменение размеров изображения без перемещения его позиции.

doc = PdfDocument("input.pdf")
images = doc.page_images(0)

# Resize the first image to 300x200 points
doc.resize_image(0, images[0]["name"], 300, 200)
doc.save("resized.pdf")
import { WasmPdfDocument } from "pdf-oxide-wasm";

const doc = new WasmPdfDocument(bytes);
const images = doc.pageImages(0);

// Resize the first image to 300x200 points
doc.resizeImage(0, images[0].name, 300, 200);
const output = doc.save();
doc.free();
let mut editor = DocumentEditor::open("input.pdf")?;
let images = editor.get_page_images(0)?;

editor.resize_image(0, &images[0].name, 300.0, 200.0)?;
editor.save("resized.pdf")?;

Установка полных границ изображения

Установка позиции и размера в одной операции.

doc = PdfDocument("input.pdf")
images = doc.page_images(0)

# Set position (72, 600) and size (468, 200)
doc.set_image_bounds(0, images[0]["name"], 72, 600, 468, 200)
doc.save("adjusted.pdf")
let mut editor = DocumentEditor::open("input.pdf")?;
let images = editor.get_page_images(0)?;

// x, y, width, height
editor.set_image_bounds(0, &images[0].name, 72.0, 600.0, 468.0, 200.0)?;
editor.save("adjusted.pdf")?;

Управление модификациями изображений

Очистка модификаций

Отмена всех ожидающих изменений изображений для страницы перед сохранением.

doc.clear_image_modifications(0)
editor.clear_image_modifications(0);

Проверка ожидающих модификаций

if doc.has_image_modifications(0):
    print("Page 0 has pending image changes")
if editor.has_image_modifications(0) {
    println!("Page 0 has pending image changes");
}

PdfImage DOM API (Rust)

DOM-уровневый PdfImage предоставляет богатые метаданные для каждого найденного на странице изображения.

Метод Возвращает Описание
id() ElementId Уникальный идентификатор элемента
bbox() Rect Позиция и размер on the page
format() ImageFormat Формат изображения (JPEG, PNG, etc.)
dimensions() (u32, u32) Ширина и высота в пикселях
aspect_ratio() f32 Соотношение ширина / высота
is_grayscale() bool True if grayscale image
alt_text() Option<&str> Альтернативный текст для доступности
set_alt_text(text) () Установить альтернативный текст для доступности
resolution() Option<(f32, f32)> DPI как (горизонтальное, вертикальное)
horizontal_dpi() Option<f32> Горизонтальное DPI
vertical_dpi() Option<f32> Вертикальное DPI
is_high_resolution() bool Разрешение >= 300 DPI
is_medium_resolution() bool Разрешение от 150 до 300 DPI
is_low_resolution() bool Разрешение < 150 DPI

Поиск изображений в области

use pdf_oxide::geometry::Rect;

let page = doc.page(0)?;

// Find images in the top half of the page
let region = Rect::new(0.0, 396.0, 612.0, 396.0);
let top_images = page.find_images_in_region(region);
println!("Found {} images in top half", top_images.len());

Установка альтернативного текста для доступности

let mut page = doc.page(0)?;
let images = page.find_images();

for img in &images {
    if img.alt_text().is_none() {
        page.set_image_alt_text(img.id(), "Descriptive alt text")?;
    }
}

doc.save_page(page)?;

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

DocumentEditor Image Methods

Метод Возвращает Описание
get_page_images(page) Result<Vec<ImageInfo>> Список всех изображений на странице
reposition_image(page, name, x, y) Result<()> Переместить изображение to new position
resize_image(page, name, w, h) Result<()> Изменить размеры изображения
set_image_bounds(page, name, x, y, w, h) Result<()> Установить позицию и размер
clear_image_modifications(page) () Отменить ожидающие изменения
has_image_modifications(page) bool Проверить наличие ожидающих изменений

Продвинутый пример: центрирование всех изображений

use pdf_oxide::editor::DocumentEditor;

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

for page_idx in 0..count {
    let media_box = editor.get_page_media_box(page_idx)?;
    let page_width = media_box[2] - media_box[0];

    let images = editor.get_page_images(page_idx)?;
    for img in &images {
        let img_width = img.bounds[2];
        let centered_x = (page_width - img_width) / 2.0;

        editor.reposition_image(page_idx, &img.name, centered_x, img.bounds[1])?;
    }
}

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

Продвинутый пример: масштабирование по ширине

from pdf_oxide import PdfDocument

doc = PdfDocument("photos.pdf")

for page_idx in range(doc.page_count()):
    media_box = doc.page_media_box(page_idx)
    page_width = media_box[2] - media_box[0]
    margin = 72  # 1 inch

    images = doc.page_images(page_idx)
    for img in images:
        target_width = page_width - 2 * margin
        scale = target_width / img["width"]
        new_height = img["height"] * scale

        doc.set_image_bounds(
            page_idx, img["name"],
            margin, img["y"],
            target_width, new_height
        )

doc.save("fitted.pdf")

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