Редагування зображень
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")
Пов’язані сторінки
- Огляд редагування – відкриття, метадані та процес збереження
- Редагування тексту – зміна тексту навколо зображень
- Операції зі сторінками – обрізання та зміна розміру сторінок
- Редагування анотацій – додавання підписів або нотаток біля зображень