Using Word Automation Services with the Open XML SDK using VB

This is the complete sample that shows how to use Word Automation Services with the Open XML SDK from the article Developing with SharePoint 2010 Word Automation Services.

This blog is inactive.
New blog: EricWhite.com/blog

Blog TOCNote for those of you using the SP2010 beta, the capability to update fields (and update the table of contents) was not working in that release. It works in recent builds, and of course will work in RTM.

Imports System.Collections.ObjectModel
Imports System.IO
Imports System.Threading
Imports Microsoft.SharePoint
Imports Microsoft.Office.Word.Server.Conversions
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Wordprocessing
Module Module1
    Sub Main()
        Dim siteUrl As String = "https://localhost"
        ' If you manually installed Word Automation Services, then replace the name
        ' in the following line with the name that you assigned to the service when
        ' you installed it.
        Dim wordAutomationServiceName = "Word Automation Services"
        Using spSite As SPSite = New SPSite(siteUrl)
            Console.WriteLine("Querying for Test.docx")
            Dim list As SPList = spSite.RootWeb.Lists("Shared Documents")
    Dim query As SPQuery = New SPQuery()
            query.ViewFields = "<FieldRef Name='FileLeafRef' />"
            query.Query = ( _
               <Where>
                   <Eq>
                       <FieldRef Name='FileLeafRef'/>
               <Value Type='Text'>Test.docx</Value>
                   </Eq>
               </Where>).ToString()
            Dim collection As SPListItemCollection = list.GetItems(query)
            If collection.Count <> 1 Then
                Console.WriteLine("Test.docx not found")
                Environment.Exit(0)
            End If
            Console.WriteLine("Opening")
            Dim file As SPFile = collection(0).File
            Dim byteArray As Byte() = file.OpenBinary()
            Using memStr As MemoryStream = New MemoryStream()
                memStr.Write(byteArray, 0, byteArray.Length)
                Using wordDoc As WordprocessingDocument = _
                    WordprocessingDocument.Open(memStr, True)
                    Dim document As Document = wordDoc.MainDocumentPart.Document
                    Dim firstParagraph As Paragraph = _
                        document.Body.Elements(Of Paragraph)().FirstOrDefault()
                    If firstParagraph IsNot Nothing Then
                      Dim newParagraph As Paragraph = New Paragraph( _
                            New ParagraphProperties( _
                                New ParagraphStyleId() With {.Val = "Heading1"}), _
                            New Run( _
                           New Text("About the Author")))
                        Dim aboutAuthorParagraph As Paragraph = New Paragraph( _
                            New Run( _
                                New Text("Eric White")))
                        firstParagraph.Parent.InsertBefore(newParagraph, firstParagraph)
                        firstParagraph.Parent.InsertBefore(aboutAuthorParagraph, _
                                                           firstParagraph)
                    End If
                End Using
                Console.WriteLine("Saving")
                Dim linkFileName As String = file.Item("LinkFilename")
                file.ParentFolder.Files.Add(linkFileName, memStr, True)
            End Using
            Console.WriteLine("Starting conversion job")
            Dim job As ConversionJob = New ConversionJob(wordAutomationServiceName)
            job.UserToken = spSite.UserToken
            job.Settings.UpdateFields = True
            job.Settings.OutputFormat = SaveFormat.Document
           job.AddFile(siteUrl + "/Shared%20Documents/Test.docx", _
                siteUrl + "/Shared%20Documents/TestWithNewToc.docx")
            job.Start()
            Console.WriteLine("After starting conversion job")
            While True
                Thread.Sleep(5000)
                Console.WriteLine("Polling...")
                Dim status As ConversionJobStatus = New ConversionJobStatus( _
                    wordAutomationServiceName, job.JobId, Nothing)
                If status.Count = status.Succeeded + status.Failed Then
                    Console.WriteLine("Completed, Successful: {0}, Failed: {1}", _
                                      status.Succeeded, status.Failed)
                    Exit While
                End If
            End While
        End Using
    End Sub
End Module