How to test the WordAutomationService

I got asked whether the WordAutomationService in SharePoint could be started tested somehow or started to view ULS-Logs while running the conversion.

I creade a script to start converting a document from SharePoint (the document must exist and be in one of the supported formats).

<#
.SYNOPSIS
Tests the WordAutomationService by submitting a document and waiting for the results.
.PARAMETER InFile
Url (in SharePoint) that points to the document to convert
This documents should exist.
.PARAMETER OutFile
Url (in SharePoint) to place the converted document
This documents should *not* exist.
.PARAMETER Format
Format of the output. PDF or XPS. Default: PDF
.EXAMPLE
Test-WordAutomationService -InFile https://my.sp.farm/documents/word-doc.docx -OutFile https://my.sp.farm/documents/converted.pdf
Converts https://my.sp.farm/documents/word-doc.docx to pdf and saves the result to https://my.sp.farm/documents/converted.pdf
#>
[CmdletBinding()]
[OutputType([System.Collections.Specialized.StringCollection])]
param (
[Parameter(Mandatory=$true)]
[string]$InFile,
[Parameter(Mandatory=$true)]
[string]$OutFile,
[Parameter(Mandatory=$false)]
[ValidateSet("pdf", "xps")]
[string]$Format = "pdf"
)
$ErrorActionPreference="Stop"
Add-PSSnapin "Microsoft.SharePoint.PowerShell"
$tmp = [Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Word.Server")
if($tmp -eq $null) {
throw "Could not load Microsoft.Office.Word.Server.dll. Somethong is not right..."
}
Write-Verbose "Assembly $($tmp.GetName().Name) is present and loaded"
$serviceApp = Get-SPServiceApplication | Where-Object { $_.TypeName -eq "Word Automation Services" } | Select-Object -First 1
if($null -eq $serviceApp) {
throw "Could not find Word Automation Services Service Application. Somethong is not right..."
}
Write-Verbose "Using Service-Application $($serviceApp.Name)."
#TODO: Service app as param? what if there's more than one?!
$serviceAppProxy = Get-SPServiceApplicationProxy | Where-Object { $_.ServiceEndpointUri -eq $serviceApp.Uri.AbsoluteUri }
Write-Verbose "Using Service-ApplicationProxy $($serviceAppProxy.Name)."
$web = $null
$url = $InFile
while ($null -eq $web) {
if([string]::isNullOrEmpty($url)){
throw "could not find a viable web from url: $($InFile)"
}
$url = (Split-Path -Path $url -Parent).Replace("\", "/")
$web = Get-SPWeb $url -ErrorAction Ignore
}
Write-Verbose "Using web: $($web) ($($web.Url))"
$setting = New-Object "Microsoft.Office.Word.Server.Conversions.ConversionJobSettings"
$setting.OutputFormat = $Format.ToUpperInvariant()
$job = New-Object "Microsoft.Office.Word.Server.Conversions.ConversionJob" -ArgumentList @($serviceAppProxy.Id, $setting)
$job.UserToken = $web.CurrentUser.UserToken
$job.AddFile($InFile, $OutFile)
$job.Start()
Write-Verbose "Started conversion-job with id: $($job.JobId)"
$timer = Get-SPTimerJob | Where-Object { $_.TypeName -like "Word Automation Services Timer Job" } | Select-Object -First 1
Start-SPTimerJob $timer
Write-Verbose "TimerJob '$($timer.DisplayName)' started."
$status = New-Object "Microsoft.Office.Word.Server.Conversions.ConversionJobStatus" -ArgumentList @($serviceAppProxy.Id, $job.JobId, $null);
while (($status.NotStarted -ge 1) -or ($status.InProgress -ge 1)) {
Write-Verbose "In Progress: $($status.InProgress)"
Start-Sleep -Seconds 1
$status.Refresh()
}
$items = $status.GetItems("Succeeded,Failed,Canceled")
Write-Verbose "Job ended. $($items.Length) items in this job."
,($items) #write them...

The script will create a new conversion job for the WordAutomationService and start the corresponding TimerJob ("Word Automation Services Timer Job"). It will wait for the conversion to finish and output the results (inclunding errors).

Generally, if the WordAutomationService is not working as intended I consult the Troubleshooting Guideline.

(Remark: All links given refer to SharePoint 2010 - but all are still valid: WordAutomationService has not been changed (much).)