jueves, 15 de septiembre de 2011

Convertir un documento Word en un XPS y visualizarlo en un WPF

En esta entrada convertiremos un documento de Word en un documento XPS. ¿Porqué un XPS? este formato de documento es la competencia al PDF de parte de Microsoft. No es tan popular como el primero, ni tampoco está tan presente en las librerías de otros lenguajes, pero cuando se trabaja en .NET Framework, especialmente con interfaces WPF, es una muy buena opción que permite incrustar el documento de forma nativa dentro de la interfaz.

Podemos crear un documento XPS desde Office si instalamos el plugin que hay para esto. Pero como estoy creando un aplicativo cuyos usuarios no necesariamente lo tienen instalado, tuve que buscar la forma de convertir un documento de Word proporcionado por el usuario en un XPS. Esto es lo que se requiere:

Primero debemos importar los ensamblados necesarios:
  • Microsoft.Office.Interop.Word
  • Microsoft.Office.Tools.v9.0
  • Microsoft.Office.Tools.Word.v9.0
  • Microsoft.VisualStudio.Tools.Office.Runtime.v10.0
  • ReachFramework
Para los que no saben de qué hablo, hagan clic derecho sobre la carpeta References de su solución en Visual Studio, y en el menú contextual seleccionen Agregar referencia.... Se abrirá este cuadro donde seleccionarán los ensamblados citados:


Ahora vamos al código. Yo en una ventana XAML he creado un componente DocumentViewer así:

<DockPanel>
   <DocumentViewer Name="docview"/>
</DockPanel>

Ahora en nuestra clase C# importamos los espacios necesarios:

using System.Windows.Xps.Packaging;
using System.IO;

El espacio System.Windows.Xps.Packaging es con el que trabajaremos los documentos XPS. No importaremos el espacio Microsoft.Office.Interop.Word porque también tiene una clase llamada Document que crea ambigüedad con la de XPS.

Ahora en cualquier lugar del código, por ejemplo, dentro de un evento click de un botón, hacemos la conversión así:

Microsoft.Office.Interop.Word.Application
 wa = new Microsoft.Office.Interop.Word.Application();
wa.Documents.Add(rutaDelDoc);
Microsoft.Office.Interop.Word.Document wd = wa.ActiveDocument;
string ruta = rutaDelXPS;
wd.SaveAs(ruta, Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatXPS);
wa.Quit();
xd = new XpsDocument(ruta, FileAccess.Read);

NOTA: he omitido las cláusulas try-catch por facilidad, pero es recomendable capturar los errores que puedan ocurrir.

La variable rutaDelDoc contiene la ruta del documento de Word que queremos transformar. La variable rutaDelXPS contiene la ruta donde guardaremos el documento XPS. Finalmente, en la variable xd tenemos nuestro documento XPS final. Ahora podemos pasarle este documento a nuestro DocumentViewer así:

docview.Document = xd.GetFixedDocumentSequence();

Con esto, al ejecutar nuestro aplicativo WPF, veremos algo como esto: