Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第3章:.docx本质 —— ZIP包结构

学习目标

  • 理解.docx本质上是一个ZIP压缩包
  • 学会手动解压.docx查看内部结构
  • 了解.docx包内的主要文件和目录
  • 理解关系文件(.rels)的作用
  • 理解内容类型文件的作用

3.1 .docx就是一个ZIP文件

很多新手不知道:.docx文件本质上就是一个ZIP压缩包

你可以直接验证这一点:

  1. 找一个.docx文件,复制一份
  2. 将扩展名从.docx改成.zip
  3. 用你的解压软件(7-Zip、WinRAR等)解压它
  4. 你会看到里面有很多文件和文件夹

这就是.docx的真相:它不是什么神秘的二进制格式,就是一堆XML文件和其他资源文件打包压缩在一个ZIP包里。

动手实践

练习:找一个你自己的Word文档,按照上面的步骤改后缀解压,看看里面有什么。这会帮助你建立直观认识。


3.2 .docx包内的文件结构

解压一个典型的.docx文件后,你会看到类似这样的结构:

├── _rels/
│   └── .rels
├── docProps/
│   ├── app.xml
│   └── core.xml
├── word/
│   ├── _rels/
│   │   └── document.xml.rels
│   ├── document.xml
│   ├── fontTable.xml
│   ├── footer1.xml
│   ├── header1.xml
│   ├── numbering.xml
│   ├── settings.xml
│   ├── styles.xml
│   ├── theme/
│   │   └── theme1.xml
│   └── media/
│       ├── image1.png
│       ├── image2.jpeg
│       └── ...
└── [Content_Types].xml

这就是一个标准的.docx结构。让我们逐层介绍每个部分是做什么的。

根目录文件

文件作用
[Content_Types].xml定义包内每个部分的内容类型
_rels/.rels定义包级关系,找到主文档在哪里

docProps目录

docProps 存放文档属性:

文件作用
core.xml核心属性:标题、作者、创建时间、修改时间等
app.xml应用属性:Word版本、页数、字数统计等

word目录(核心部分)

这是最重要的目录,文档主要内容都在这里:

文件作用
document.xml主文档内容,正文文字和结构都在这里
styles.xml样式定义
numbering.xml编号列表定义
settings.xml文档设置
fontTable.xml字体表
headerN.xml页眉(多个页眉多个文件)
footerN.xml页脚(多个页脚多个文件)
theme/theme1.xml主题定义
media/存放嵌入的图片等媒体文件
_rels/document.xml.rels文档内部关系,定义图片、页眉页脚等引用

3.3 关系文件(.rels)是什么

你已经看到包里有_rels/.relsword/_rels/document.xml.rels这些文件。这些是关系文件(Relationships)。

关系的作用

Open XML使用关系来表示资源之间的引用关系。为什么不直接用文件路径?

关系的好处:

  1. 解耦:源文件不需要知道目标文件的具体路径
  2. 可移动:移动目标文件只需要更新关系文件,不需要更新所有引用
  3. 类型明确:关系可以指定类型,说明这是什么类型的引用

关系文件格式

关系文件的结构很简单,举个例子,_rels/.rels

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
  <Relationship Id="rId1"
                Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
                Target="word/document.xml"/>
  <Relationship Id="rId2"
                Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"
                Target="docProps/core.xml"/>
  <Relationship Id="rId3"
                Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/extended-properties"
                Target="docProps/app.xml"/>
</Relationships>

每个<Relationship>元素表示一个关系:

  • Id:关系ID,在这个文件内唯一
  • Type:关系类型,说明这是什么关系
  • Target:目标文件的路径

从上面例子可以看出:

  • rId1指向word/document.xml,这就是主文档
  • 所以任何程序打开docx后,先读_rels/.rels就能找到主文档在哪里

文档内关系

word/_rels/document.xml.rels是主文档的关系文件,用来引用图片、页眉、页脚等:

