第12章:图片和嵌入式对象
学习目标
- 理解docx中图片的存储方式
- 理解关系引用机制
- 掌握图片在XML中的表示方式
- 了解嵌入式OLE对象
12.1 图片存储在哪里
在docx中,图片文件本身不放在XML里,而是:
- 原始图片文件放在
word/media/目录下 - 在关系文件
word/_rels/document.xml.rels中注册关系ID - 在document.xml中通过关系ID引用图片
这种分离存储的好处:
- XML保持干净,只包含引用
- 图片保持原有格式
- 可以直接提取图片文件
文件位置
图片文件通常命名为:
word/media/image1.png
word/media/image2.jpeg
word/media/image3.emf
...
按顺序编号,扩展名保持原格式。
12.2 关系注册
在word/_rels/document.xml.rels中添加一条关系:
<Relationships
xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<!-- 其他关系... -->
<Relationship Id="rId3"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
Target="media/image1.png"/>
</Relationships>
- Type固定是图片类型
- Target指向media目录下的图片文件
- Id就是关系ID,在document.xml中用这个Id引用
12.3 在文档中插入图片
图片使用DrawingML表示,放在<w:drawing>中:
<w:p>
<w:r>
<w:drawing>
<wp:inline distT="0" distB="0" distL="0" distR="0">
<wp:extent cx="2880000" cy="2160000"/>
<wp:docPr id="1" name="图片1"/>
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="0" name="image1.png"/>
<pic:cNvPicPr/>
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed="rId3"/>
<a:stretch><a:fillRect/></a:stretch>
</pic:blipFill>
<pic:spPr>
<a:xfrm>
<a:off x="0" y="0"/>
<a:cx>2880000</a:cx>
<a:cy>2160000</a:cy>
</a:xfrm>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>
</w:r>
</w:p>
看起来层级很多,我们逐层解释。
层级说明
w:drawing 表示这是一个绘图对象
└── wp:inline inline表示嵌入在文本行中
├── wp:extent 指定图片大小(EMU单位)
├── wp:docPr 文档属性(id、名称)
└── a:graphic DrawingML图形
└── a:graphicData
└── pic:pic 图片
├── pic:nvPicPr 非可视属性
├── pic:blipFill 图片填充
└── a:blip r:embed="rId3" <!-- 这里引用关系ID -->
└── pic:spPr 形状属性(大小位置)
关键部分
-
关系引用:
<a:blip r:embed="rId3"/>这里的r:embed就是关系ID,对应rels里的Id。 -
大小单位EMU:尺寸单位是English Metric Unit,换算:
- 1英寸 = 914400 EMU
- 1厘米 = 360000 EMU
- 1磅 = 12700 EMU
所以,一张10cm × 7.5cm的图片就是:
cx="3600000" cy="2700000" -
inline vs anchor:
wp:inline:图片跟随文字,在line中wp:anchor:图片浮动,可以设置文字环绕方式
环绕方式
如果是浮动锚点,用wp:anchor:
<wp:anchor distT="0" distB="0" distL="0" distR="0"
wrapType="square">
<!-- 正方形环绕文字 -->
...
</wp:anchor>
常见wrapType:
| 值 | 环绕方式 |
|---|---|
square | 四周环绕 |
tight | 紧密环绕 |
through | 穿透环绕 |
topAndBottom | 上下型 |
wrapNone | 浮于文字上方 |
12.4 图片大小
如果要保持图片原始比例,怎么计算?
原始图片像素是 width × height 像素,DPI是 96 DPI:
宽度厘米 = (width / 96) × 2.54
宽度EMU = 宽度厘米 × 360000
一般:
- 想让图片宽度刚好占满页面:A4宽度减去左右边距大概是 14.5cm → 宽度EMU = 14.5 × 360000 = 5220000
然后高度按比例缩放就行。
12.5 旧格式图片 VML
很老的Word版本可能用VML格式存图片:
<w:pict>
<v:shape>
... VML ...
</v:shape>
</w:pict>
现代Word都用DrawingML了,遇到VML一般是旧文档转换来的。现代处理一般不用生成VML。
12.6 嵌入式OLE对象
如果嵌入Excel图表、PowerPoint幻灯片,或者其他OLE对象,怎么存?
和图片类似:
- OLE对象数据存在
word/embeddings/目录下 - 在关系文件注册关系
- 在文档中用
<o:OLEObject>引用
一般开发中很少需要处理嵌入OLE对象,知道位置就可以了。
12.7 完整示例总结
插入一张图片需要做三件事:
- 复制图片文件到
word/media/imageN.png - 在
document.xml.rels添加关系:<Relationship Id="rIdX" Type="...image" Target="media/imageN.png"/> - 在document.xml插入DrawingML引用关系ID:
<w:drawing> <wp:inline> <wp:extent cx="..." cy="..."/> <a:graphic> <a:graphicData> <pic:pic> <pic:blipFill> <a:blip r:embed="rIdX"/> </pic:blipFill> </pic:pic> </a:graphicData> </a:graphic> </wp:inline> </w:drawing>
就是这么三步。理解了结构,插入图片其实不复杂。
本章小结
- 图片文件存在
word/media/目录,XML中只放引用 - 需要在关系文件
document.xml.rels中注册关系ID - 在文档中用DrawingML表示,通过
r:embed引用关系ID - 大小单位是EMU,1厘米 = 360000 EMU
- inline是随文嵌入,anchor是浮动可以设置环绕
下一章我们讲解页眉页脚与分节。