<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Sentient thoughts about .NET : Word</title><link>http://msmvps.com/blogs/jonathangreensted/archive/tags/Word/default.aspx</link><description>Tags: Word</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Inserting Pictures using WordML</title><link>http://msmvps.com/blogs/jonathangreensted/archive/2005/01/11/31462.aspx</link><pubDate>Tue, 11 Jan 2005 23:39:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:31462</guid><dc:creator>jonathangreensted</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/jonathangreensted/rsscomments.aspx?PostID=31462</wfw:commentRss><comments>http://msmvps.com/blogs/jonathangreensted/archive/2005/01/11/31462.aspx#comments</comments><description>&lt;P&gt;
			I've seen many, many requests on the Microsoft newsgroups asking how you can 
			insert a picture into a Word document without saving it to the file system 
			first.
		&lt;/P&gt;
		&lt;P&gt;This example application described in this blog illustrates both methods for 
			inserting a picture firstly using the Word object model 
			(InlineShapes.AddPicture) and secondly using Word's XML support (InsertXML).&lt;/P&gt;
		&lt;P&gt;The Word object model code is very straight forward:&lt;!--StartFragment--&gt;&lt;/P&gt;
		&lt;DIV style="FONT-SIZE: 8pt; BACKGROUND: #ffffff; COLOR: #000000; FONT-FAMILY: Courier New"&gt;
			&lt;DIV style="FONT-SIZE: 8pt; BACKGROUND: #ffffff; COLOR: #000000; FONT-FAMILY: Courier New"&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;
					&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;
					buttonInsertNormal_Click(&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;
					sender, System.EventArgs e)&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;{&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;
					oMissing = Type.Missing;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;
					oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; _wordApp.ActiveDocument.Content.Collapse(&lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt;
					oCollapseEnd);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;
					filename = @"c:\temp\WordMLImage.bmp";&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;try&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; {&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; pictureBox1.Image.Save(filename);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; 
					_wordApp.ActiveWindow.Selection.Range.InlineShapes.AddPicture(filename,
				&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt;
					oMissing,
					&lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt;
					oMissing,
					&lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt;
					oMissing);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; }&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;finally&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; {&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; File.Delete(filename);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; }&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;}&lt;!--EndFragment--&gt;&lt;/P&gt;
			&lt;/DIV&gt;
		&lt;/DIV&gt;
		&lt;P&gt;&lt;!--EndFragment--&gt;&lt;/P&gt;
		&lt;P&gt;
			The only problem with this code is the requirement to write the image to the 
			file system so Word can reload it.&amp;nbsp; There are many circumstances where you 
			would prefer to avoid touching the file system or maybe your application does 
			not have write permission.
		&lt;/P&gt;
		&lt;P&gt;Fortunately there is an alternative approach using Word's XML support.&amp;nbsp; 
			This approach requires us to constructing a WordML document fragment 
			representing the image to be inserted and then calling Word's InsertXML 
			function to place the image in the document.&lt;/P&gt;
		&lt;P&gt;The code to do this is as follows:&lt;!--StartFragment--&gt;&lt;/P&gt;
		&lt;DIV style="FONT-SIZE: 8pt; BACKGROUND: #ffffff; COLOR: #000000; FONT-FAMILY: Courier New"&gt;
			&lt;P style="MARGIN: 0px"&gt;&lt;!--StartFragment--&gt; &lt;!--EndFragment--&gt; &lt;!--StartFragment--&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;
				&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;
				buttonInsertWordML_Click(&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;
				sender, System.EventArgs e)&lt;/P&gt;
			&lt;DIV style="FONT-SIZE: 8pt; BACKGROUND: #ffffff; COLOR: #000000; FONT-FAMILY: Courier New"&gt;
				&lt;P style="MARGIN: 0px"&gt;{&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;
					oMissing = Type.Missing;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt;
					oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; _wordApp.ActiveDocument.Content.Collapse(&lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt;
					oCollapseEnd);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;try&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; {&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; PictWriter pw =
					&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt;
					PictWriter(pictureBox1.Image, "Example Image", "Example Image");&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; 
					_wordApp.ActiveWindow.Selection.Range.InsertXML(pw.ToString(),
					&lt;SPAN style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt;
					oMissing);&amp;nbsp; &amp;nbsp;
				&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; }&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;catch&lt;/SPAN&gt;
					(Exception ex)&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; {&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// do 
something sensible here.&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; }&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;}&lt;!--EndFragment--&gt;&lt;/P&gt;
			&lt;/DIV&gt;
		&lt;/DIV&gt;
		&lt;P&gt;You will notice the use of a custom class called &lt;a title="Sentient" href="http://sentient.co.uk/" target="_blank"&gt;Sentient&lt;/a&gt;.WordML.PictWriter 
			which handles the task of converting the image into the WordML document 
			fragment.&lt;/P&gt;
		&lt;P&gt;The complete class source is included in the zip download at the end of the 
			article however the core elements are the following two methods.&amp;nbsp;
		&lt;/P&gt;
		&lt;P&gt;WriteDoc handles writing the WordML document wrapper.&amp;nbsp; InsertXML expects a 
			complete WordML document including full namespace references and style 
			definitions if you are using styles (we are not).&lt;/P&gt;
		&lt;P&gt;WritePict handles writing the actual image data into the XML stream as Base64.&lt;/P&gt;
		&lt;DIV style="FONT-SIZE: 8pt; BACKGROUND: #ffffff; COLOR: #000000; FONT-FAMILY: Courier New"&gt;&lt;!--EndFragment--&gt;  &lt;!--StartFragment--&gt; &lt;!--EndFragment--&gt; &lt;!--StartFragment--&gt;
			&lt;DIV style="FONT-SIZE: 8pt; BACKGROUND: #ffffff; COLOR: #000000; FONT-FAMILY: Courier New"&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #808080"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #808080"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Write the whole WordML document&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #808080"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #808080"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #808080"&gt;&amp;lt;param 
