API графіки
PDF Oxide надає низькорівневі графічні примітиви через ContentStreamBuilder для малювання контурів та фігур, TilingPatternBuilder для повторюваних патернів, конструктори градієнтів для лінійних та радіальних градієнтів та ExtGStateBuilder для прозорості та режимів накладання.
Охоплення прив’язок. Примітиви
FluentPageBuilder—rect(x, y, w, h),filled_rect(x, y, w, h, color)іline(x1, y1, x2, y2)— доступні в Rust, Python, Node, C#, Go та WASM з v0.3.38 — див. DocumentBuilder → Графічні примітиви. Повна поверхняContentStreamBuilderна цій сторінці (довільні контури, криві Безьє, кольорові простори,TilingPatternBuilder,LinearGradientBuilder/RadialGradientBuilder,ExtGStateBuilder) залишається лише в Rust. З інших прив’язок використовуйте прості примітиви черезDocumentBuilder, генеруйте PDF черезPdf::from_html_css/Pdf::from_markdown/Pdf::from_imagesабо викликайте Rust-CLI для довільного малювання.
Швидкий приклад
Rust
use pdf_oxide::writer::{ContentStreamBuilder, LineCap, LineJoin};
let mut builder = ContentStreamBuilder::new();
builder
.save_state()
.set_stroke_color(0.0, 0.0, 1.0) // Blue stroke
.set_fill_color(0.8, 0.8, 1.0) // Light blue fill
.set_line_width(2.0)
.rect(72.0, 600.0, 200.0, 100.0)
.fill_and_stroke()
.restore_state();
ContentStreamBuilder – примітиви малювання
ContentStreamBuilder генерує оператори потоку вмісту PDF для відмальовування графіки на сторінці.
Операції з контурами
use pdf_oxide::writer::ContentStreamBuilder;
let mut cs = ContentStreamBuilder::new();
// Move/Line/Curve
cs.move_to(72.0, 700.0)
.line_to(200.0, 700.0)
.line_to(200.0, 600.0)
.close_path()
.stroke();
// Rectangle
cs.rect(72.0, 500.0, 150.0, 80.0)
.fill();
// Bezier curve
cs.move_to(72.0, 400.0)
.curve_to(100.0, 450.0, 200.0, 350.0, 250.0, 400.0)
.stroke();
Операції з кольором
// RGB colors (0.0 to 1.0)
cs.set_fill_color(1.0, 0.0, 0.0); // Red fill
cs.set_stroke_color(0.0, 0.5, 0.0); // Green stroke
// Grayscale
cs.set_fill_color_gray(0.5); // 50% gray fill
cs.set_stroke_color_gray(0.0); // Black stroke
// CMYK
cs.set_fill_color_cmyk(0.0, 1.0, 1.0, 0.0); // Red in CMYK
cs.set_stroke_color_cmyk(1.0, 0.0, 0.0, 0.0); // Cyan stroke
Стиль лінії
use pdf_oxide::writer::{ContentStreamBuilder, LineCap, LineJoin};
let mut cs = ContentStreamBuilder::new();
cs.set_line_width(2.0)
.set_line_cap(LineCap::Round)
.set_line_join(LineJoin::Round)
.set_miter_limit(10.0)
.set_dash_pattern(vec![5.0, 3.0], 0.0); // 5pt dash, 3pt gap
Варіанти LineCap: Butt (за замовчуванням), Round, Square
Варіанти LineJoin: Miter (за замовчуванням), Round, Bevel
Стан графіки
// Save/restore state for isolated operations
cs.save_state()
.set_fill_color(1.0, 0.0, 0.0)
.rect(100.0, 100.0, 50.0, 50.0)
.fill()
.restore_state();
// State is restored to what it was before save_state()
Заливка та обведення контуру
| Метод | Опис |
|---|---|
.stroke() |
Обвести контур |
.fill() |
Залити внутрішню частину контуру (ненульова обмотка) |
.fill_even_odd() |
Залити за правилом even-odd |
.fill_and_stroke() |
Залити та обвести |
.fill_and_stroke_even_odd() |
Залити (even-odd) та обвести |
.close_and_stroke() |
Замкнути контур, потім обвести |
.close_fill_and_stroke() |
Замкнути, залити та обвести |
.end_path() |
Завершити контур без малювання |
Відсікання
// Clip to rectangle, then draw inside
cs.save_state()
.rect(100.0, 100.0, 200.0, 200.0)
.clip()
.end_path()
// Everything drawn here is clipped to the rectangle
.set_fill_color(1.0, 0.0, 0.0)
.rect(50.0, 50.0, 300.0, 300.0) // Only visible within clip
.fill()
.restore_state();
Трансформації
// Apply transformation matrix [a b c d e f]
cs.save_state()
.transform(1.0, 0.0, 0.0, 1.0, 100.0, 200.0) // Translate
.rect(0.0, 0.0, 50.0, 50.0)
.fill()
.restore_state();
ContentStreamOp Enum
Для максимального контролю будуйте операції безпосередньо:
use pdf_oxide::writer::ContentStreamOp;
let ops = vec![
ContentStreamOp::SaveState,
ContentStreamOp::SetLineWidth(2.0),
ContentStreamOp::SetStrokeColorRGB(0.0, 0.0, 1.0),
ContentStreamOp::MoveTo(72.0, 500.0),
ContentStreamOp::LineTo(300.0, 500.0),
ContentStreamOp::Stroke,
ContentStreamOp::RestoreState,
];
TilingPatternBuilder – повторювані патерни
Мозаїчні патерни повторюють невелику комірку по всій площі.
use pdf_oxide::writer::{TilingPatternBuilder, PatternPaintType, PatternTilingType};
// Striped pattern
let (pattern_dict, content_bytes) = TilingPatternBuilder::new()
.bbox(0.0, 0.0, 10.0, 10.0)
.x_step(10.0)
.y_step(10.0)
.colored()
.tiling_type(PatternTilingType::ConstantSpacing)
.content_bytes(b"0.8 0 0 rg 0 0 5 10 re f".to_vec())
.build();
Методи конфігурації
| Метод | Опис |
|---|---|
.bbox(x, y, w, h) |
Задати обмежувальну рамку комірки патерну |
.x_step(step) |
Горизонтальний інтервал між комірками |
.y_step(step) |
Вертикальний інтервал між комірками |
.step(x, y) |
Задати обидва кроки одночасно |
.colored() |
Кольори визначаються у вмісті патерну |
.uncolored() |
Колір задається при використанні патерну |
.tiling_type(type) |
Задати алгоритм мозаїки |
.matrix(a, b, c, d, e, f) |
Застосувати трансформацію до патерну |
.content_bytes(bytes) |
Задати сирі байти потоку вмісту |
.build() |
Повертає (Object, Vec<u8>) |
PatternPresets
PDF Oxide включає попередньо визначені патерни для типових випадків використання:
use pdf_oxide::writer::PatternPresets;
// Access presets for common patterns like hatching, dots, etc.
LinearGradientBuilder – лінійні градієнти
Створення осьових (лінійних) градієнтних затінень.
use pdf_oxide::writer::{LinearGradientBuilder, GradientStop};
use pdf_oxide::layout::Color;
let (shading_dict, function_dict) = LinearGradientBuilder::new()
.from(0.0, 0.0)
.to(468.0, 0.0)
.add_stop(0.0, Color { r: 1.0, g: 0.0, b: 0.0 }) // Red
.add_stop(0.5, Color { r: 1.0, g: 1.0, b: 0.0 }) // Yellow
.add_stop(1.0, Color { r: 0.0, g: 0.0, b: 1.0 }) // Blue
.extend(true)
.build();
Скорочення для двох кольорів
use pdf_oxide::writer::LinearGradientBuilder;
use pdf_oxide::layout::Color;
let gradient = LinearGradientBuilder::two_color(
Color { r: 0.0, g: 0.0, b: 0.5 }, // Dark blue
Color { r: 0.5, g: 0.8, b: 1.0 }, // Light blue
);
Методи конфігурації
| Метод | Опис |
|---|---|
.from(x, y) |
Початкова точка градієнта |
.to(x, y) |
Кінцева точка градієнта |
.add_stop(pos, color) |
Додати точку кольору (позиція 0.0-1.0) |
.extend_start(bool) |
Продовжити градієнт до початкової точки |
.extend_end(bool) |
Продовжити градієнт після кінцевої точки |
.extend(bool) |
Задати обидва прапорці продовження |
RadialGradientBuilder – радіальні градієнти
Створення кругових градієнтних затінень.
use pdf_oxide::writer::RadialGradientBuilder;
use pdf_oxide::layout::Color;
let (shading_dict, function_dict) = RadialGradientBuilder::new()
.center(200.0, 400.0)
.radius(0.0, 150.0) // Inner radius 0, outer radius 150
.add_stop(0.0, Color { r: 1.0, g: 1.0, b: 1.0 }) // White center
.add_stop(1.0, Color { r: 0.0, g: 0.0, b: 0.5 }) // Dark blue edge
.build();
ExtGStateBuilder – прозорість і режими накладання
Керування прозорістю, режимами накладання та іншими параметрами стану графіки.
use pdf_oxide::writer::{ExtGStateBuilder, BlendMode};
let gs_dict = ExtGStateBuilder::new()
.fill_alpha(0.5) // 50% transparent fill
.stroke_alpha(0.8) // 80% opaque stroke
.blend_mode(BlendMode::Multiply)
.build();
Методи конфігурації
| Метод | Опис |
|---|---|
.fill_alpha(a) |
Непрозорість заливки (0.0 прозоро, 1.0 непрозоро) |
.stroke_alpha(a) |
Непрозорість обведення |
.blend_mode(mode) |
Задати режим накладання |
.line_width(w) |
Перевизначити товщину лінії |
.line_cap(cap) |
Перевизначити стиль закінчення лінії |
.line_join(join) |
Перевизначити стиль з’єднання ліній |
.miter_limit(limit) |
Перевизначити межу гострого кута |
.flatness(f) |
Допуск згладжування |
.overprint_stroke(b) |
Режим overprint для обведення |
.overprint_fill(b) |
Режим overprint для заливки |
Варіанти BlendMode
Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, HardLight, SoftLight
GradientPresets
Зручні методи для типових градієнтних патернів:
use pdf_oxide::writer::GradientPresets;
// Access preset gradient configurations
Розширений приклад
Малювання фону діаграми з градієнтом
use pdf_oxide::writer::{
ContentStreamBuilder, LinearGradientBuilder, ExtGStateBuilder, BlendMode,
};
use pdf_oxide::layout::Color;
let mut cs = ContentStreamBuilder::new();
// Draw chart area with rounded-corner appearance
cs.save_state()
.set_fill_color(0.95, 0.95, 0.97)
.rect(72.0, 200.0, 468.0, 400.0)
.fill()
.restore_state();
// Draw grid lines
cs.save_state()
.set_stroke_color(0.85, 0.85, 0.85)
.set_line_width(0.5);
for i in 0..5 {
let y = 200.0 + (i as f32 * 100.0);
cs.move_to(72.0, y).line_to(540.0, y).stroke();
}
cs.restore_state();
// Draw data bars
let values = [280.0, 350.0, 180.0, 420.0, 310.0];
let colors = [
(0.2, 0.5, 0.8),
(0.3, 0.7, 0.4),
(0.8, 0.3, 0.3),
(0.6, 0.4, 0.8),
(0.9, 0.6, 0.2),
];
for (i, (&val, &(r, g, b))) in values.iter().zip(colors.iter()).enumerate() {
let x = 100.0 + (i as f32 * 85.0);
cs.save_state()
.set_fill_color(r, g, b)
.rect(x, 200.0, 50.0, val)
.fill()
.restore_state();
}
Пов’язані сторінки
- Низькорівневий API DocumentBuilder – високорівнева побудова сторінок
- Відмальовування таблиць – API створення таблиць
- Створення анотацій – додавання анотацій на сторінки