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

第12章:图片和嵌入式对象

学习目标

  • 理解docx中图片的存储方式
  • 理解关系引用机制
  • 掌握图片在XML中的表示方式
  • 了解嵌入式OLE对象

12.1 图片存储在哪里

在docx中,图片文件本身不放在XML里,而是:

  1. 原始图片文件放在word/media/目录下
  2. 在关系文件word/_rels/document.xml.rels中注册关系ID
  3. 在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  形状属性(大小位置)

关键部分

  1. 关系引用<a:blip r:embed="rId3"/> 这里的r:embed就是关系ID,对应rels里的Id。

  2. 大小单位EMU:尺寸单位是English Metric Unit,换算:

    • 1英寸 = 914400 EMU
    • 1厘米 = 360000 EMU
    • 1磅 = 12700 EMU

    所以,一张10cm × 7.5cm的图片就是:cx="3600000" cy="2700000"

  3. 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对象,怎么存?

和图片类似:

  1. OLE对象数据存在word/embeddings/目录下
  2. 在关系文件注册关系
  3. 在文档中用<o:OLEObject>引用

一般开发中很少需要处理嵌入OLE对象,知道位置就可以了。


12.7 完整示例总结

插入一张图片需要做三件事:

  1. 复制图片文件word/media/imageN.png
  2. document.xml.rels添加关系
    <Relationship Id="rIdX" Type="...image" Target="media/imageN.png"/>
    
  3. 在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是浮动可以设置环绕

下一章我们讲解页眉页脚与分节。