Skip to main content

ofd_core/model/
page.rs

1//! 页树与页对象(见 GB/T 33190—2016 7.6、7.7)。
2//!
3//! - 页树 `Pages` 见图 12、表 11:通过前序遍历叶节点确定页顺序;
4//! - 页对象(`Content.xml` 的根节点 `Page`)见图 13、表 12;
5//! - 模板页 `CT_TemplatePage` 见图 14、表 13;
6//! - 图层 `CT_Layer` 见图 15、表 14。
7//!
8//! 图层内部的页面图元对象(文字、图形、图像、复合对象,见第 8~13 章)
9//! 不属于基础结构,未在此建模,反序列化时会被忽略。
10
11use serde::{Deserialize, Serialize};
12
13use crate::model::common::Actions;
14use crate::model::document::CtPageArea;
15use crate::model::graphics::PageBlock;
16use crate::types::{StId, StLoc, StRefId};
17
18/// 页树(见表 11)。
19#[derive(Debug, Clone, Default, Deserialize, Serialize)]
20pub struct Pages {
21    /// 页节点列表,页顺序即此处的出现顺序(必选)。
22    #[serde(rename = "Page", default)]
23    pub pages: Vec<PageRef>,
24}
25
26/// 页树中的页节点(见表 11)。
27///
28/// 注意:这是页树中对页的*引用*,仅含标识与指向页内容的路径;
29/// 真正的页内容是 [`PageObject`]。
30#[derive(Debug, Clone, Default, Deserialize, Serialize)]
31pub struct PageRef {
32    /// 声明该页的标识,不能与已有标识重复(必选)。
33    #[serde(rename = "@ID")]
34    pub id: StId,
35    /// 指向页对象描述文件(必选)。
36    #[serde(rename = "@BaseLoc")]
37    pub base_loc: StLoc,
38}
39
40/// 页对象,即页内容描述文件(`Content.xml`)的根节点(见表 12)。
41#[derive(Debug, Clone, Default, Deserialize, Serialize)]
42pub struct PageObject {
43    /// 该页所使用的模板页,可使用多个(可选)。
44    #[serde(rename = "Template", default)]
45    pub templates: Vec<Template>,
46    /// 定义该页页面区域的大小和位置,仅对该页有效(可选)。
47    #[serde(rename = "Area")]
48    pub area: Option<CtPageArea>,
49    /// 页资源,指向该页使用的资源文件(可选)。
50    #[serde(rename = "PageRes", default)]
51    pub page_res: Vec<StLoc>,
52    /// 页面内容描述;该节点不存在时表示空白页(可选)。
53    #[serde(rename = "Content")]
54    pub content: Option<Content>,
55    /// 与页面关联的动作序列(可选)。
56    #[serde(rename = "Actions")]
57    pub actions: Option<Actions>,
58}
59
60impl PageObject {
61    /// 是否为空白页(无 `Content` 节点)。
62    pub fn is_blank(&self) -> bool {
63        self.content.is_none()
64    }
65}
66
67/// 页面对模板页的引用(见表 12)。
68#[derive(Debug, Clone, Default, Deserialize, Serialize)]
69pub struct Template {
70    /// 引用文档公共数据中定义的模板页标识(必选)。
71    #[serde(rename = "@TemplateID")]
72    pub template_id: StRefId,
73    /// 控制模板在页面中的呈现顺序,默认 `Background`(可选)。
74    #[serde(rename = "@ZOrder")]
75    pub z_order: Option<String>,
76}
77
78/// 页面内容描述(见表 12)。
79#[derive(Debug, Clone, Default, Deserialize, Serialize)]
80pub struct Content {
81    /// 层节点,一页可包含一个或多个层(必选)。
82    #[serde(rename = "Layer", default)]
83    pub layers: Vec<CtLayer>,
84}
85
86/// `CT_Layer`:图层(见表 14、表 15)。
87///
88/// 图层内部的图元对象(文字/图形/图像/复合对象,见 [`PageBlock`])属于页面
89/// 描述(第 8 章起);它们按出现顺序保存在 [`objects`](CtLayer::objects) 中,
90/// 供 [`crate::render`] 渲染器按叠放次序绘制。
91#[derive(Debug, Clone, Default, Deserialize, Serialize)]
92pub struct CtLayer {
93    /// 图层标识。
94    #[serde(rename = "@ID")]
95    pub id: Option<StId>,
96    /// 层类型,取值 `Body`/`Foreground`/`Background`,默认 `Body`(可选)。
97    #[serde(rename = "@Type")]
98    pub layer_type: Option<String>,
99    /// 图层的绘制参数,引用资源文件中定义的绘制参数标识(可选)。
100    #[serde(rename = "@DrawParam")]
101    pub draw_param: Option<StRefId>,
102    /// 图层内的页面图元对象,按文档顺序排列。
103    #[serde(rename = "$value", default)]
104    pub objects: Vec<PageBlock>,
105}
106
107/// `CT_TemplatePage`:模板页(见表 13)。
108///
109/// 模板页内容结构和普通页相同,其内容文件同样反序列化为 [`PageObject`]。
110#[derive(Debug, Clone, Default, Deserialize, Serialize)]
111pub struct CtTemplatePage {
112    /// 模板页的标识,不能与已有标识重复(必选)。
113    #[serde(rename = "@ID")]
114    pub id: StId,
115    /// 指向模板页内容描述文件(必选)。
116    #[serde(rename = "@BaseLoc")]
117    pub base_loc: StLoc,
118    /// 模板页名称(可选)。
119    #[serde(rename = "@Name")]
120    pub name: Option<String>,
121    /// 模板页的默认图层类型/呈现顺序,默认 `Background`(可选)。
122    #[serde(rename = "@ZOrder")]
123    pub z_order: Option<String>,
124}