<Relationships xmlns="...">
  <Relationship Id="rId1" Type="..." Target="header1.xml"/>
  <Relationship Id="rId2" Type="..." Target="footer1.xml"/>
  <Relationship Id="rId3" Type="..." Target="media/image1.png"/>
</Relationships>

在主文档document.xml中,通过r:id="rId1"来引用这些关系。我们后面看具体例子。


3.4 内容类型文件 [Content_Types].xml

根目录下的[Content_Types].xml定义了包内每个部分的内容类型。

为什么需要内容类型

ZIP包本身不知道里面每个文件是什么类型,所以需要一个文件来说明。

一个典型的[Content_Types].xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ContentTypes xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
  <Default Extension="rels"
            ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
  <Default Extension="xml"
            ContentType="application/xml"/>
  <Default Extension="png"
            ContentType="image/png"/>
  <Default Extension="jpeg"
            ContentType="image/jpeg"/>
  <Override PartName="/word/document.xml"
            ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
  <Override PartName="/word/styles.xml"
            ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>
</ContentTypes>

两种声明方式

  1. Default:默认,按扩展名定义内容类型。所有扩展名为png的都是image/png类型。

  2. Override:覆盖,对特定路径的文件覆盖其内容类型。主要用于特殊的XML文件需要指定具体类型。

ContentType命名

Open XML的内容类型都遵循命名惯例:

application/vnd.openxmlformats-officedocument.[部分类型]+xml

例如:

  • 主文档:...wordprocessingml.document.main+xml
  • 样式:...wordprocessingml.styles+xml

3.5 文档属性在哪里

文档属性(作者、标题、时间等)存放在docProps目录下。

core.xml 核心属性

docProps/core.xml包含Dublin Core核心元数据:

<cp:coreProperties xmlns:cp="..." xmlns:dc="...">
  <dc:title>我的文档标题</dc:title>
  <dc:creator>张三</dc:creator>
  <cp:lastModifiedBy>张三</cp:lastModifiedBy>
  <dcterms:created>2024-01-01T12:00:00Z</dcterms:created>
  <dcterms:modified>2024-01-02T15:30:00Z</dcterms:modified>
</cp:coreProperties>

常见属性:

  • dc:title:文档标题
  • dc:creator:创建者/作者
  • cp:lastModifiedBy:最后修改者
  • dcterms:created:创建时间
  • dcterms:modified:最后修改时间

app.xml 扩展属性

docProps/app.xml包含应用程序特定属性:

<Properties xmlns="...">
  <Application>Microsoft Office Word</Application>
  <AppVersion>16.0000</AppVersion>
  <Pages>10</Pages>
  <Words>12345</Words>
  <Paragraphs>123</Paragraphs>
</Properties>

包含:

  • 使用的应用程序和版本
  • 页数、字数、段落数统计
  • 文档安全性等信息

3.6 动手解压看看真实结构

理论说了这么多,现在动手实践一下:

  1. 准备一个简单的docx文件:创建一个新Word文档,输入几行文字,插入一张图片,保存。
  2. 复制一份,不要改坏原文件。
  3. 改扩展名:把.docx改成.zip
  4. 解压:用解压软件解压。
  5. 浏览:看看各个文件,用文本编辑器打开XML文件看看内容。

你会看到:

  • XML都是文本,可读性很好
  • 结构和我们讲的一样
  • 你的文字在word/document.xml
  • 图片在word/media/

这个练习非常重要,亲手看过一次胜过读十遍书。


本章小结

  • .docx本质上就是一个ZIP压缩包,改后缀就能解压查看
  • ZIp包内包含多个XML文件和资源文件
  • _rels/.rels是入口,从中可以找到主文档位置
  • [Content_Types].xml定义各文件的内容类型
  • docProps/存放文档属性(作者、时间等)
  • word/document.xml是主文档,存放正文内容
  • word/styles.xml存放样式定义
  • 图片等媒体放在word/media/目录

下一章我们介绍Open XML标准和ECMA-376。