WPF does not support
functionality to view Microsoft Word documents but there is a work around this
problem. WPF DocumentViewer control is used to display fixed documents such as
an XPS (XML Paper Specification) document. We can open a Word document if we
can convert a Word document to an XPS document. This conversion is possible by
using Office Interop and Office Tools frameworks that is used to work with
Office documents.
Add Reference to XPS and Office
Interop Assemblies
Before we do any actual work, we must add reference to the
following assemblies.
* ReachFramework.dll
* Microsoft.Office.Tools.v9.0.dll
* Microsoft.Office.Tools.Word.v9.0dll
* Microsoft.VisualStudio.Tools.Office.Runtime.v9.0.dll
* Microsoft.Office.Interop.Word.dll
The first assembly, ReachFramework.dll hosts the
functionality for XPS documents and rest of the assemblies hosts the
functionality Office Interop and Office Tools support.
Note: You must also
install 2007 Microsoft Office Add-in: Microsoft Save as PDF or XPS that you can
download using the following link. http://www.microsoft.com/downloads/details.aspx?FamilyID=4d951911-3e7e-4ae6-b059-a2e79ed87041&displaylang=en
To add reference to these assemblies, you right click on Add
Reference on the project name in Solution Explorer. On the .NET Framework,
select ReachFramework and other assemblies from the list and click OK button.
Figure 1 shows ReachFramework in Add Reference dialog.

Figure 1
You may have multiple
assemblies installed on your machine. Make sure you select Version 12 for
Microsoft.Office.Interop.Word assemblies as you see in Figure 2, otherwise your
conversion will fail.

Figure 2
Once you have added the reference to assemblies, you must
import the following namespaces to your code behind.
using
System.IO;
using
Microsoft.Office.Interop.Word;
using
Microsoft.Win32;
using System.Windows.Xps.Packaging;
Convert Doc to XPS
The SaveAs method of Document class available in
OfficeInterop allows us to save a word document as an XPS document. However,
you must make sure you have version 12 of assembly added to your project as I
mentioned before.
The ConvertWordDocToXPSDoc method takes a full path of a
word document file and new full path of XPS document and converts doc file to
an xps file.
/// <summary>
/// This method takes a Word document full path and new XPS document
full path and name
/// and returns the new XpsDocument
/// </summary>
/// <param
name="wordDocName"></param>
/// <param
name="xpsDocName"></param>
/// <returns></returns>
private XpsDocument ConvertWordDocToXPSDoc(string wordDocName, string
xpsDocName)
{
// Create a
WordApplication and add Document to it
Microsoft.Office.Interop.Word.Application
wordApplication = new Microsoft.Office.Interop.Word.Application();
wordApplication.Documents.Add(wordDocName);
Document
doc = wordApplication.ActiveDocument;
// You must make
sure you have Microsoft.Office.Interop.Word.Dll version 12.
// Version 11 or
previous versions do not have WdSaveFormat.wdFormatXPS option
try
{
doc.SaveAs(xpsDocName, WdSaveFormat.wdFormatXPS);
wordApplication.Quit();
XpsDocument
xpsDoc = new XpsDocument(xpsDocName,
System.IO.FileAccess.Read);
return
xpsDoc;
}
catch (Exception exp)
{
string
str = exp.Message;
}
return null;
}
XPS Viewer Application
Let's create a WPF Application using Visual Studio 2010 and
add a TextBox, Button, and a DocumentViewer. Here is XAML code looks like.
<Grid>
<DocumentViewer HorizontalAlignment="Left" Margin="0,42,0,0"
Name="documentViewer1" VerticalAlignment="Top" Height="508" Width="766" />
<TextBox Height="29" HorizontalAlignment="Left" Margin="6,6,0,0"
Name="SelectedFileTextBox" VerticalAlignment="Top" Width="276" />
<Button Content="Browse" Height="30" HorizontalAlignment="Right" Margin="0,6,353,0"
Name="BrowseButton" VerticalAlignment="Top" Width="122" Click="BrowseButton_Click"
/>
</Grid>
The application looks like Figure 3 where Browse button is
used to browse word documents on your machine.

Figure 3
The Browse button click event handler code looks like this
where we convert a word document to an XPS document and view that in a
DocumentViewer control.
private void BrowseButton_Click(object
sender, RoutedEventArgs e)
{
// Create
OpenFileDialog
Microsoft.Win32.OpenFileDialog
dlg = new Microsoft.Win32.OpenFileDialog();
// Set filter for
file extension and default file extension
dlg.DefaultExt = ".doc";
dlg.Filter = "Word
documents (.doc)|*.doc";
// Display
OpenFileDialog by calling ShowDialog method
Nullable<bool> result = dlg.ShowDialog();
// Get the
selected file name and display in a TextBox
if (result
== true)
{
if
(dlg.FileName.Length > 0)
{
SelectedFileTextBox.Text =
dlg.FileName;
string
newXPSDocumentName = String.Concat(System.IO.Path.GetDirectoryName(dlg.FileName), "\\",
System.IO.Path.GetFileNameWithoutExtension(dlg.FileName), ".xps");
// Set
DocumentViewer.Document to XPS document
documentViewer1.Document =
ConvertWordDocToXPSDoc(dlg.FileName,
newXPSDocumentName).GetFixedDocumentSequence();
}
}
}
Run the Application
Just run your
application, click the Browse button, select a word document and your output
will look like Figure 4.

Figure 4