Expand description
§deckmint
Create PowerPoint .pptx presentations programmatically in Rust.
Works on native targets and compiles to WASM via the companion deckmint-wasm crate.
§Quick start
use deckmint::{Presentation, ShapeType};
use deckmint::objects::text::TextOptionsBuilder;
use deckmint::objects::shape::ShapeOptionsBuilder;
let mut pres = Presentation::new();
pres.title = "My Presentation".to_string();
let slide = pres.add_slide();
slide.add_text(
"Hello, World!",
TextOptionsBuilder::new()
.x(1.0).y(1.5).w(8.0).h(1.5)
.font_size(36.0)
.bold()
.build()
);
slide.add_shape(
ShapeType::Rect,
ShapeOptionsBuilder::new()
.x(1.0).y(3.0).w(4.0).h(2.0)
.fill_color("#4472C4")
.build()
);
let bytes = pres.write().expect("failed to generate pptx");
// bytes is a valid .pptx ZIP archive§Tables
use deckmint::Presentation;
use deckmint::objects::table::{TableOptionsBuilder, TableCell};
let mut pres = Presentation::new();
let slide = pres.add_slide();
slide.add_table(
vec![
vec![TableCell::new("Name"), TableCell::new("Score")],
vec![TableCell::new("Alice"), TableCell::new("95")],
],
TableOptionsBuilder::new()
.x(1.0).y(1.5).w(8.0)
.col_w(vec![4.0, 4.0])
.font_size(14.0)
.build(),
);§Charts
use deckmint::{Presentation, ChartType, ChartOptionsBuilder, ChartSeries};
let mut pres = Presentation::new();
let slide = pres.add_slide();
let series = vec![
ChartSeries::new("Q1", vec!["Jan", "Feb", "Mar"], vec![10.0, 20.0, 30.0]),
];
slide.add_chart(
ChartType::Bar,
series,
ChartOptionsBuilder::new()
.x(0.5).y(1.0).w(9.0).h(4.5)
.title("Monthly Sales")
.show_value()
.build(),
);§Images
use deckmint::Presentation;
use deckmint::objects::image::ImageOptionsBuilder;
let png_bytes: Vec<u8> = std::fs::read("logo.png").unwrap();
let mut pres = Presentation::new();
let slide = pres.add_slide();
slide.add_image_from(
ImageOptionsBuilder::new()
.bytes(png_bytes, "png")
.bounds(3.0, 2.0, 4.0, 3.0)
).unwrap();§Animations
use deckmint::{Presentation, AnimationEffect, Direction};
use deckmint::objects::text::TextOptionsBuilder;
let mut pres = Presentation::new();
let slide = pres.add_slide();
slide.add_text(
"I fly in!",
TextOptionsBuilder::new()
.x(1.0).y(2.0).w(8.0).h(1.5)
.animation(AnimationEffect::fly_in(Direction::Left))
.build(),
);§Equations (requires math feature, enabled by default)
use deckmint::Presentation;
use deckmint::objects::text::TextOptionsBuilder;
let mut pres = Presentation::new();
let slide = pres.add_slide();
// Standalone equation
slide.add_equation(
r"x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}",
TextOptionsBuilder::new().bounds(1.0, 1.5, 8.0, 1.0).build(),
).unwrap();
// Inline math mixed with text (delimited by $...$)
slide.add_text_with_math(
r"The area of a circle is $A = \pi r^2$.",
TextOptionsBuilder::new().bounds(1.0, 3.0, 8.0, 1.0).font_size(18.0).build(),
).unwrap();§Grid layout
The layout module provides a layout::GridLayoutBuilder for
arranging objects in rows and columns with gutters and padding.
§Output
Presentation::write()returnsVec<u8>(the.pptxZIP archive).Presentation::write_to_file(path)writes directly to disk.
Re-exports§
pub use enums::AlignH;pub use enums::AlignV;pub use enums::ChartType;pub use enums::SchemeColor;pub use enums::ShapeType;pub use error::PptxError;pub use presentation::Presentation;pub use presentation::SectionDef;pub use presentation::SlideLayout;pub use presentation::SlideMasterDef;pub use presentation::ThemeProps;pub use slide::Slide;pub use types::AnimationEffect;pub use types::AnimationEffectType;pub use types::AnimationTrigger;pub use types::TextTarget;pub use types::CheckerboardDir;pub use types::CustomGeomPoint;pub use types::Direction;pub use types::ShapeVariant;pub use types::SplitOrientation;pub use types::StripDir;pub use types::BorderProps;pub use types::BorderType;pub use types::Color;pub use types::Coord;pub use types::FieldType;pub use types::FillType;pub use types::GlowProps;pub use types::GradientFill;pub use types::GradientStop;pub use types::GradientType;pub use types::HyperlinkAction;pub use types::HyperlinkProps;pub use types::ImageColorAdjust;pub use types::Margin;pub use types::PatternFill;pub use types::PatternType;pub use types::PositionProps;pub use types::PresLayout;pub use types::ShadowProps;pub use types::ShadowType;pub use types::BevelPreset;pub use types::BevelProps;pub use types::Camera3D;pub use types::CameraPreset;pub use types::LightDirection;pub use types::LightRig3D;pub use types::LightRigType;pub use types::LineCap;pub use types::LineJoin;pub use types::MaterialPreset;pub use types::Rotation3D;pub use types::Scene3DProps;pub use types::Shape3DProps;pub use types::ShapeFillProps;pub use types::ShapeLineProps;pub use types::SlideNumberProps;pub use types::TextOutlineProps;pub use types::ThemeColorMod;pub use types::TransitionDir;pub use types::TransitionProps;pub use types::TransitionSpeed;pub use types::TransitionType;pub use objects::chart::BarDir;pub use objects::chart::BarGrouping;pub use objects::chart::ChartOptions;pub use objects::chart::ChartOptionsBuilder;pub use objects::chart::ChartSeries;pub use objects::chart::LegendPos;pub use objects::text::char_range_for_run;pub use objects::text::TabStop;pub use objects::text::TextFit;pub use objects::text::TextRunBuilder;pub use objects::connector::ConnectorEndpoint;pub use objects::connector::ConnectorOptions;pub use objects::connector::ConnectorOptionsBuilder;pub use objects::connector::ConnectorType;pub use objects::media::MediaOptions;pub use objects::media::MediaOptionsBuilder;pub use objects::media::MediaType;pub use objects::group::GroupOptions;pub use objects::group::GroupOptionsBuilder;pub use layout::CellRect;pub use layout::GridLayout;pub use layout::GridLayoutBuilder;pub use layout::GridTrack;pub use layout::center_in;pub use layout::align_left;pub use layout::align_right;pub use layout::align_top;pub use layout::align_bottom;pub use layout::split_h;pub use layout::split_v;