Skip to content

API графіки

PDF Oxide надає низькорівневі графічні примітиви через ContentStreamBuilder для малювання контурів та фігур, TilingPatternBuilder для повторюваних патернів, конструктори градієнтів для лінійних та радіальних градієнтів та ExtGStateBuilder для прозорості та режимів накладання.

Охоплення прив’язок. Примітиви FluentPageBuilderrect(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();
}

Пов’язані сторінки