pdf-canvas 0.7.0

Generate PDF files in pure Rust. Currently, simple vector graphics and text set in the 14 built-in fonts are supported.
Documentation
///! Example program drawing mandalas on a page.
extern crate pdf_canvas;

use pdf_canvas::graphicsstate::{Color, Matrix};
use pdf_canvas::Pdf;
use std::env;
use std::f32::consts::PI;

/// Create a `mandala.pdf` file.
fn main() {
    // Open our pdf document.
    let mut document = Pdf::create("mandala.pdf").expect("Create PDF file");
    let mut args = env::args().skip(1);
    let n: u8 = args.next().map(|s| s.parse().expect("number")).unwrap_or(7);

    // Render a page with something resembling a mandala on it.
    document
        .render_page(600.0, 600.0, |c| {
            c.concat(Matrix::translate(300., 300.))?;
            c.set_stroke_color(Color::gray(0))?;
            let segment = 2. * PI / n as f32;
            for _i in 0..n {
                c.move_to(0., 33.5)?;
                c.line_to(0., 250.)?;
                let r = 99.;
                c.circle(0., r, r * 1.25 * segment)?;
                let d = 141.4;
                let rr = 36.;
                c.circle(0., d + rr, rr)?;
                c.stroke()?;
                c.concat(Matrix::rotate(segment))?;
            }
            c.concat(Matrix::rotate(segment / 2.))?;
            for _i in 0..n {
                let mut r0 = 58.66;
                let mut r = 0.7705 * r0 * segment;
                for _j in 0..(n + 1) / 3 {
                    c.circle(0., r0, r)?;
                    let r2 = 1.058 * r;
                    r0 = r0 + r + r2;
                    r = r2;
                }
                c.stroke()?;
                c.concat(Matrix::rotate(segment))?;
            }

            Ok(())
        })
        .unwrap();
    document.finish().unwrap();
}