name="wtr"&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;The XmlTextWriter to write 
to&lt;/SPAN&gt;&lt;SPAN style="COLOR: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt;
					&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;
					WriteDoc(XmlTextWriter wtr)&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;{&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// start &amp;lt;xml&amp;gt; 
tag&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteStartDocument();&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// add processing 
instructions&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteProcessingInstruction("mso-application", 
					"progid=\"Word.Document\"");&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// start 
&amp;lt;wordDocument&amp;gt; tag&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteStartElement("w", "wordDocument", WordMLNS);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// write 
namespaces&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt;(&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;
					prefix
					&lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt;
					_namespaces.AllKeys)&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; {&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp; wtr.WriteAttributeString("xmlns", prefix,
					&lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;, _namespaces[prefix]);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; }&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// start &amp;lt;body&amp;gt; 
tag&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteStartElement("body", WordMLNS);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// call WritePict to 
add our image to the Xml stream.&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; WritePict(wtr);
				&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// end &amp;lt;body&amp;gt; 
tag&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteEndElement();
				&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// end 
&amp;lt;wordDocument&amp;gt; tag&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteEndElement();
				&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// end &amp;lt;xml&amp;gt; 
tag&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteEndDocument();&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;}&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #808080"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #808080"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; Write the Pict WordML element&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #808080"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #808080"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #808080"&gt;&amp;lt;param 
name="wtr"&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;The XmlTextWriter to write 
to&lt;/SPAN&gt;&lt;SPAN style="COLOR: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt;
					&lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt;
					WritePict(XmlTextWriter wtr)&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;{&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;(_data==&lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;)&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; {&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; &amp;nbsp;
					&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; }&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// start &amp;lt;pict&amp;gt; 
tag&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteStartElement("pict", WordMLNS);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// start 
&amp;lt;binData&amp;gt; tag&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteStartElement("binData", WordMLNS);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteAttributeString("name", WordMLNS,
					&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;.Format("wordml://{0}{1}", _name, 
					_extension));&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// write the image as 
Base64&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteBase64(_data, 0, _data.Length);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// end 
&amp;lt;binData&amp;gt; tag&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteEndElement();&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// start 
&amp;lt;shape&amp;gt; tag which describes the shape containing the image&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteStartElement("shape", VMLNS);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteAttributeString("id", "_x0000_" + _name);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteAttributeString("style",
					&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;.Format("width:{0}px;height:{1}px", 
					_width, _height));&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// start 
&amp;lt;imagedata&amp;gt; tag which links to the &amp;lt;binData&amp;gt; above.&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteStartElement("imagedata", VMLNS);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteAttributeString("src",
					&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;.Format("wordml://{0}{1}", _name, 
					_extension));&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteAttributeString("title", OfficeNS, _title);&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// end 
&amp;lt;imagedata&amp;gt; tag&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteEndElement();&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// end &amp;lt;shape&amp;gt; 
tag&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteEndElement();&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;
					&lt;SPAN style="COLOR: #008000"&gt;// end &amp;lt;pict&amp;gt; 
tag&lt;/SPAN&gt;&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp; wtr.WriteEndElement();&lt;/P&gt;
				&lt;P style="MARGIN: 0px"&gt;}&lt;/P&gt;
			&lt;/DIV&gt; &lt;!--EndFragment--&gt;&lt;/DIV&gt;
		&lt;P&gt;As you can see the InsertXML approach requires a little more code however does 
			achieve our objective of not touching the file system.
		&lt;/P&gt;
		&lt;P&gt;The only drawback I've found with the InsertXML approach is you dont get the 
			image autosizing functionality which means if you want the image to be reduced 
			or enlarged in size you'll have to do this yourself in code either by resizing 
			the image before inserting it or using the Word object model to manipulate the 
			InlineShape properties after it has been inserted.&lt;/P&gt;
		&lt;P&gt;A major bonus is that using InsertXML is considerably faster than writing 
			the image to the file system and then calling InlineShape.Add so you get a 
			considerable performance improvement especially if you are working with large 
			images.&lt;/P&gt;
		&lt;P&gt;The source for this experimentation can be downloaded from the following page on 
			the &lt;a title="Sentient" href="http://sentient.co.uk/" target="_blank"&gt;Sentient&lt;/a&gt; website:
		&lt;/P&gt;
		&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://www.sentient.co.uk/WordMLInsertPicture.aspx"&gt;
				http://www.sentient.co.uk/WordMLInsertPicture.aspx&lt;/A&gt;&lt;/P&gt;
		&lt;P&gt;If you know of a better way to do this please add a comment to this blog.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=31462" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/jonathangreensted/archive/tags/Word/default.aspx">Word</category></item><item><title>Finding word styles fast</title><link>http://msmvps.com/blogs/jonathangreensted/archive/2004/12/07/22717.aspx</link><pubDate>Tue, 07 Dec 2004 15:13:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:22717</guid><dc:creator>jonathangreensted</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/jonathangreensted/rsscomments.aspx?PostID=22717</wfw:commentRss><comments>http://msmvps.com/blogs/jonathangreensted/archive/2004/12/07/22717.aspx#comments</comments><description>&lt;P&gt;In a recent project we had a scenario where we had to find all the paragraphs in 
			a particular style eg. Heading 1, Heading 2, etc. to build a custom table of 
			contents.
		&lt;/P&gt;
		&lt;P&gt;
		My initial thought was to iterate over the document paragraphs looking for the 
		particular style we were interested in.
		&lt;P&gt;The code looked like this: 
			&lt;!--StartFragment--&gt;
			&lt;div style="FONT-SIZE: 10pt; BACKGROUND: #ffffff; COLOR: #000000; FONT-FAMILY: Courier New"&gt;
				&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #0000ff"&gt;&lt;/span&gt;
					&amp;nbsp;&lt;/p&gt;
				&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;
					&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt;
					FindStyleUsingParagraphIteration(Word.Document doc,
					&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;
					style)&lt;/P&gt;
				&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
					&lt;span style="COLOR: #0000ff"&gt;foreach&lt;/span&gt;
					(Word.Paragraph p
					&lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt;
					doc.Paragraphs)&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Word.Style s = 
					(Word.Style)p.Range.get_Style();&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
					&lt;span style="COLOR: #0000ff"&gt;if&lt;/span&gt;
					(s.NameLocal == style)&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
					&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;
					text = p.Range.Text;&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
					&lt;span style="COLOR: #0000ff"&gt;int&lt;/span&gt;
					page = (&lt;span style="COLOR: #0000ff"&gt;int&lt;/span&gt;) 
					p.Range.get_Information(Word.WdInformation.wdActiveEndPageNumber);&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
					Single vert = (Single) 
					p.Range.get_Information(Word.WdInformation.wdVerticalPositionRelativeToPage);&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Message +=   
					 
					&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;.Format("&amp;nbsp;&amp;nbsp;&amp;nbsp; 
					&amp;nbsp;&amp;nbsp;&amp;nbsp; Style: {0}, text: {1}, page: {2}, vert: {3}",&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
					&amp;nbsp;&amp;nbsp;&amp;nbsp; s.NameLocal, p.Range.Text, page, vert.ToString());&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
				&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;
				&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
			&lt;/div&gt; &lt;!--EndFragment--&gt;
			&lt;DIV&gt;&lt;/DIV&gt;
		&lt;P&gt; &lt;!--EndFragment--&gt; This worked perfectly however it was a little slow so I 
			looked for a better approach.
		&lt;/P&gt;
		&lt;P&gt;My second attempt was to use Word's built in Find functionality to find 
			paragraphs in a particular style.
		&lt;/P&gt;
		&lt;P&gt;The code looked like this: 
			&lt;!--StartFragment--&gt;&lt;/P&gt;
		&lt;div style="FONT-SIZE: 10pt; BACKGROUND: #ffffff; COLOR: #000000; FONT-FAMILY: Courier New"&gt;
			&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #0000ff"&gt;&lt;/span&gt;
				&amp;nbsp;&lt;/p&gt;
			&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;
				&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt;
				FindStyleUsingFind(Word.Document doc,
				&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;
				style)&lt;/P&gt;
			&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;span style="COLOR: #0000ff"&gt;object&lt;/span&gt;
				oMissing = Type.Missing;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;span style="COLOR: #0000ff"&gt;object&lt;/span&gt; oTrue =
				 
				&lt;span style="COLOR: #0000ff"&gt;true&lt;/span&gt;;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;span style="COLOR: #0000ff"&gt;object&lt;/span&gt;
				oStyle = style;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Word.Range r = doc.Content;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;span style="COLOR: #0000ff"&gt;bool&lt;/span&gt; found =
				 
				&lt;span style="COLOR: #0000ff"&gt;true&lt;/span&gt;;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;span style="COLOR: #0000ff"&gt;while&lt;/span&gt;
				(found)&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;span style="COLOR: #0000ff"&gt;try&lt;/span&gt;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
				r.Find.ClearFormatting();&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
				r.Find.set_Style(&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oStyle);&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
				found = r.Find.Execute(&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
			&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
				&amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oTrue,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing,
				&lt;span style="COLOR: #0000ff"&gt;ref&lt;/span&gt;
				oMissing);&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;span style="COLOR: #0000ff"&gt;catch&lt;/span&gt;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; found =   
				 
				&lt;span style="COLOR: #0000ff"&gt;false&lt;/span&gt;;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;span style="COLOR: #0000ff"&gt;if&lt;/span&gt;
				(found)&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;
				text = r.Text;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
				&lt;span style="COLOR: #0000ff"&gt;int&lt;/span&gt;
				page = (&lt;span style="COLOR: #0000ff"&gt;int&lt;/span&gt;) 
				r.get_Information(Word.WdInformation.wdActiveEndPageNumber);&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
				Single vert = (Single) 
				r.get_Information(Word.WdInformation.wdVerticalPositionRelativeToPage);&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Message +=   
				 
				&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;.Format("&amp;nbsp;&amp;nbsp;&amp;nbsp; 
				&amp;nbsp;&amp;nbsp;&amp;nbsp; Style: {0}, text: {1}, page: {2}, vert: {3}",&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
				&amp;nbsp;&amp;nbsp;&amp;nbsp; oStyle.ToString(), r.Text, page, vert.ToString());&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
			&lt;/p&gt;
			&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;
		&lt;/div&gt; &lt;!--EndFragment--&gt;
