Fork me on GitHub

Word文档docx结构分析——初探

docx 格式文件的主要内容是保存为XML格式的,但文件并非直接保存于磁盘。它是保存在一个ZIP文件中。
因此,docx格式的文件本质上是一个ZIP文件。docx文件是可以用解压工具打开的。

浏览内部结构

首先我们新建一个Word文件,里面随便输入一些文本,然后保存。
接着,我们右键打开方式选择压缩软件方式打开,会发现是可以查看的,由一系列xml文件组成。内部结构类似下图:

这些xml文件,都是基于OOXML规范的。

OOXML(Office Open XML),由Microsoft开发的一种以XML为基础并以ZIP格式压缩的电子文件规范,支持文件、表格、备忘录、幻灯片等文件格式。

然后,我们将其解压,进行一部分一部分分析。

内部文件分析

[Content_Types].xml

首先我们打开[Content_Types].xml文件,内部的xml结构如下图:

我们可以猜测,这个文件规定了docx的一些信息。进一步观察,可以清楚地看出,里面又关联了一些xml文件,如document.xml,core.xml等。可以说是将这些文件串联起来,定义了每一个xml文件的类型和作用。
那么,接下来,让我们一个一个来看。

rels文件

For an OOXML package, there is always a relationships part (.rels) within the _rels folder that identifies the starting parts of the package, or the package relationships.
There are also typically relationships within .rels for app.xml and core.xml.
In addition to the relationships part for the package, each part that is the source of one or more relationships will have its own relationships part. Each such relationship part is found within a _rels sub-folder of the part and is named by appending ‘.rels’ to the name of the part. Typically the main content part (document.xml) has its own relationships part. It will contain relationships to the other parts of the content, such as styles.xml, themes,xml, and footer.xml, as well as the URIs for external links.

_rels 目录下会包含一个 .rels 后缀的文件,它储存了此目录下各个 Part 之间的关系。当然,_rels 目录也不止一个。

word

word目录下有docx文档内的内容所对应的各个文件,是文档内容的主体部分。

/word/document.xml


这里的”test”是我之前输入的文本内容,因此可以猜测这是文档内容的主体部分。
里面还存在着各式各样的xml标签,代表着各式内容。

docProps

从文件夹的名字,我们就可以大概猜出作用:这个目录下的xml文件储存着docx文件的属性(Properties)

/docProps/core.xml


这里可以找到创建者,最后一次保存者,创建时间和修改日期,储存着文档的属性信息。

/docProps/app.xml


这里储存着文档属性中的程序名称(Microsoft Office Word),页数,字符数,行数等信息。

通过逐步探索,我们还可以发现,fontTable.xml存有字体信息。事实上,这只是Word文档组成的一小部分,因为我们前面只是输入了一些文本。
如果再插入一些图片、表格等内容,我们会发现更复杂的结构。
根据我们的发现,其实就可以编写一个简易的Word文档编辑器。此外,很多第三方库也支持对Word文档的操作。