Convertir a PDF con Word Automation Services

Vamos a ver un ejemplo sencillo de cómo configurar los Word Automation Services en SharePoint 2013 (servicio que aparece con SharePoint 2010, pero que con la versión 2013 incluye mejoras en la arquitectura y nuevas funcionalidades), y posteriormente convertir documentos Microsoft Word a PDF.

Antes un poco de literatura sobre este servicio:

SharePoint 2013: New Features in Word Automation Services

Word Automation Services Overview

Lo primero de todo es crear el servicio en caso de que no esté ya creado:

image

image

image

Y una vez creado el servicio de aplicaciones y el proxy, comprobamos que los Word Automation Services están en marcha:

image

Ya estaría configurado el servicio para poder desarrollar contra el. Lo siguiente sería atacarlo. En este ejemplo sencillo creamos un job que se dedique a leer de una biblioteca de documentos en concreto y convierta todos los documentos que haya a PDF.

Para poder usar las clases de conversión de documentos (existen 2, ConversionJob para conversiones asíncronas y SyncConverter para síncronas), debemos añadir la referencia a la DLL de Microsof.Office.Word.Server, que encontramos en la ruta: C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI

image

Y con el siguiente código que llamamos desde el método Execute del Job, realizamos la conversión (Al instanciar el ConversionJob, le pasamos el nombre del servicio de Word Automation Services que hemos creado anteriormente):

private void ConvertAllWordToPDF(SPList docList)
{
try
{
ULSLogger.Current.Trace("Converting all Word documents to PDF...");

ConversionJob cb = new ConversionJob("WAService");
cb.Settings.OutputFormat = SaveFormat.PDF;
cb.UserToken = docList.ParentWeb.CurrentUser.UserToken;
cb.AddLibrary(docList, docList);
cb.Start();

ULSLogger.Current.Trace("End Converting all Word documents to PDF...");
}
catch (Exception ex)
{
ULSLogger.Current.Trace("Error converting WordToPDF: " + ex.Message);
}
}

Probamos y vemos que efectivamente, convierte el documento. No tiene por qué hacerlo de forma inmediata, ya que este proceso no lo hace bajo demanda, sino que el Job de Word Automation Services tiene su propio proceso en el que comenzará la conversión cuando corresponda (se puede configurar).


Si por ejemplo queremos ir un poco más allá, y ver el estado de la conversión, así como información del resultado, podemos ampliar el código anterior con algo similar a lo siguiente:


public override void Execute(Guid targetInstanceId)
{
SPWebApplication wapp = this.Parent as SPWebApplication;
SPContentDatabase contentDB = wapp.ContentDatabases[targetInstanceId];

SPList docList = contentDB.Sites.FirstOrDefault().RootWeb.Lists["Documents"];
ConvertAllWordToPDF(docList);
}

private void ConvertAllWordToPDF(SPList docList)
{
try
{
ULSLogger.Current.Trace("Converting all Word documents to PDF...");

ConversionJob cb = new ConversionJob("WAService");
cb.Settings.OutputFormat = SaveFormat.PDF;
cb.Settings.UpdateFields = true;
cb.UserToken = docList.ParentWeb.CurrentUser.UserToken;
cb.AddLibrary(docList, docList);
cb.Start();

ConversionJobStatus status = new ConversionJobStatus("WAService", cb.JobId, cb.SubscriptionId);
while (true)
{
status = new ConversionJobStatus("WAService", cb.JobId, cb.SubscriptionId);
ULSLogger.Current.Trace("Reading status...");
ULSLogger.Current.Trace(String
.Format("Count: {0} | NotStarted: {1} | InProgress: {2} | Succeded: {3} | Failed: {4} | Canceled: {5}",
status.Count, status.NotStarted, status.InProgress, status.Succeeded, status.Failed, status.Canceled));

if (status.Count == status.Succeeded + status.Failed)
{
foreach (var succeded in status.GetItems(ItemTypes.Succeeded))
{
ULSLogger.Current.Trace(String
.Format("Succeded doc: {0} | StartedTime: {1} | CompletedTime {2}",
succeded.OutputFile, succeded.StartTime, succeded.CompleteTime));
}

//Other status

break;
}

Thread.Sleep(1000);
}


ULSLogger.Current.Trace("End Converting all Word documents to PDF...");
}
catch (Exception ex)
{
ULSLogger.Current.Trace("Error converting WordToPDF: " + ex.Message);
}
}

 


Probamos y vemos el resultado que sale en el Monitor ULS.

1 comentarios:

Raul 15 de febrero de 2014, 11:16  

Interesante post.

Publicar un comentario

SharePoint Between Racks © 2012
. Con la tecnología de Blogger.

¡Compártelo!


Estoy en LinkedIn!


Ve mi perfil en LinkedIn!