#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Document {
pub pages: Vec<Page>,
pub metadata: DocumentMetadata,
}
#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DocumentMetadata {
pub created_ms: Option<i64>,
pub modified_ms: Option<i64>,
pub background_color: Option<Color>,
pub dark_mode_compatibility: Option<bool>,
pub page_dimensions: Option<(u32, u32)>,
pub page_ids: Vec<String>,
pub media_assets: Vec<MediaAsset>,
pub note_text: Option<RichTextBox>,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Page {
pub uuid: String,
pub width: u32,
pub height: u32,
pub content_bbox: BoundingBox,
pub background_color: Option<Color>,
pub template: Option<PageTemplate>,
pub strokes: Vec<Stroke>,
pub elements: Vec<PageElement>,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MediaAsset {
pub name: String,
pub mime_type: String,
pub data: Vec<u8>,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PageElement {
Image {
bbox: BoundingBox,
media_index: usize,
},
TextBox(RichTextBox),
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct RichTextBox {
pub bbox: BoundingBox,
pub rotation_degrees: Option<f64>,
pub text: String,
pub color: Option<Color>,
pub highlight_color: Option<Color>,
pub underline: bool,
pub font_size: Option<f32>,
pub runs: Vec<RichTextRun>,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct RichTextRun {
pub start: usize,
pub end: usize,
pub bold: bool,
pub italic: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PageTemplate {
pub id: u32,
pub source: PageTemplateSource,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PageTemplateSource {
BuiltIn,
CustomPdf {
page_index: u32,
},
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Stroke {
pub bbox: BoundingBox,
pub points: Vec<Point>,
pub pressures: Vec<f64>,
pub timestamps: Vec<i64>,
pub tilt_x: Vec<i64>,
pub tilt_y: Vec<i64>,
pub color: Option<Color>,
pub pen_width: f32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Point {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Color {
pub r: u8,
pub g: u8,
pub b: u8,
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BoundingBox {
pub x_min: f64,
pub y_min: f64,
pub x_max: f64,
pub y_max: f64,
}
impl Default for BoundingBox {
fn default() -> Self {
Self {
x_min: 0.0,
y_min: 0.0,
x_max: 0.0,
y_max: 0.0,
}
}
}