Графика, паттерны и заливки
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, либо вызывайте CLI на Rust для произвольной отрисовки.
Быстрый пример
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();
Операции с цветами
// Цвет RGBs (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 variants: Butt (default), Round, Square
LineJoin variants: Miter (default), 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()
Заливка и обводка путей
| Method | Description |
|---|---|
.stroke() |
Обвести контур |
.fill() |
Заполнить внутренность контура (ненулевое намотывание) |
.fill_even_odd() |
Заполнить по правилу чётности-нечётности |
.fill_and_stroke() |
Заполнить и обвести |
.fill_and_stroke_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();
Методы конфигурации
| Method | Description |
|---|---|
.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() |
Returns (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
);
Методы конфигурации
| Method | Description |
|---|---|
.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();
Методы конфигурации
| Method | Description |
|---|---|
.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_fill(b) |
Режим оверпринта для заливки |
Варианты BlendMode
Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, HardLight, SoftLight
Предустановки градиентов
Вспомогательные методы для типичных градиентных паттернов:
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 создания таблиц
- Создание аннотаций — добавление аннотаций на страницы