wordpress hit counter
Welcome to OpenXML Developer Sign in | Join | Help

Adding Image to Word document’s Header

Article By - Sheela E.N, Sonata Software Limited

 

This article explains how to add image to header of a word document using Open XML SDK API. The steps to be followed are as below –

 

1.      Create a C# project; add a reference to openxml dll

 

·         In the Add Reference dialog box, click the .NET tab.

·         Scroll to the Microsoft.Office.DocumentFormat.OpenXml option, select it, and then click OK.

 

2.      Import the namespace to refer to the dll

 

using Microsoft.Office.DocumentFormat.OpenXml.Packaging;

 

3.      Declare necessary namespaces

 

const string wordmlNamespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";

 

const string relationshipNamespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";

 

4.      Open the word document to get the main document part.

 

WordprocessingDocument wordDoc = WordprocessingDocument.Open(@"C:\test\test.docx", true);

MainDocumentPart mainPart = wordDoc.MainDocumentPart;

 

5.      Load the xml of main part to DOM object to change the IDs at a later stage

 

XmlDocument xDoc = new XmlDocument();

 xDoc.Load(mainPart.GetStream());

 

6.      Add a header part to the main document part

 

HeaderPart headPart = mainPart.AddNewPart<HeaderPart>();

 

7.      Either construct xml file for the header or load the existing template.  Here, I am loading existing xml -

 

XmlDocument header = new XmlDocument();

 header.Load(@"..\..\HeaderWithImage.xml");

 

8.      Save the xml file into header part

 

header.Save(headPart.GetStream());

 

9.      Add image part to the header part

 

ImagePart imgpart = headPart.AddImagePart(ImagePartType.Gif);

 

10.  Load image into the image part

 

using (Stream targetStream = imgpart.GetStream())

                {

                    using (FileStream sourceStream = new FileStream("../../officelogo.gif",

                            FileMode.Open, FileAccess.Read))

                    {

                        byte[] buffer = new byte[1024];

                        int nrBytesWritten = sourceStream.Read(buffer, 0, 1024);

                        while (nrBytesWritten > 0)

                        {

                            targetStream.Write(buffer, 0, nrBytesWritten);

                            nrBytesWritten = sourceStream.Read(buffer, 0, 1024);

                        }

                    }

                }

 

11.  Get the relationship ids of header part and image part just created

 

string imgId = headPart.GetIdOfPart(imgpart);

string relId = mainPart.GetIdOfPart(headPart);

 

12.   Change the relationship IDs in both header.xml and document.xml file

 

XmlNode blip = header.SelectSingleNode("//a:blip", nsManager1);

 XmlAttribute embed = blip.Attributes["embed", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"];

                embed.Value = imgId;

 

XmlNode targetNode = xDoc.SelectSingleNode("//w:sectPr", nsManager);

 

XmlElement node = xDoc.CreateElement(reference, wordmlNamespace);

 

XmlAttribute attr = node.Attributes.Append(xDoc.CreateAttribute("r:id", relationshipNamespace));

 

attr.Value = relId;

 

13.   Save document and header parts

 

header.Save(headPart.GetStream());

xDoc.Save(mainPart.GetStream());

 

14.  Close the word handler

 

wordDoc.close();

 

This is a simple demo which demonstrates ease of use of Open XML SDK for adding image to the header part in word document. The example demo is attached with the article as a zip file.
Published Friday, September 14, 2007 9:58 AM by SanjayKumarM
Attachment(s): ImagePartToHeaderPart.zip

Comments

No Comments
Anonymous comments are disabled