Skip to main content

ofd_core/model/
ofd.rs

1//! OFD 主入口 `OFD.xml`(见 GB/T 33190—2016 7.4)。
2//!
3//! `OFD.xml` 是包的主入口文件,一个包内存在且只存在一个。其结构见图 3,
4//! 属性说明见表 3;文档元数据 `CT_DocInfo` 见图 4、表 4。
5
6use serde::{Deserialize, Serialize};
7
8use crate::model::common::Versions;
9use crate::types::StLoc;
10
11/// `OFD.xml` 的根节点(见表 3)。
12#[derive(Debug, Clone, Deserialize, Serialize)]
13pub struct Ofd {
14    /// 文件格式的版本号,取值为 `1.0`(必选)。
15    #[serde(rename = "@Version")]
16    pub version: String,
17    /// 文件格式子集类型。`OFD` 表示符合本标准,`OFD-A` 表示符合 OFD 存档规范(必选)。
18    #[serde(rename = "@DocType")]
19    pub doc_type: String,
20    /// 文件对象入口,可以存在多个,以便在一个文档中包含多个版式文档(必选)。
21    #[serde(rename = "DocBody")]
22    pub doc_bodies: Vec<DocBody>,
23}
24
25impl Ofd {
26    /// 是否为 OFD 存档规范(`DocType == "OFD-A"`)。
27    pub fn is_archive(&self) -> bool {
28        self.doc_type == "OFD-A"
29    }
30}
31
32/// 文件对象入口(见表 3)。
33#[derive(Debug, Clone, Deserialize, Serialize)]
34pub struct DocBody {
35    /// 文档元数据信息描述(必选)。
36    #[serde(rename = "DocInfo")]
37    pub doc_info: CtDocInfo,
38    /// 指向文档根节点文档(`Document.xml`),见 7.5(可选)。
39    #[serde(rename = "DocRoot")]
40    pub doc_root: Option<StLoc>,
41    /// 版本信息,见第 19 章(可选)。
42    #[serde(rename = "Versions")]
43    pub versions: Option<Versions>,
44    /// 指向该文档中签名和签章结构,见第 18 章(可选)。
45    #[serde(rename = "Signatures")]
46    pub signatures: Option<StLoc>,
47}
48
49/// `CT_DocInfo`:文档元数据(见表 4)。
50#[derive(Debug, Clone, Default, Deserialize, Serialize)]
51pub struct CtDocInfo {
52    /// 采用 UUID 算法生成的由 32 个字符组成的文件标识(可选)。
53    #[serde(rename = "DocID")]
54    pub doc_id: Option<String>,
55    /// 文档标题,可与文件名不同(可选)。
56    #[serde(rename = "Title")]
57    pub title: Option<String>,
58    /// 文档作者(可选)。
59    #[serde(rename = "Author")]
60    pub author: Option<String>,
61    /// 文档主题(可选)。
62    #[serde(rename = "Subject")]
63    pub subject: Option<String>,
64    /// 文档摘要与注释(可选)。
65    #[serde(rename = "Abstract")]
66    pub abstract_: Option<String>,
67    /// 文档创建日期(可选)。
68    #[serde(rename = "CreationDate")]
69    pub creation_date: Option<String>,
70    /// 文档最近修改日期(可选)。
71    #[serde(rename = "ModDate")]
72    pub mod_date: Option<String>,
73    /// 文档分类:`Normal`/`EBook`/`ENewsPaper`/`EMagzine`,默认 `Normal`(可选)。
74    #[serde(rename = "DocUsage")]
75    pub doc_usage: Option<String>,
76    /// 文档封面,指向一个图片文件(可选)。
77    #[serde(rename = "Cover")]
78    pub cover: Option<StLoc>,
79    /// 关键词集合(可选)。
80    #[serde(rename = "Keywords")]
81    pub keywords: Option<Keywords>,
82    /// 创建文档的应用程序(可选)。
83    #[serde(rename = "Creator")]
84    pub creator: Option<String>,
85    /// 创建文档的应用程序的版本信息(可选)。
86    #[serde(rename = "CreatorVersion")]
87    pub creator_version: Option<String>,
88    /// 用户自定义元数据集合(可选)。
89    #[serde(rename = "CustomDatas")]
90    pub custom_datas: Option<CustomDatas>,
91}
92
93/// 关键词集合,每个关键词用一个 `Keyword` 子节点表达(见表 4)。
94#[derive(Debug, Clone, Default, Deserialize, Serialize)]
95pub struct Keywords {
96    /// 关键词列表。
97    #[serde(rename = "Keyword", default)]
98    pub keywords: Vec<String>,
99}
100
101/// 用户自定义元数据集合(见表 4)。
102#[derive(Debug, Clone, Default, Deserialize, Serialize)]
103pub struct CustomDatas {
104    /// 自定义元数据列表。
105    #[serde(rename = "CustomData", default)]
106    pub custom_datas: Vec<CustomData>,
107}
108
109/// 用户自定义元数据,指定一个名称及其对应的值(见表 4)。
110#[derive(Debug, Clone, Default, Deserialize, Serialize)]
111pub struct CustomData {
112    /// 用户自定义元数据名称(必选)。
113    #[serde(rename = "@Name")]
114    pub name: String,
115    /// 用户自定义元数据值。
116    #[serde(rename = "$text", default)]
117    pub value: String,
118}