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 (наприклад, "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"Dimensions: {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!("Dimensions: {:?}", 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);
    }
}

Переміщення зображень

Переміщення зображення на нову позицію на сторінці без зміни розміру.

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 Позиція та розмір на сторінці
format() ImageFormat Формат зображення (JPEG, PNG тощо)
dimensions() (u32, u32) Ширина та висота у пікселях
aspect_ratio() f32 Співвідношення ширини/висоти
is_grayscale() bool True, якщо зображення у відтінках сірого
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

Метод Повертає Опис
get_page_images(page) Result<Vec<ImageInfo>> Перелічити всі зображення на сторінці
reposition_image(page, name, x, y) Result<()> Перемістити зображення на нову позицію
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")

Пов’язані сторінки