Skip to main content

ofd_core/model/
document.rs

1//! 文档根节点 `Document.xml`(见 GB/T 33190—2016 7.5)。
2//!
3//! 文档根节点结构见图 5、属性见表 5;文档公共数据 `CT_CommonData` 见图 6、
4//! 表 6;页面区域 `CT_PageArea` 见图 7、表 7;权限声明、视图首选项、书签、
5//! 大纲等也在本章定义。
6
7use serde::{Deserialize, Serialize};
8
9use crate::model::common::Actions;
10use crate::model::common::CtDest;
11use crate::model::page::{CtTemplatePage, Pages};
12use crate::types::{StBox, StId, StLoc, StRefId};
13
14/// 文档根节点(见表 5)。
15#[derive(Debug, Clone, Deserialize, Serialize)]
16pub struct Document {
17    /// 文档公共数据,定义页面区域、公共资源等(必选)。
18    #[serde(rename = "CommonData")]
19    pub common_data: CommonData,
20    /// 页树,见 7.6(必选)。
21    #[serde(rename = "Pages")]
22    pub pages: Pages,
23    /// 大纲,见 7.8(可选)。
24    #[serde(rename = "Outlines")]
25    pub outlines: Option<Outlines>,
26    /// 文档权限声明(可选)。
27    #[serde(rename = "Permissions")]
28    pub permissions: Option<CtPermission>,
29    /// 文档关联的动作序列(可选)。
30    #[serde(rename = "Actions")]
31    pub actions: Option<Actions>,
32    /// 文档视图首选项(可选)。
33    #[serde(rename = "VPreferences")]
34    pub v_preferences: Option<VPreferences>,
35    /// 文档书签集(可选)。
36    #[serde(rename = "Bookmarks")]
37    pub bookmarks: Option<Bookmarks>,
38    /// 指向附件列表文件,见第 20 章(可选)。
39    #[serde(rename = "Attachments")]
40    pub attachments: Option<StLoc>,
41    /// 指向注释列表文件,见第 15 章(可选)。
42    #[serde(rename = "Annotations")]
43    pub annotations: Option<StLoc>,
44    /// 指向自定义标引列表文件,见第 16 章(可选)。
45    #[serde(rename = "CustomTags")]
46    pub custom_tags: Option<StLoc>,
47    /// 指向扩展列表文件,见第 17 章(可选)。
48    #[serde(rename = "Extensions")]
49    pub extensions: Option<StLoc>,
50}
51
52/// `CT_CommonData`:文档公共数据(见表 6)。
53#[derive(Debug, Clone, Deserialize, Serialize)]
54pub struct CommonData {
55    /// 当前文档中所有对象使用标识的最大值,初始值为 0(必选)。
56    #[serde(rename = "MaxUnitID")]
57    pub max_unit_id: StId,
58    /// 指定该文档页面区域的默认大小和位置(必选)。
59    #[serde(rename = "PageArea")]
60    pub page_area: CtPageArea,
61    /// 公共资源序列,每个节点指向包内的一个资源描述文档(可选)。
62    #[serde(rename = "PublicRes", default)]
63    pub public_res: Vec<StLoc>,
64    /// 文档资源序列,每个节点指向包内的一个资源描述文档(可选)。
65    #[serde(rename = "DocumentRes", default)]
66    pub document_res: Vec<StLoc>,
67    /// 模板页序列(可选)。
68    #[serde(rename = "TemplatePage", default)]
69    pub template_pages: Vec<CtTemplatePage>,
70    /// 引用资源文件中定义的默认颜色空间标识,缺省采用 RGB(可选)。
71    #[serde(rename = "DefaultCS")]
72    pub default_cs: Option<StRefId>,
73}
74
75/// `CT_PageArea`:页面区域(见表 7、图 8)。
76///
77/// 四个边界框逐层嵌套:出血框 ⊃ 物理框 ⊃ 显示框 ⊃ 版心框。
78#[derive(Debug, Clone, Deserialize, Serialize)]
79pub struct CtPageArea {
80    /// 页面物理区域,左上角为页面空间坐标系原点(必选)。
81    #[serde(rename = "PhysicalBox")]
82    pub physical_box: StBox,
83    /// 显示区域,页面内容实际显示或打印输出的区域(可选)。
84    #[serde(rename = "ApplicationBox")]
85    pub application_box: Option<StBox>,
86    /// 版心区域,即文件的正文区域(可选)。
87    #[serde(rename = "ContentBox")]
88    pub content_box: Option<StBox>,
89    /// 出血区域,超出设备性能限制的额外出血区域;缺省为物理区域(可选)。
90    #[serde(rename = "BleedBox")]
91    pub bleed_box: Option<StBox>,
92}
93
94/// `CT_Permission`:文档权限声明(见表 8)。
95///
96/// 各布尔项缺省值均为 `true`;此处以 [`Option`] 表达“是否显式声明”,
97/// 取值请配合 [`CtPermission::get`] 风格的默认逻辑使用。
98#[derive(Debug, Clone, Default, Deserialize, Serialize)]
99pub struct CtPermission {
100    /// 是否允许编辑,默认 `true`。
101    #[serde(rename = "Edit")]
102    pub edit: Option<bool>,
103    /// 是否允许添加或修改标注,默认 `true`。
104    #[serde(rename = "Annot")]
105    pub annot: Option<bool>,
106    /// 是否允许导出,默认 `true`。
107    #[serde(rename = "Export")]
108    pub export: Option<bool>,
109    /// 是否允许进行数字签名,默认 `true`。
110    #[serde(rename = "Signature")]
111    pub signature: Option<bool>,
112    /// 是否允许添加水印,默认 `true`。
113    #[serde(rename = "Watermark")]
114    pub watermark: Option<bool>,
115    /// 是否允许截屏,默认 `true`。
116    #[serde(rename = "PrintScreen")]
117    pub print_screen: Option<bool>,
118    /// 打印权限设置(可选)。
119    #[serde(rename = "Print")]
120    pub print: Option<Print>,
121    /// 有效期(可选)。
122    #[serde(rename = "ValidPeriod")]
123    pub valid_period: Option<ValidPeriod>,
124}
125
126/// 打印权限(见表 8)。
127#[derive(Debug, Clone, Default, Deserialize, Serialize)]
128pub struct Print {
129    /// 文档是否允许被打印,默认 `true`。
130    #[serde(rename = "@Printable")]
131    pub printable: Option<bool>,
132    /// 打印份数;`<0` 不受限、`0` 不允许、`>0` 为实际份数。
133    #[serde(rename = "@Copies")]
134    pub copies: Option<i64>,
135}
136
137/// 文档有效期(见表 8)。
138#[derive(Debug, Clone, Default, Deserialize, Serialize)]
139pub struct ValidPeriod {
140    /// 有效期开始日期。
141    #[serde(rename = "@StartDate")]
142    pub start_date: Option<String>,
143    /// 有效期结束日期。
144    #[serde(rename = "@EndDate")]
145    pub end_date: Option<String>,
146}
147
148/// `CT_VPreferences`:文档视图首选项(见表 9)。
149#[derive(Debug, Clone, Default, Deserialize, Serialize)]
150pub struct VPreferences {
151    /// 窗口模式,默认 `None`。
152    #[serde(rename = "PageMode")]
153    pub page_mode: Option<String>,
154    /// 页面布局模式,默认 `OneColumn`。
155    #[serde(rename = "PageLayout")]
156    pub page_layout: Option<String>,
157    /// 标题栏显示模式,默认 `FileName`。
158    #[serde(rename = "TabDisplay")]
159    pub tab_display: Option<String>,
160    /// 是否隐藏工具栏,默认 `false`。
161    #[serde(rename = "HideToolbar")]
162    pub hide_toolbar: Option<bool>,
163    /// 是否隐藏菜单栏,默认 `false`。
164    #[serde(rename = "HideMenubar")]
165    pub hide_menubar: Option<bool>,
166    /// 是否隐藏主窗口之外的其他窗体组件,默认 `false`。
167    #[serde(rename = "HideWindowUI")]
168    pub hide_window_ui: Option<bool>,
169    /// 自动缩放模式,默认 `Default`。
170    #[serde(rename = "ZoomMode")]
171    pub zoom_mode: Option<String>,
172    /// 文档的缩放率。
173    #[serde(rename = "Zoom")]
174    pub zoom: Option<f64>,
175}
176
177/// 书签集,包含一组书签(见表 5、表 10)。
178#[derive(Debug, Clone, Default, Deserialize, Serialize)]
179pub struct Bookmarks {
180    /// 书签列表。
181    #[serde(rename = "Bookmark", default)]
182    pub bookmarks: Vec<CtBookmark>,
183}
184
185/// `CT_Bookmark`:文档书签(见表 10)。
186#[derive(Debug, Clone, Default, Deserialize, Serialize)]
187pub struct CtBookmark {
188    /// 书签名称(必选)。
189    #[serde(rename = "@Name")]
190    pub name: String,
191    /// 书签对应的文档位置(必选)。
192    #[serde(rename = "Dest")]
193    pub dest: Option<CtDest>,
194}
195
196/// 大纲根节点,按树状结构组织(见 7.8、图 18)。
197#[derive(Debug, Clone, Default, Deserialize, Serialize)]
198pub struct Outlines {
199    /// 顶层大纲节点。
200    #[serde(rename = "OutlineElem", default)]
201    pub outline_elems: Vec<CtOutlineElem>,
202}
203
204/// `CT_OutlineElem`:大纲节点(见表 17)。
205#[derive(Debug, Clone, Default, Deserialize, Serialize)]
206pub struct CtOutlineElem {
207    /// 大纲节点标题(必选)。
208    #[serde(rename = "@Title")]
209    pub title: String,
210    /// 该节点下所有叶节点的数目参考值,默认 0(可选)。
211    #[serde(rename = "@Count")]
212    pub count: Option<i64>,
213    /// 初始状态下是否展开子节点,默认 `true`(可选)。
214    #[serde(rename = "@Expanded")]
215    pub expanded: Option<bool>,
216    /// 节点被激活时执行的动作序列(可选)。
217    #[serde(rename = "Actions")]
218    pub actions: Option<Actions>,
219    /// 子大纲节点,层层嵌套形成树状结构(可选)。
220    #[serde(rename = "OutlineElem", default)]
221    pub children: Vec<CtOutlineElem>,
222}