none
Convertir un document Word en Pdf avec "Word Automation Services"

    General discussion

  • Au travers de ce billet nous allons voir comment utiliser Word Automation Services pour convertir un document Word en Pdf à l'aide d'une Custom Action directement intégrer dans le menu contextuel d'un élément d'un bibliothèque de document. Cette solution fait appel à quelques connaissances en développement car bien que le service en lui même soient natif à SharePoint 2010 (version Serveur) il n'y a aucune fonctionnalité "Out of the Box" pour convertir un document en PDF. Que les non-développeurs se rassurent, j'ai inclus en bas de page la solution sous forme d'un wsp à déployer dans votre ferme SharePoint ;-)

    Etape 1: Configuration du service "Word Automation Services"

    Pour que notre solution fonctionne, il faut bien entendu s'assurer que le service "Word Automation Services" soit démarrer. Pour vérifier cela, rendez-vous dans la Centrale d'Administration sous la rubrique "Application Management" et cliquer sur "Manage Service Applications". Vérifier que le service "Word Automation Services" soit bien configurer et démarrer dans la liste des services.

    En cliquant sur le service en lui-même, assurez-vous que les case à cocher correspondant aux formats que vous voulez convertir soient bien cochées.

    Vous pouvez laisser les autres paramètres tels quels bien que dans le cas d'une mise en production il soit conseiller d'affiner tout cela. Si votre service n'était pas encore créer je vous invite à suivre ce lien afin le faire : http://odedrabanitips.blogspot.com/2010/12/how-to-configure-word-automation.html

    Etape 2 : Création du projet dans Visual Studio 2010

    Rien de bien exotique dans cette étape car il suffit de créer un projet SharePoint 2010 vide dans Visual Studio 2010. La seule chose à savoir est que le service "Word Automation Services" fait appel à un timer job et qu'il nous est donc impossible de déployer notre solution en mode "SandBox". Veillez donc à bien cocher la case pour déployer la solution en mode "ferme" comme illustré ci-dessous.

    Etape 3 : Création d'une "Custom Action" dans l'ECB

    Cette étape va nous servir à ajouter une action dans le menu contextuel d'un élément de notre bibliothèque de document. Pour les puristes, ce menu contextuel est appelé "Edit Control Block" ou plus communément "ECB".

    Pour faire cela, il vous suffit d'ajouter un "Élément vide" à votre solution, de lui donner un nom et de copier le code suivant :

    <?xml version="1.0" encoding="utf-8"?>
    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
    <CustomAction
    Id=" SPAWCustomAction"
    RegistrationType="List"
    RegistrationId="101"
    ImageUrl="/_layouts/images/pdficon_small.gif"
    Location="EditControlBlock"
    Sequence="100"
    Title="Conversion Word vers PDF">
    <UrlAction Url="javascript:OpenPopUpPageWithTitle('{SiteUrl}/_layouts/SpawPDFConverter/Converter.aspx?siteUrl={SiteUrl}&amp;itemId={ItemId}&amp;listID={ListId}', RefreshOnDialogClose, 600, 200,'Conversion Word vers PDF')"/>
    </CustomAction>
    </Elements>

    Noter que j'ai uploader une icône pdf (pdficon_small.gif) lors de l'installation du iFilter Pdf. Si vous ne l'avez pas encore fait vous pouvez suivre ce tutoriel ou simplement supprimer la ligne "ImageUrl"...

    Update : l'image a été ajoutée dans la solution wsp disponible en bas de l'article ;-)

    Vous noterez également que la balise <UrlAction> fait appel au javascript de SharePoint afin d'afficher la page "Converter.aspx" dans une fenêtre modale.

    Etape 4 : Création de la page chargée du processus de conversion

    Maintenant que nous avons créer une Custom Action pour lancer le processus de conversion, il nous faut créer la page "Converter.aspx" qui sera appelée lorsque l'utilisateur cliquera sur cette action. Cette page sera placée dans le répertoire "_Layouts" via un "Mapped Folder" dans Visual Studio 2010.

    Dans la page aspx j'ai écris le code suivant :

    <asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
    <p><label id="lConversion" runat="server" /></p><br />
    <input type="button" value="ok" onclick="SP.UI.ModalDialog.commonModalDialogClose(SP.UI.DialogResult.OK, 'Ok clicked'); return false;" /><br /><br />
    <label id="lStatut" runat="server" />
    </asp:Content>

    La première ligne se charge d'afficher le label "lConversion" qui correspond au nom du fichier que l'on veut convertir ainsi qu'au nom du fichier PDF qui sera créer.

    La seconde ligne se charge d'afficher un bouton "OK" pour fermer la fenêtre modale et la troisième ligne affichera le message d'erreur s'il devait y avoir un problème.

    Etape 5 : le code behind pour lancer le job de conversion

    Il ne vous reste plus qu'à coller le code suivant dans votre page converter.aspx.cs qui se chargera de démarrer le processus de conversion de votre document.

    using System;
    using System.Text;
    using Microsoft.SharePoint;
    using Microsoft.Office.Word.Server.Conversions;
    using Microsoft.SharePoint.WebControls;

    namespace SpawPDFconverter.Layouts.SpawPDFconverter
    {
    public partial class Converter : LayoutsPageBase
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    try
    {
    string siteUrl = Request.QueryString["SiteUrl"];
    string listId = Request.QueryString["ListId"];
    string itemId = Request.QueryString["ItemId"];

    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
    using (SPSite site = new SPSite(siteUrl))
    {
    using (SPWeb web = site.OpenWeb())
    {
    SPDocumentLibrary library = (SPDocumentLibrary)web.Lists[new Guid(listId)];
    SPListItem item = library.GetItemById(int.Parse(itemId));
    SPFile file = item.File;

    if (file.Name.EndsWith(".doc", StringComparison.CurrentCultureIgnoreCase) ||
    file.Name.EndsWith(".docx", StringComparison.CurrentCultureIgnoreCase))
    {
    //Set up the job
    ConversionJobSettings jobSettings = new ConversionJobSettings();
    jobSettings.OutputFormat = SaveFormat.PDF;
    ConversionJob job = new ConversionJob("Word Automation Services", jobSettings);
    job.UserToken = web.CurrentUser.UserToken;

    //File names
    string wordFile = web.Url + "/" + item.Url;
    string pdfFile = string.Empty;
    if (file.Name.EndsWith(".doc", StringComparison.CurrentCultureIgnoreCase))
    pdfFile = wordFile.Replace(".doc", ".pdf");
    if (file.Name.EndsWith(".docx", StringComparison.CurrentCultureIgnoreCase))
    pdfFile = wordFile.Replace(".docx", ".pdf");

    //Start Job
    job.AddFile(wordFile, pdfFile);
    job.Start();

    StringBuilder message = new StringBuilder();
    message.Append("<p>Conversion du documents en cours... </p>");
    message.Append("<p>Fichier Word à convertir : ");
    message.Append(wordFile);
    message.Append("</p>Fichier PDF : ");
    message.Append(pdfFile);

    lConversion.InnerHtml = message.ToString();
    lStatut.InnerText = "";
    lStatut.Visible = true;
    }
    }
    }
    });
    }
    catch (Exception ex)
    {
    lStatut.Visible = true;
    lStatut.InnerText = "Error:";
    lStatut.InnerText += ex.Message;
    }
    }
    }
    }

    Vu la longueur du code je ne vais pas commenter chaque ligne mais en gros voici ce qu'il se passe.

    • Les 3 premières string me permette d'identifier le site, la liste et l'item.
    • Ensuite j'identifie le type de document qui pourra être converti, à savoir le .doc et le .docx (vous pouvez également convertir tous les types de documents repris dans le Service Application comme l'html, le rtf, l'xml, etc...)
    • J'identifie le service que je veux lancer à savoir "Word Automation Services". (Noter que si vous avez créer votre service en lui donnant un autre nom il vous faudra remplacer ce paramètre)
    • Ensuite je modifie le nom de mon fichier Word en modifiant son extension en .pdf
    • Et je lance le job de conversion. (Par défaut le job se lance toutes les 15 minutes mais vous pouvez modifier ce paramètre via la Centrale d'Administration)

    Le StringBuilder quant à lui permet de construire la phrase qui sera affichée dans la fenêtre modale lors de l'exécution de la Custom Action et le "Catch" sert bien entendu à récupérer le message d'erreur s'il devait y en avoir une.

    Etape 6 : le résultat en image

    La Custom Action dans l'ECB

    La fenêtre modale qui affiche la page "Converter.aspx"

    La bibliothèque de document avec le pdf qui vient d'être créér

    En espérant que cela vous soit utile...

    Vous trouverez sur mon blog la solution sous forme d'un .wsp à déployer sur vos serveur ;-)


    Pascal P
    http://sharepoint-afterwork.fr
    Nouveaux site en FR
    Twitter: @PascalPoeck
    • Moved by Hengzhe Li Tuesday, February 21, 2012 5:42 AM merge forum (Origine :Développement Sharepoint 2010)
    Wednesday, November 02, 2011 3:01 PM

All replies