&lt;P&gt;
		&lt;br&gt;
		The performance of this approach was much better 
however it resulted in the Word status bar flickering as it performed the Finds 
so I started looking for a third option. &lt;/P&gt;
&lt;P&gt;My third attempt was to use Word's built in XML support and write an xpath 
against the WordML schema.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The code looks like this:&lt;!--StartFragment--&gt;&lt;/P&gt;
&lt;DIV 
style="FONT-SIZE: 10pt; BACKGROUND: #ffffff; COLOR: #000000; FONT-FAMILY: Courier New"&gt;
&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN 
style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; FindStyleUsingXPath(Word.Document doc, &lt;SPAN 
style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; style)&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;{&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN 
style="COLOR: #0000ff"&gt;try&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN 
style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; schema = 
"xmlns:w=\"http://schemas.microsoft.com/office/word/2003/wordml\"";&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN 
style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; xPath = &lt;SPAN 
style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;.Format("//w:p[descendant::w:pStyle[@w:val='{0}']]/w:r/w:t", 
style);&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Word.XMLNodes nodes 
= doc.SelectNodes(xPath,schema,&lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;);&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN 
style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (nodes != &lt;SPAN 
style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;)&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (Word.XMLNode node &lt;SPAN 
style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; nodes)&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
{&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; page = (&lt;SPAN 
style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;) 
node.Range.get_Information(Word.WdInformation.wdActiveEndPageNumber);&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Single vPos = (Single) 
node.Range.get_Information(Word.WdInformation.wdVerticalPositionRelativeToPage);&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; text = 
node.Text;&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Message += &lt;SPAN 
style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;.Format("&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Page (0), vert (1), (2)\n", page, vPos, text);&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 
}&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN 
style="COLOR: #0000ff"&gt;catch&lt;/SPAN&gt;(Exception ex)&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Message += 
ex.Message;&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;}&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt; Sadly this is where it all went wrong.&amp;nbsp; The code ran 
fine (without any exceptions being thrown) however it returned no 
results!&lt;/P&gt;
&lt;P&gt;The first thing&amp;nbsp;I noted was that it took longer to return no results 
than my Find attempt took to do the job properly so this isn't a good approach 
in terms of performance anyway&amp;nbsp;however it was strange that it didn't return 
any results.&amp;nbsp; After some investigate I found that the wordml namespace was 
not registered in the doc.XMLSchemaReferences collection so I thought that maybe 
I should add it manually using the following code:&amp;nbsp;&lt;!--StartFragment--&gt; 
&lt;/P&gt;
&lt;DIV 
style="FONT-SIZE: 10pt; BACKGROUND: #ffffff; COLOR: #000000; FONT-FAMILY: Courier New"&gt;
&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt; oNamespaceURI 
= "http://schemas.microsoft.com/office/word/2003/wordml";&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt; oAlias = 
"w";&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt; oFileLocation 
= @"C:\Program Files\Microsoft Office 2003 Developer Resources\Microsoft Office 
2003 XML Reference Schemas\WordprocessingML Schemas\w10.xsd";&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; schema = &lt;SPAN 
style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;.Format("xmlns:{0}=\"{1}\"",oNamespaceURI, 
oAlias);&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0px"&gt;doc.XMLSchemaReferences.Add(&lt;SPAN 
style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; oNamespaceURI, &lt;SPAN 
style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; oAlias, &lt;SPAN 
style="COLOR: #0000ff"&gt;ref&lt;/SPAN&gt; oFileLocation, &lt;SPAN 
style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;);&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;Unfortunately&amp;nbsp;this code generates&amp;nbsp;the following&amp;nbsp;exception "This schema 
cannot be used because it attempts to declare a namespace reserved by Word." so 
that&amp;nbsp;isn't the answer.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Finally in frustration I emailed a buddy of mine on the Office team who confirmed 
definatively that SelectNodes(...) would only&amp;nbsp;work custom schemas and 
not WordML.&amp;nbsp; So there you have it,&amp;nbsp;don't waste your time like me&amp;nbsp;trying to do 
this until at least the next version.&amp;nbsp; &lt;EM&gt;(I have submitted a feature 
request)&lt;/EM&gt;.&lt;!--EndFragment--&gt;&lt;/P&gt;
&lt;P&gt;For those of you who are interested in the relative performance here are the stats for my test 
document:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Using Paragraph 
iteration: 10.1445872 seconds&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Using Find: 

1.9928656 seconds&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Using XPath: 4.9771568 
seconds (failed)&lt;/P&gt;
&lt;P&gt;My conclusion was to use the Find.Execute method and put up with the status 
bar flickering!&lt;/P&gt;
&lt;P&gt;The source for this experimentation can be downloaded from the following page 
on the &lt;a title="Sentient" href="http://sentient.co.uk/" target="_blank"&gt;Sentient&lt;/a&gt; website:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A 
href="http://www.sentient.co.uk/wordFindStyle.aspx"&gt;http://www.sentient.co.uk/wordFindStyle.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;If you know of a better way to do this please add a comment to this blog.&lt;!--EndFragment--&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=22717" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/jonathangreensted/archive/tags/Word/default.aspx">Word</category></item></channel></rss>