Search code examples
openxmlwordprocessingmldrawingml

Word 2007, Open XML - embedding an image


Do you know what basic information MUST include a paragraph (<w:p/>) in document.xml inside a *.docx document, that specifies an image? I do know there must be:

<a:blip r:embed="rId4" /> 

specifing the relationship id, but what else? It's very hard to find it in Google and experimenting with cutting out tags from a ready document or reading the specification takes a lot of time.

An example with all the required tags would be greatly appreciated.


Solution

  • Word is rather picky concerning the input XML provided. To embed an image, you have to provide quite some information. Here is a simple example:

    document.xml

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <w:document xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" 
                xmlns:v="urn:schemas-microsoft-com:vml" 
                xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" 
                xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:body>
        <w:p>
          <w:r>
            <w:drawing>
              <wp:inline distT="0" distB="0" distL="0" distR="0">
                <wp:extent cx="5943600" cy="3717290"/>
                <wp:docPr id="1" name="Picture 0" descr="vlcsnap-325726.png"/>
                <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="myImage.png"/>
                        <pic:cNvPicPr/>
                      </pic:nvPicPr>
                      <pic:blipFill>
                        <a:blip r:embed="rId4"/>
                        <a:stretch>
                          <a:fillRect/>
                        </a:stretch>
                      </pic:blipFill>
                      <pic:spPr>
                        <a:xfrm>
                          <a:off x="0" y="0"/>
                          <a:ext cx="5943600" cy="3717290"/>
                        </a:xfrm>
                        <a:prstGeom prst="rect">
                          <a:avLst/>
                        </a:prstGeom>
                      </pic:spPr>
                    </pic:pic>
                  </a:graphicData>
                </a:graphic>
              </wp:inline>
            </w:drawing>
          </w:r>
        </w:p>
      </w:body>
    </w:document>
    

    document.xml.rels

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
      <!-- other relationships go here -->
      <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png"/>
    </Relationships>
    

    And of course the image must be added to the package at the correct location (media/image1.png)

    Since all this is rather complicated I would recommend you to use the OpenXML SDK 2.0 provided by Microsoft or another library, e.g. OpenXML4J. These libraries, especially the one from Microsoft can make your work a lot easier.