Skip to main content

Crate pptx_rs

Crate pptx_rs 

Source
Expand description

pptx-rs —— Rust 实现的 PowerPoint .pptx 读写库,对标 python-pptx

§项目定位

pptx-rs 旨在以 Rust 的强类型 + 零 unsafe + 零异步的“现代化“姿态,完整复刻 python-pptx 提供的 PowerPoint 文档读写能力,并在性能与可维护性上做到更优。 当前处于 0.3.0 阶段。

§顶层模块结构

  • Presentation / Slide / Slides:高阶面向用户 API。
  • shape:形状(AutoShape / Picture / Group / Connector / Table / TextBox)。
  • opc:OPC(Open Packaging Convention)容器层 —— zip、Part、关系。
  • oxml:OOXML 模型层 —— PresentationML / DrawingML 的强类型 XML 模型。
  • units / RGBColor:EMU / Pt / Inches / 颜色。
  • crypto:.pptx 文件加密(ECMA-376 Agile Encryption:AES-256-CBC + SHA-512)。
  • ppt97:.ppt 97-2003 二进制格式支持(水印注入 + RC4 CryptoAPI 加密)。
  • Error / Result:错误与 Result 别名。

§三层架构(自下而上)

  高阶 API 层    Presentation / Slide / Shapes
       ↑ 借用
  OOXML 模型层   oxml/{sp, pic, slide, master, layout, ...}
       ↑ 序列化
  OPC 容器层    opc/{Part, Relationships, ContentTypes}
       ↑ 读写
  zip crate

下层绝不依赖上层。详见 架构总览pptx-rs-architecture SKILL

§最小示例

use pptx_rs::Presentation;

let mut prs = Presentation::new().unwrap();
let counter = prs.id_counter();
let slide = prs.slides_mut().add_slide(counter).unwrap();
let mut tb = slide.shapes_mut().add_textbox(
    pptx_rs::Inches(1.0), pptx_rs::Inches(1.0),
    pptx_rs::Inches(8.0), pptx_rs::Inches(1.0),
).unwrap();
tb.set_text("hello");
prs.save("hello.pptx").unwrap();

§单位与坐标系

全部几何计算均以 EMU(English Metric Unit,i64)为内部单位,理由:

  • OOXML 中所有几何属性(off / ext / 行高 / 列宽 / 边框)都是整数 EMU;
  • 整数运算保证无浮点精度漂移
  • 与其他 Office 工具(python-pptx / Open XML SDK)互操作零成本。

外部 API 通过 Inches / Pt / Cm 三种 NewType 包装 + units::EmuExt 扩展 trait 提供便捷转换;类型系统会阻止“英寸和磅混用“的潜在 bug。

§错误处理

库内禁止 panic! / unwrap()。所有公开 API 返回 Result<T>,错误统一归入 enum Error 的 11 个变体(Io / Zip / Xml / Opc / Oxml / NotFound / IndexOutOfRange / NotImplemented / Encryption / Ppt97 / Other)。错误消息遵循小写 + 句末无标点

§公开 API 稳定性

0.3.x 期间:

  • pub 方法签名(方法名 / 参数 / 返回类型)—— 不承诺稳定,允许小调整;
  • pub 字段 —— 不承诺稳定,调整走 CHANGELOG 标注 internal
  • 破坏性变更 —— 需先 #[deprecated(note = "...")] 一段时间。

详见 更新日志project_rules.md

§路线图

详见 README.md 的“路线图“段更新日志pptx-rs-overview SKILL

