Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
ISO/IEC 26300-3 定义了开放文档格式(ODF)的包结构规范,详细说明了文档内容、样式、元数据和嵌入资源如何在单个可移植单元中组装。与该标准第1部分(XML模式)和第2部分(OpenFormula规范)不同,第3部分专注于使 ODF 成为实用文档格式的容器架构。
ISO/IEC 26300-3 定义的包结构遵循”容器中容器”模型。外层容器是 ZIP 归档本身,内层容器是基于 XML 的清单文件,它列举了包中的每个文件及其 MIME 类型。这种双容器方法既提供了广泛的兼容性(ZIP 得到普遍支持),又提供了丰富的元数据(清单支持内容类型协商和数字签名验证)。
ODF 包的一个关键设计原则是:即使单个组件被修改,包仍然必须保持有效。例如,如果提取文档、替换图像并重新打包,则必须相应地更新清单。标准要求清单文件(META-INF/manifest.xml)始终准确反映包的当前内容状态。
| 组件 | 必需 | 描述 |
|---|---|---|
| mimetype | 是 | 位于偏移量 0 处的未压缩文件,包含文档 MIME 类型 |
| META-INF/manifest.xml | 是 | 列出所有文件的 XML 清单,包含 MIME 类型、加密状态和版本信息 |
| content.xml | 是 | ODF XML 格式的主要文档内容 |
| styles.xml | 否 | 应用于内容的文档级和自动样式 |
| meta.xml | 否 | 文档元数据,包括作者、日期和统计信息 |
| Thumbnails/ | 否 | 用于文件管理器预览的可选缩略图 |
META-INF/manifest.xml 中的清单作为包的权威目录。每个 <manifest:file-entry> 元素声明一个文件路径及其对应的 MIME 类型。根条目(路径”/”)声明整体文档类型,而子条目描述子组件。这种结构支持签名验证:数字签名覆盖清单条目,清单条目又引用实际数据文件,形成一条不可破坏的信任链。
ISO/IEC 26300-3 还规定了如何在包上分层加密。包中的单个文件可以使用 XML 加密标准进行加密,加密元数据存储在单独的 META-INF/document-signatures.xml 文件中。这种细粒度加密模型允许文档作者只加密敏感部分(例如电子表格中的财务数据),而保持其余部分可读。
从工程角度来看,实现符合规范的 ODF 包读取器或写入器需要注意几个微妙的细节。首先,”mimetype 不压缩”规则不仅仅是建议——它是符合性的要求。mimetype 文件必须作为归档中的第一个条目以存储方式(方法 0)存在。不遵守此顺序将生成有效的 ZIP 文件,但不符合 ODF 包规范。
其次,路径规范化至关重要。清单仅使用正斜杠,所有路径都相对于包根目录。实现必须解析”.”和”..”段,并拒绝任何会逃逸包边界的路径(经典的 ZIP-slip 漏洞)。标准明确禁止绝对路径和父目录遍历。
第三,content.xml 与外部资源之间的关系需要谨慎处理。虽然 ODF 包可以引用外部 URI(例如链接的图像),但符合规范的查看器应在外部资源不可用时优雅地降级。标准建议将常用资源嵌入到包中,以确保可靠的离线访问。