Skip to content

画像操作

PDF Oxide provides two levels of image manipulation: low-level operations via DocumentEditor for repositioning and resizing images by their XObjectの名前, and DOM-level access via PdfPage for querying image metadata. Both approaches work with images already embedded in the PDF.

ページ画像の取得

DocumentEditor: Low-Level Image Info

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 構造体には以下が含まれます:

Field Type 説明
name String XObjectの名前 (e.g., "Im0", "Image1")
bounds [f32; 4] 位置とサイズ [x, y, width, height]
matrix [f32; 6] Full transformation matrix [a, b, c, d, e, f]

PdfPage: DOM-Level Image Info

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!("アスペクト比: {:.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")?;

画像の全境界設定

1回の操作で位置とサイズの両方を設定します。

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 はページ上の各画像の豊富なメタデータを提供します。

Method Returns 説明
id() ElementId 一意の要素識別子
bbox() Rect 位置とサイズ on the page
format() ImageFormat 画像形式 (JPEG, PNG, etc.)
dimensions() (u32, u32) Width and height in pixels
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 Image Methods

Method Returns 説明
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 保留中の変更を確認

応用例: Center All Images

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

応用例: Scale to Fit Width

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

関連ページ