§编译期开关说明

  • forbid(unsafe_code):库内绝对禁止 unsafe 块(与项目规则 §5 一致)。
  • deny(rust_2018_idioms):禁止 2015 风格的 idiom(#[macro_use]、路径写法等)。
  • warn(missing_debug_implementations):所有 pub 类型应实现 Debug(如未实现会警告)。

Re-exports§

pub use crate::error::Error;
pub use crate::error::Result;
pub use crate::units::Cm;
pub use crate::units::Emu;
pub use crate::units::EmuExt;
pub use crate::units::EmuPoint;
pub use crate::units::Inches;
pub use crate::units::Pt;
pub use crate::units::RGBColor;
pub use crate::oxml::simpletypes::Alignment;
pub use crate::oxml::simpletypes::Cap;
pub use crate::oxml::simpletypes::MsoAnchor;
pub use crate::oxml::simpletypes::MsoAutoSize;
pub use crate::oxml::simpletypes::MsoColorType;
pub use crate::oxml::simpletypes::MsoConnectorType;
pub use crate::oxml::simpletypes::MsoFillType;
pub use crate::oxml::simpletypes::MsoLineDashStyle;
pub use crate::oxml::simpletypes::MsoShapeType;
pub use crate::oxml::simpletypes::MsoThemeColorIndex;
pub use crate::oxml::simpletypes::PpAlign;
pub use crate::oxml::simpletypes::PpPlaceholderType;
pub use crate::oxml::simpletypes::PresetGeometry;
pub use crate::oxml::simpletypes::TextDirection;
pub use crate::oxml::simpletypes::TextWrapping;
pub use crate::oxml::simpletypes::Underline;
pub use crate::oxml::color::Color;
pub use crate::oxml::color::ColorFormat;
pub use crate::oxml::color::ColorRole;
pub use crate::oxml::color::PresetColor;
pub use crate::oxml::color::SchemeColor;
pub use crate::oxml::sppr::Dash;
pub use crate::oxml::sppr::EffectList;
pub use crate::oxml::sppr::Fill;
pub use crate::oxml::sppr::FillFormat;
pub use crate::oxml::sppr::GlowEffect;
pub use crate::oxml::sppr::Line;
pub use crate::oxml::sppr::LineFormat;
pub use crate::oxml::sppr::ReflectionEffect;
pub use crate::oxml::sppr::ShadowEffect;
pub use crate::oxml::sppr::ShapeProperties;
pub use crate::oxml::sppr::SoftEdgeEffect;
pub use crate::oxml::sppr::Transform;
pub use crate::oxml::txbody::BodyProperties;
pub use crate::oxml::txbody::Font;
pub use crate::oxml::txbody::Indent;
pub use crate::oxml::txbody::Inset;
pub use crate::oxml::txbody::Paragraph;
pub use crate::oxml::txbody::ParagraphFormat;
pub use crate::oxml::txbody::ParagraphProperties;
pub use crate::oxml::txbody::Run;
pub use crate::oxml::txbody::RunProperties;
pub use crate::oxml::txbody::TextBody;
pub use crate::oxml::txbody::TextFrame;
pub use crate::oxml::shape::ExtensionEntry;
pub use crate::oxml::shape::ExtensionList;
pub use crate::oxml::shape::ShapeLocks;
pub use crate::oxml::shape::ShapeStyle;
pub use crate::oxml::shape::StyleRef;
pub use crate::oxml::shape::LockType;
pub use crate::oxml::sppr::Backdrop;
pub use crate::oxml::sppr::Bevel;
pub use crate::oxml::sppr::Camera;
pub use crate::oxml::sppr::CameraPreset;
pub use crate::oxml::sppr::LightRig;
pub use crate::oxml::sppr::LightRigDirection;
pub use crate::oxml::sppr::LightRigType;
pub use crate::oxml::sppr::MaterialPreset;
pub use crate::oxml::sppr::Point3d;
pub use crate::oxml::sppr::Rotation3d;
pub use crate::oxml::sppr::Scene3d;
pub use crate::oxml::sppr::Sp3d;
pub use crate::oxml::chart::Chart;
pub use crate::oxml::chart::ChartCategory;
pub use crate::oxml::chart::ChartData;
pub use crate::oxml::chart::ChartSeries;
pub use crate::oxml::chart::ChartType;
pub use crate::oxml::section::Section;
pub use crate::oxml::section::SectionList;
pub use crate::oxml::ole::OleObject;
pub use crate::oxml::ole::OLE_GRAPHIC_DATA_URI;
pub use crate::oxml::shape::MediaKind;
pub use crate::presentation::AudioEntry;
pub use crate::presentation::DiagramEntry;
pub use crate::presentation::VideoEntry;
pub use crate::oxml::shape::SmartArtRef;
pub use crate::shape::smartartshape::SmartArtShape;
pub use crate::oxml::diagram::ColorsDef;
pub use crate::oxml::diagram::DataModel;
pub use crate::oxml::diagram::DataModelConnection;
pub use crate::oxml::diagram::DataModelPoint;
pub use crate::oxml::diagram::LayoutCategory;
pub use crate::oxml::diagram::LayoutDef;
pub use crate::oxml::diagram::QuickStyleDef;
pub use crate::oxml::diagram::StyleLabel;
pub use crate::crypto::ModifyProtection;
pub use crate::presentation::Presentation;
pub use crate::presentation::CoreProperties;
pub use crate::presentation::CustomProperties;
pub use crate::presentation::CustomPropertyValue;
pub use crate::slide::Shapes;
pub use crate::slide::ShapesMut;
pub use crate::slide::Slide;
pub use crate::slide::SlideBackground;
pub use crate::slide::SlideId;
pub use crate::slide::SlideRef;
pub use crate::slide::Slides;
pub use crate::slide_layouts::Placeholder;
pub use crate::slide_layouts::SlideLayout;
pub use crate::slide_layouts::SlideLayoutRef;
pub use crate::slide_layouts::SlideLayouts;
pub use crate::slide_masters::SlideMaster;
pub use crate::slide_masters::SlideMasterRef;
pub use crate::slide_masters::SlideMasters;
pub use crate::notes_masters::NotesMasterRef;
pub use crate::notes_masters::NotesMasters;
pub use crate::oxml::notesmaster::NotesMaster;
pub use crate::oxml::comments::Comment;
pub use crate::oxml::comments::CommentAuthor;
pub use crate::oxml::comments::CommentAuthorList;
pub use crate::oxml::comments::CommentList;
pub use crate::oxml::slide::MorphOption;
pub use crate::oxml::slide::SplitOrientation;
pub use crate::oxml::slide::Transition;
pub use crate::oxml::slide::TransitionDirection;
pub use crate::oxml::slide::TransitionSpeed;
pub use crate::oxml::slide::TransitionType;

Modules§

crypto
加密与保护模块:修改密码保护 + ECMA-376 Agile Encryption。
error
错误类型与 Result 别名。
notes_masters
备注母版(Notes Master)—— 高阶 API(TODO-045)。
opc
OPC(Open Packaging Convention)容器层。
oxml
OOXML XML 模型层。
ppt97
PowerPoint 97-2003 二进制格式(.ppt)支持模块。
presentation
演示文稿(Presentation)—— 顶层 API
shape
高阶形状:AutoShape / Picture / Group / Connector / Table / TextBox / Freeform。
slide
单张幻灯片(Slide)—— 高阶 API
slide_layouts
幻灯片版式(Slide Layout)—— 高阶 API
slide_masters
幻灯片母版(Slide Master)—— 高阶 API
units
单位、基本类型与颜色。