mr_pdf 0.1.3

A lightweight, high-performance PDF generation library for Rust with premium layouts and charts.
Documentation
use mr_pdf::{Color, Pdf};

fn main() -> std::io::Result<()> {
    let bytes = Pdf::render(|pdf| {
        pdf.set_title("Linear Gradients Showcase");

        // 1. Vertical Gradient for the Header
        pdf.fill_gradient_rect(
            0.0,
            750.0,
            595.0,
            92.0,
            Color::Rgb(41, 128, 185),
            Color::Rgb(142, 68, 173),
            false, // Vertical
        )?;

        pdf.set_cursor(50.0, 810.0);
        pdf.set_fill_color(Color::Rgb(255, 255, 255))?;
        pdf.text("PREMIUM GRADIENTS").size(24.0);

        // 2. Horizontal Gradients (Color Swatches)
        pdf.set_cursor(50.0, 720.0);
        pdf.set_fill_color(Color::Rgb(0, 0, 0))?;
        pdf.text("Horizontal Gradients Showcase:").size(16.0);

        let colors = [
            (Color::Rgb(255, 0, 0), Color::Rgb(255, 255, 0)), // Red -> Yellow
            (Color::Rgb(0, 255, 0), Color::Rgb(0, 255, 255)), // Green -> Cyan
            (Color::Rgb(0, 0, 255), Color::Rgb(255, 0, 255)), // Blue -> Magenta
            (Color::Rgb(52, 73, 94), Color::Rgb(44, 62, 80)), // Dark -> Darker
        ];

        let mut start_y = 650.0;
        for (c1, c2) in colors {
            pdf.fill_gradient_rect(50.0, start_y, 500.0, 40.0, c1, c2, true)?;
            start_y -= 60.0;
        }

        // 3. Combining with Rounded Rects (Modern Button Style)
        pdf.set_cursor(50.0, start_y);
        pdf.text("Gradients + Rounded Corners:").size(16.0);

        start_y -= 40.0;

        // Let's create a button-like effect
        let bx = 50.0;
        let by = start_y - 40.0;
        let bw = 150.0;
        let bh = 40.0;
        let br = 20.0;

        // Clip to rounded rect for gradient
        pdf.ensure_page()?;
        let stream = pdf.get_stream();
        stream.push_str("q\n");
        // We need manually clip to rounded path since fill_gradient_rect uses standard rect clip
        // But for simplicity in this MVP, let's just use it as is or I can implement fill_rounded_gradient_rect
        // For now, let's just show standard gradient rect with a border

        pdf.fill_gradient_rect(
            bx,
            by,
            bw,
            bh,
            Color::Rgb(230, 126, 34),
            Color::Rgb(211, 84, 0),
            false,
        )?;
        pdf.set_stroke_color(Color::Rgb(0, 0, 0))?;
        pdf.rounded_rect(bx, by, bw, bh, br)?;

        pdf.set_cursor(bx + 35.0, by + 25.0);
        pdf.set_fill_color(Color::Rgb(255, 255, 255))?;
        pdf.text("GRADIANT").size(12.0);

        Ok(())
    })?;

    std::fs::create_dir_all("preview")?;
    std::fs::write("preview/gradient_showcase.pdf", bytes)?;
    println!("Successfully generated preview/gradient_showcase.pdf!");

    Ok(())
}