Skip to content

Bilder bearbeiten

PDF Oxide bietet zwei Ebenen der Bildbearbeitung: Low-Level-Operationen über DocumentEditor zum Repositionieren und Skalieren von Bildern nach ihrem XObject-Namen sowie DOM-Zugriff über PdfPage zum Abfragen von Bildmetadaten. Beide Ansätze arbeiten mit bereits im PDF eingebetteten Bildern.

Seitenbilder abrufen

DocumentEditor: Low-Level-Bildinformationen

Detaillierte Platzierungsinformationen für alle Bilder auf einer Seite abrufen, einschließlich XObject-Namen und Transformationsmatrizen.

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]
}

Die zurückgegebene ImageInfo-Struktur enthält:

Feld Typ Beschreibung
name String XObject-Name (e.g., "Im0", "Image1")
bounds [f32; 4] Position and size [x, y, width, height]
matrix [f32; 6] Full transformation matrix [a, b, c, d, e, f]

PdfPage: DOM-Level-Bildinformationen

Die DOM-API liefert reichhaltigere Metadaten zu jedem Bild.

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);
    }
}

Bilder repositionieren

Ein Bild auf der Seite an eine neue Position verschieben, ohne seine Größe zu ändern.

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")?;

Bilder skalieren

Die Abmessungen eines Bildes ändern, ohne seine Position zu verschieben.

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")?;

Vollständige Bildgrenzen setzen

Position und Größe in einer einzigen Operation setzen.

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")?;

Bildänderungen verwalten

Änderungen zurücksetzen

Alle ausstehenden Bildänderungen einer Seite vor dem Speichern verwerfen.

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

Auf ausstehende Änderungen prüfen

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)

Das DOM-Level PdfImage bietet umfangreiche Metadaten für jedes auf einer Seite gefundene Bild.

Methode Rückgabe Beschreibung
id() ElementId Eindeutiger Elementbezeichner
bbox() Rect Position and size on the page
format() ImageFormat Bildformat (JPEG, PNG, etc.)
dimensions() (u32, u32) Breite und Höhe in Pixeln
aspect_ratio() f32 Breite-/Höhe-Verhältnis
is_grayscale() bool True if grayscale image
alt_text() Option<&str> Accessibility alt text
set_alt_text(text) () Set accessibility alt text
resolution() Option<(f32, f32)> DPI als (horizontal, vertikal)
horizontal_dpi() Option<f32> Horizontal DPI
vertical_dpi() Option<f32> Vertical DPI
is_high_resolution() bool Resolution >= 300 DPI
is_medium_resolution() bool Resolution between 150-300 DPI
is_low_resolution() bool Resolution < 150 DPI

Bilder in einem Bereich finden

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());

Barrierefreiheits-Alternativtext setzen

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)?;

Vollständige API-Referenz

DocumentEditor-Bildmethoden

Methode Rückgabe Beschreibung
get_page_images(page) Result<Vec<ImageInfo>> List all images on a page
reposition_image(page, name, x, y) Result<()> Move image to new position
resize_image(page, name, w, h) Result<()> Change image dimensions
set_image_bounds(page, name, x, y, w, h) Result<()> Set position and size
clear_image_modifications(page) () Discard pending changes
has_image_modifications(page) bool Check for pending changes

Erweitertes Beispiel: Alle Bilder zentrieren

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")?;

Erweitertes Beispiel: Auf Breite skalieren

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")

Verwandte Seiten