Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Julien Chable

He blogs, you blog, I blog ...

Archives

[SharePoint 2010] Créer une webpart de génération de sommaire automatique des titres d’une page de publication

Voici un petit bout de code rapide pour réaliser un sommaire des titres (H1) dans une page de publication assez longue, avec un retour vers le sommaire sous le titre :

var WebPart_SommaireAncres_Variable_Sommaire_CodeRetourSommaire = "<div class='WebPart_Sommaire_RetourSommaire'><a class='WebPart_Sommaire_RetourSommaire_a' href='#Sommaire'>Retour Sommaire</a><img class='WebPart_Sommaire_RetourSommaire_img' src='/_layouts/DemoCorp/images/WebPart_Sommaire_Fleche-Haut.png' /></div>"

jQuery(document).ready(function () {

    var divMainResize = document.getElementById('MainResize');

    /* Ajout des ancres sur les H1 */
    var divh1Array = divMainResize.getElementsByTagName('h1');
    for (var i = 0; i < divh1Array.length; i++) {
        // Ajoute l'id qui permet au menu d'identifier le titre
        jQuery(divh1ArrayIdea).attr("id", "sommaireIndex" + i);
        // Ajoute le lien de retour vers le sommaire
        jQuery(divh1ArrayIdea).after(WebPart_SommaireAncres_Variable_Sommaire_CodeRetourSommaire);
    }

    /* Ajout du sommaire */
    var elSommaire = jQuery("<a name='Sommaire'></a>");
    jQuery(divMainResize).prepend(elSommaire);
    // Génération du sommaire
    var elContenuSommaire = jQuery("<div id='WebPart_Sommaire'></div>").appendTo(elSommaire);
    jQuery("<h1 class='WebPart_Sommaire_h1'>Sommaire</h1>").appendTo(jQuery(elContenuSommaire));
    var elSommaireListe = jQuery("<ul class='WebPart_Sommaire_Liste_Lien_ul'></u>");
    jQuery(elSommaireListe).appendTo(jQuery(elContenuSommaire));
    for (var i = 1; i < divh1Array.length; i++) { // Début à 1 car nous ajoutons un H1 avec le titre du sommaire
        var contenuLi = jQuery("<li class='WebPart_Sommaire_Liste_Lien_li'></li>");
        jQuery(contenuLi).appendTo(elSommaireListe);
        var contenuLinkLi = jQuery("<a class='WebPart_Sommaire_Liste_Lien_a' href='#sommaireIndex" + (i - 1).toString() + "'>" + divh1ArrayIdea.innerHTML + "</a>");
        jQuery(contenuLinkLi).appendTo(contenuLi);
    }
});

Avec un peu de CSS et des images cela devrait rendre quelque chose de pas mal du tout !

SharePoint 2010 : Gérer la planification des pages de publication

Un petit bout de code pour gérer planifier des pages de publication :

SPList list=web.Lists["Pages"];
SPListItem item = list.GetItemById(…); // Récupération de l’élément à planifier


if (ScheduledItem.IsScheduledItem(item))
{
   ScheduledItem scheduledItem = ScheduledItem.GetScheduledItem(listItem);
   DateTime startDate = DateTimeNow;
   DateTime endDate = new DateTime(2013, 12, 31, 23, 59, 00);
   scheduledItem.StartDate = startDate;
   scheduledItem.EndDate = endDate;
   scheduledItem.ListItem.Update();
   scheduledItem.Schedule();
}

AutoSPInstaller pour SharePoint 2013 maintenant disponible en “RTM”

Alors qu’il n’était qu’en Beta et que quelques dysfonctionnements persistaient, la nouvelle version du fabuleux script AutoSPInstaller permettant d’installer SharePoint 2010/2013 en full script (idéal pour répliquer des fermes de dev/qual/prod) est maintenant stabilisé pour SharePoint 2013 !

Retrouvez toutes les informations et le téléchargement sur le site Codeplex de l’outil : http://autospinstaller.codeplex.com/

Un grand merci à ses auteurs ! Plus qu’à checker tous mes anciens fichiers de configurations (et les quelques adaptations faites dans le script pour les installs en FR). Messieurs (mesdames ?), à vos installs !

[SharePoint 2010] Publishing : ajouter ses propres styles dans l’éditeur de contenu

Lorsque vous déployez un site de publication, le processus normal de personnalisation passe par la page maitre (souvent plusieurs) et la création de gabarits de pages adaptés. Dans la majorité des cas, il est également indispensable de modifier les styles CSS des styles de l’éditeur de contenu pour refléter le style global du site.

Il se peut également que vos utilisateurs aient également besoin de style spécifique à leurs besoins, par exemple un style de paragraphe particulier pour mettre en valeur son contenu :

image

Pour ajouter vos propres styles dans le ruban d’édition, l’opération est relativement simple, alors pourquoi s’en passer !

1. Créer son style CSS applicable au contenu avec un nom dont le préfixe est ‘ms-rteStyle-‘ par exemple ms-rteStyle-ZoneImportant

Par exemple :

p.ms-rteStyle-BoiteImportant
{
   
padding:10px !important;
   
border-color: #FFC829;
    background-color: #FFF2CC;

    border-width: 5px;
    border-style: solid;
    border-radius: 20px 0px 20px 0px;
    line-height:2;
    width:200px;
    height:200px;
}

2. Ajouter l’attribut –ms-name qui spécifie du nom du style tel qu’il apparaitra dans le ruban d’édition

Par exemple :

p.ms-rteStyle-BoiteImportant
{
-ms-name:"Zone Important";
padding:10px !important;
...
}

3. Inclure la référence – si ce n’est pas déjà fait – dans la page maitre

Par exemple (ici avec un déploiement de votre fichier CSS contenant votre définition dans la bibliothèques de style) :

<link rel="stylesheet" type="text/css" href="http://blogs.developpeur.org/Style%20Library/StylesEdition.css" />

Remarque : c’est la dernière définition CSS appliquée au style qui donnera le nom de ce dernier. Si un autre CSS s’applique après celui que vous avez créé et dans lequel vous avez surchargé la définition (par exemple pour avoir une déclinaison de couleur différente spécifique en fonction d’un site), il vous faudra remettre le nom du style (via l’attribut -ms-name:"Titre mon style") sinon votre thème aura un titre vide !

Et le tour est joué !

[SharePoint] Rendre un calendrier SharePoint consultable pour iPhone/iPad ou autre smartphone/tablet

Pendant vos projets SharePoint, vos utilisateurs vont ont certainement fait part qu’ils souhaitaient synchroniser un calendrier spécifique et particulièrement important avec leur iPhone ou leur iPad (que ce soit en interne ou en extérieur). Néanmoins, L’iPhone ne sait pas le faire pas naturellement : rien de plus simple qu’une publication au format iCalendar pour palier au problème !

Pour faire face à cette situation, direction Visual Studio 2010 (avec Nuget installé) ou 2012 (mieux !) :

  1. Créez un nouveau projet SharePoint vide
  2. Ajoutez le package DDay.iCal à votre projet (que vous pouvez trouver ici : http://nuget.org/packages/DDay.iCal) qui va nous permettre de générer simplement la sortie iCal
  3. Créez un fichier handler .ashx et copier (en l’adaptant à votre environnement) suivant :

<%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Assembly Name="Contoso.iCal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5d957034fc68cb87" %>
<%@ WebHandler Language="C#" Class="Consoto.iCalPublisher.Agenda" %>

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Web;
using Noumea.iCal;
using Microsoft.SharePoint;

namespace Contoso.iCalPublisher
{
    public class Agenda : IHttpHandler
    {
        public bool IsReusable
        {
            get { return false; }
        }

        public void ProcessRequest(HttpContext context)
        {
            iCalCalendar cal = new iCalCalendar();

            using (SPSite site = new SPSite("http://demo.contoso.nc/managers/"))
            {
                using (SPWeb web = site.RootWeb)
                {
                    // Récupération du calendrier à publier en iCal
                    SPList calManager = web.Lists.TryGetList("Agenda Managers");
                   
                    if (calManager != null)
                    {
                        // Filtrage par rapport à un type de contenu et ne récupère que les 15 derniers jours d'évènements antérieurs à la date du jour
                        SPQuery query = new SPQuery();
                        query.Query = string.Concat(
                                "<Where><And><Eq><FieldRef Name='ContentType'/><Value Type='Text'>Evènement Manager</Value></Eq><Geq><FieldRef Name='EndDate' /><Value Type='DateTime'><Today OffsetDays='-15' /></Value></Geq></And></Where>");
                        SPListItemCollection listItems = calManager.GetItems(query);
                        // On exporte tous les évènements récupérés en iCal
                        foreach (SPListItem item in listItems)
                        {
                            iCalEvent evt = new iCalEvent();
                            evt.DateBegin = DateTime.Parse(item["EventDate"].ToString());
                            evt.DateEnd = DateTime.Parse(item["EndDate"].ToString());
                            evt.Description = item["Title"].ToString();
                            evt.Location = item["Location"] != null ? item["Location"].ToString() : "";
                            cal.Events.Add(evt);
                        }
                    }
                }
            }

            byte[] arrBytData = cal.Serialize();
            context.Response.Clear();
            context.Response.ContentType = "text/plain";
            // Pour éviter le cache
            context.Response.AppendHeader("Pragma", "no-cache");
            context.Response.AppendHeader("Expires", "Sat, 05 Jul 2010 05:00:00 GMT");
            context.Response.AppendHeader("Content-Disposition", "attachment; filename=CalendrierManager.ics");
            context.Response.AppendHeader("Content-Length", arrBytData.Length.ToString());
            context.Response.ContentType = "text/calendar";
            context.Response.BinaryWrite(arrBytData);
            context.Response.Flush();
            context.Response.End();
            context.Response.Close();
        }
    }
}

That’s all folks ! Bien évidemment la sécurité fonctionne à merveille (authentification requise).

SharePoint 2013 @Noumea : kickoff 2012 !

Le kickoff de SharePoiçnt 2013, Office 2013 … (la liste est longue pour cette déferlante MS) à l’autre bout du monde, à Nouméa, s’est déroulé le 07 Novembre 2012. Au programme du Windows 8 (avec un clin d’oeil particulier au nouvel Hyper V3 maintenant inclut dans Windows 8 !) pour le côté ergonomie et expérience utilisateur :

IMG_7125

Suivi de Office 2013 et SharePoint 2013 (avec une machine qui ramait malgré 6 Go RAM, un SSD et 6 coeurs de core i7 !) :

IMG_7133

Bref SharePoint 2013 ça se passe ici aussi !

Mettre à jour les administrateurs du magasin de termes avec PowerShell

S’il vous prend d’envie d’ajouter un administrateur au magasin de termes du service de métadonnées avec PowerShell, voici quelques lignes de PowerShell pour le faire (fonctionne avec SharePoint 2010 et 2013) :

    $adminSite = Get-SPSite “http://sharepoint.contoso.prod:2013

    $taxoSession = Get-SPTaxonomySession -site $adminSite

    $metadataService = Get-SPMetadataServiceApplication – Identity “Managed Metadata Service”

    $termStore = $taxoSession.TermStores[$metadataService.DisplayName]

    $termStore.AddTermStoreAdministrator(“Domain\Nom utilisateur”)

    $termStore.CommitAll()

[SharePoint 2013] Le guide de déploiement de SharePoint 2013 Preview

En attendant la version RTM, voici le guide de déploiement de la version Preview de SharePoint 2013. Ce guide sera très sensiblement identique pour la version finale donc à prendre d’ores et déjà comme référence :

http://download.microsoft.com/download/1/F/6/1F6D3BE4-1174-4320-A1D1-C0E2681CCCF3/Deployment-guide-for-SharePoint-2013-Preview.pdf

Un programme très complet (de 407 pages !) :

- Préparation des environnements (matériel et logiciel : Windows, SQL Server, etc des comptes Windows, )
- Installation des environnements pour différentes configurations : standalone, simple serveur SP + SQL, ferme de plusieurs serveurs, etc et installation des packs de langue.
- Installation dans un environnement virtualisé avec Hyper-V
- Configuration des services (en détail !)
- Configuration de la ferme
- Gestion des apps
- Bonnes pratiques
- Etc

Excellente (soirées de) lecture

Pour rappel ! Les spécifications des protocoles Office et SharePoint sont disponibles sur MSDN

Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd’hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c’est important de le rappeler), la majorité des spécifications et des protocoles de l’éditeur de Redmond sont aujourd’hui accessibles – et depuis quelques temps déjà - en ligne gratuitement et pour une implémentation “royalties-free” (Open Specification Promise). Voici le line de cette caverne d’Ali  Baba : http://msdn.microsoft.com/en-us/library/dd208104(v=prot.10)

Pour les protocoles d’échange (Office, SharePoint, Exchange, Windows et SQL Server) c’est par ici : http://msdn.microsoft.com/en-us/library/gg685446.aspx

Dans ces liens vous trouverez donc facilement comment “attaquer” les produits MS en Java ou autres technologies pour projet d’intégration. A lire sans modération !

MVP SharePoint Server again !

C’est toujours une bonne semaine qui démarre lorsque l’on reçoit le mail de nomination MVP ! C’est donc avec beaucoup de plaisir que je démarre cette sixième année en tant que membre de cette grande communauté de passionnés.

Comme bonne résolution pour cette nouvelle année : participer au prochain Summit en évitant cette fois de lâcher mon coloc de chambre Kangoo au dernier moment !

Félicitations aux nouveaux arrivants et bien sûr aux renouvelés, sans qui cette grande communauté n’existerait pas.

[SharePoint 2010] Erreur d’analyse de contenu “L’élément SharePoint en cours d’analyse a renvoyé une erreur lors de la demande de données auprès du service Web”

Que faire lorsque l’indexation du contenu de certaines collections de sites vous renvoie : “L’élément SharePoint en cours d’analyse a renvoyé une erreur lors de la demande de données auprès du service Web. ( Error from SharePoint site: Les données sont null. Cette méthode ou propriété ne peut pas être appelée sur des valeurs Null. )” ? (à part perdre son temps à créer de nouveaux proxies de recherche, à tester toutes les configurations possibles ou encore à scruter les logs avec minutie ?)

Il s’agit d’une erreur a priori  “bien connue” de Microsoft qui la détaille dans cette KB. Mais comment une telle erreur peut-elle bien se produire ? Mauvaise configuration du service de recherche ? Une réindexation sauvage ? Un proxy de service défaillant ? Non ! Il s’agit ‘tout simplement’ d’un bug dans votre code ou de celui de votre fournisseur, en effet le service d’indexation n’aime pas avoir la description d’un groupe avec une valeur null.

Mais comment fait-on pour avoir une description null d’un groupe : en l’ajoutant avec du code et en lui spécifiant une description null. Pour faire simple, voici un exemple de code menant à cette ‘erreur’ :

using (SPSite oSite = new SPSite(textBox1.Text))
{
                    using (SPWeb oWeb = oSite.OpenWeb())
                    {
                        SPGroupCollection oGroupColl = oWeb.SiteGroups;
                        SPUser oUser = oWeb.AllUsers["domain\\user"];
                        oGroupColl.Add("Testing Group", oUser, oUser, null);

                    }
          }

La KB propose un code pour corriger cela, mais on remerciera Damien NOBLET, pour avoir créé un outil efficace qui corrigera les groupes ‘défaillants’ en tout simplicité et qui disponible sur la plateforme Codeplex :  http://sp2010fixgroups.codeplex.com/ (un grand merci pour cet outil à Damien).

[SharePoint 2010] Insérer le numéro de version SharePoint dans un document

Une question posée aujourd’hui qui m’a laissé perplexe : comment fait-on pour intégrer le numéro de version SharePoint dans le document ? Dans un précédent post, je vous avais présenté l’insertion des propriétés serveur. Malheureusement, cette propriété n’est pas disponible dans les champs à insérer.

La démarche consiste à utiliser un type de contenu et la fonctionnalité de stratégie de gestion des informations de SharePoint Server (SP Foundation est donc exclut).

Voici une méthode permettant de contourner ce manque :

  1. Dans la bibliothèque de documents :
    1. Activer la gestion des versions
    2. Activer les types de contenu
  2. Créer un nouveau type de contenu OU modifier un type de contenu existant OU dans un type de contenu que vous avez rattaché à la bibliothèque :
    1. Aller dans ‘Paramètres de la gestion de la stratégie des informations’
    2. Activer les étiquettes
      1. Attention : ne cochez pas les deux cases juste en dessus
      2. Donner le format suivant (le format sera “Version : 0.1” par exemple) : Version : {Version}
      3. Si vous actualisez l’aperçu, vous aurez une chaine de la forme Version : {_UIVersionString} : c’est normal !
    3. Enregistrer la modification
  3. Créer ou ouvrir un document existant dans votre bibliothèque :
    1. Menu Insérer > QuickPart > Propriétés du document > Etiquette :

image

Après enregistrement le numéro de version sera inséré :

image

Bonne lecture

[SharePoint 2010] Cumulative Update de Décembre disponible

Et oui nous sommes déjà en fin d’année et quoi de mieux de la part du père Noël qu’un petit CU qui va bien (et en avance) :

http://blogs.msdn.com/b/joerg_sinemus/archive/2011/12/14/sharepoint-2010-and-december-2011-cu.aspx

Les photos du MS Day Nouméa

SharePoint a bien atteint les coins les plus reculés du monde et notamment Nouméa avec cette édition qui a permis aux partenaires de s’exprimer sur leur sujet de prédilection : Lync, SharePoint, Project, Cloud, etc.

Tout ça accompagner par une XBOX 360 et la bonne humeur locale des invités.

Préparation de la salle

Une salle dans un hotel 4* fraichement ouvert, des affiches Microsoft partout, des petits-fours et des rafraichissement, nous voici bien dans un évènement Microsoft :

IMG_5933 (Medium)

IMG_5935 (Medium)

Je vous l’accorde nous ne sommes pas dans un TechDays parisien avec une salle de 200 personnes ou plus en délire. D’un certain point de vue, tant mieux, cela ne fait que renforcer la proximité avec son audience et rendre les sessions plus interactives.

SharePoint Server 2010

Le produit phare du moment de Microsoft a eu le droit à deux sessions (niveau 100/200) :

  • Découverte des 10 fonctionnalités : GED, ECM, Recherche, etc  - Kelios Solutions
  • Les 10 points clé de la réussite d’un projet SharePoint 2010 – Kelios Solutions

P1070019

(merci à Paul-Jorge pour les photos, il faudra investir dans un vrai appareil et plus dans une XBOX 360 pour l’année prochaine)

(pour ceux qui l’aurait reconnu, j’ai eu l’occasion de présenter les sessions avec un super polo MVP !)

Et Project Server 2010 dans tout ça ?

Project Server 2010 n’est pas non plus en reste avec une belle prestation de Yves Zeegers (société GPS²) :

IMG_5938 (Medium)

IMG_5940 (Medium)

A l’année prochaine (ou avant … Clignement d'œil ) !

MSDay Nouméa 06/12 : SharePoint à l’honneur

Après avoir été reporté, le voici enfin : le MSDay Nouvelle Calédonie ! La date est arrêtée au 06 Décembre au Royal Tera à partir de 7h30

Kelios Solutions, par la personne de Pierre TATOT et moi-même présenteront deux sessions pendant cette journée :

  • Le top 10 des fonctionnalités SharePoint
  • La gouvernance : comment réussir votre projet SharePoint ?

Ce dernier titre ce jeu volontairement provocateur. Basé sur notre retour d’expérience et ceux de nos confrères, cette session aura pour objectif de présenter les bonnes pratiques et d’en identifier les mauvaises qui permettront aux entreprises désireuses d’implémenter SharePoint Server 2010 (collaboration, recherche, GED, facing site, BI, etc) de partir sur un bon pied et de de garantir une certaine efficacité dans leur projet.

L’agenda des sessions se trouve ici : http://www.microsoft.com/africa/caledonia/opendoor/homepage.aspx

[SharePoint 2010] Le Cumulative Update d’Octobre 2011 de SPF et SPS 2010 est sortie

Vous pouvez retrouver ce dernier Cumulative Update sur le site des mises à jour officiel de SharePoint 2010: http://technet.microsoft.com/en-us/sharepoint/ff800847

image

Au programme, quelques corrections attendues notamment quelques problèmes avec les packs de langue. A n’appliquer que si vous rencontrez les problèmes listés dans la KB.

[SharePoint 2010] Supprimer les webparts ‘Accès refusé’ de vos pages

Microsoft n’ayant pas encore penser à intégrer cette fonctionnalité dans leur produit de collaboration phare d’entrée de gamme : SharePoint Foundation, voici un moyen de supprimer les webparts de liste pour lesquels l’utilisateur n’a pas accès au contenu (le contenu de la webpart donne un “Accès refusé” comme contenu) :

  
        function runOnLoad() {
            $(".s4-wpTopTable:has(div:contains('Accès refusé'))").hide();
        }
        _spBodyOnLoadFunctionNames.push("runOnLoad");
  

Ce rapide script JQuery peut être intégré dans vos master page (n’oubliez pas d’inclure le lien vers la librarie JQuery également !) et même s’il ne reste pas très élégant, cela fonctionne pour les utilisateurs n’ayant pas l’édition SharePoint Server et son mécanisme des audiences.

Introduction à SharePoint 2010 Word Services

Voici un article qui avait tendance à prendre la poussière sur mon disque dur. Le voici donc :

Le traitement des documents bureautiques est devenu aujourd’hui un véritable enjeu stratégique pour les entreprises. Pour gérer le volume d’informations stockées dans ce type de documents et leurs échanges, les besoins d’automatisation des traitements des documents bureautiques (génération, modification en masse, consolidation des informations, conversion en PDF pour archivage, etc) deviennent de plus en plus complexes et critiques pour les entreprises.

Avant l’arrivée de Word Services au sein de la plateforme SharePoint 2010, Microsoft préconisait par le biais d’un article - http://support.microsoft.com/kb/257757 - l’utilisation de Word avec Office Automation sur un serveur de production. Bien que l’article précise que cette utilisation d’Office n’est pas une solution fiable et efficace, il détaille malgré tout comment procéder ! L’arrivée de Word Services au sein de SharePoint 2010 et du format Open XML, et de son SDK associé, devrait mettre ce type de pratique au placard. Microsoft propose enfin une solution côté serveur efficace, performante et sécurisée et allant bien au-delà de ce que propose l’utilisation d’Office client sur un serveur.

Remarque : pour les autres formats Office (Excel, PowerPoint et Visio), il existe d’autres services inclus dans SharePoint Server 2010 ; néanmoins, ces sujets dépassent le cadre de cet article.

Parmi les avantages de cette nouvelle solution, on retrouve les avantages suivants :

· Performance : Word Services a été conçu pour s’exécuter côté serveur : sans interface utilisateur à charger, sans boîte de dialogue bloquant l’exécution du traitement, … pour faire juste ce que le traitement demande et en consommant juste les ressources nécessaires. La gestion des threads et des processeurs multi cœur par le service permet d’exploiter véritablement les capacités de votre serveur pour obtenir une rapidité de loin la plus rapide du marché.

· Fiabilité et scalabilité : Le serveur n’a plus besoin de charger/décharger en mémoire une instance de Word ou d’Excel : limitation des entrées/sorties disque, charge mémoire constante et modèle objet optimisé pour un traitement serveur (le modèle objet n’est pas celui d’Office Automation). Word Services sait traiter des files importantes de documents sans problème de concurrence et de façon totalement centralisée. Enfin, ce service est compatible et respecte à 100% l’application Word client (mise en page, pagination, etc).

· Extensibilité : Word Services possède des APIs propres qui conjointement utilisé avec le SDK Open XML permet de créer des solutions sans limite.

Présentation Word Services

Vous rêvez de pouvoir générer des documents Office en masse, de convertir des documents en PDF ou XPS, de rafraichir les champs d’un document ou de convertir des documents Office en XML, HTML ou au format Open XML et plus encore ? Voici quelques possibilités de Word Services.

Le service Word ne fournit que la partie service des traitements communs décrit précédemment. Pour les traitements de modification, de consommation ou de génération de document à partir d’une logique propre (génération d’un catalogue, ajout d’un filigrane, etc) vous devrez vous orienter vers une autre API : celles du SDK Open XML. Le SDK Open XML offre une API complète pour manipuler des documents Open XML (Word, Excel et PowerPoint 2007 ou 2010), et cela sans nécessiter une quelconque instance d’Office. Conjointement utilisé avec Word Services, vous disposez d’un éventail de solutions conséquentes pour répondre aux problématiques les plus complexes que vous pouvez rencontrer dans les entreprises aujourd’hui.

Dans cet article nous allons nous pencher sur les cas utilisateur les plus courants :

· Conversion d’un document Word en PDF/XPS

· Générer un document Word

· Paginer un document

· Rafraichir les champs d’un document

Configurer son projet Visual Studio 2010

L’utilisation de Word Services dans un projet Visual Studio, dans notre cas la version 2010, nécessite l’ajout de deux assemblys : Microsoft.Office.Word.Server et System.Web.DataVisualization.

Ces DLLs se situent à deux endroits différents sur le disque dur. La première DLL Microsoft.Office.Word.Server se trouve dans le répertoire 14 de SharePoint à l’emplacement suivant : C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI\ Microsoft.Office.Word.Server.dll

image

La seconde DLL se situe à l’emplacement, peu commun, suivant : C:\Windows\assembly\GAC_MSIL\System.Web.DataVisualization\3.5.0.0__31bf3856ad364e35\System.Web.DataVisualization.dll

image

Une fois ajoutées ces deux assemblys, les références de votre projet devrait être proche de la capture d’écran suivante :

image

Les espaces de noms de Word Services

Le service Word possède plusieurs espaces de nom dans son assembly Microsoft.Office.Word.Server :

· Conversions : contient tous les objets nécessaires à la conversion de documents par Word Services.

· Powershell : contient les commandlet Powershell. Au moment de l’écriture de cette article avec la Beta 2, seule une commande est disponible.

· Service : permet de configurer le service Word Services.

Convertir un document Word en PDF, XPS, HTML, etc

Convertir un document est aujourd’hui aussi simple que quelques lignes de .NET grâce à Word Services, et surtout une multitude formats est supportée aussi bien en entrée qu’en sortie.

Les formats supportés en entrée sont les suivants :

  • Word 97-2003 (doc et dot) voire plus ancien
  • Office Open XML 2007-2010 (docx, docm, dotx, dotm)
  • Le RTF (Rich Text Format)
  • HTML et MHTML (page html et ressources regroupées dans un fichier unique)
  • Word 2003/2007/2010 XML

Les formats supportés en sortie de conversion sont les suivants :

  • Word 97-2003 (doc)
  • Office Open XML 2007-2010 (docx, docm)
  • Le RTF (Rich Text Format)
  • MHTML (page html et ressources regroupées dans un fichier unique)
  • Word 2007/2010 XML
  • PDF
  • XPS

L’espace de nom nécessaire pour utiliser les objets liés à la conversion de documents est Microsoft.Office.Word.Server.Conversions. Pour effectuer une ou plusieurs conversions, vous devez soumettre une tâche – un ‘job’ - au service. L’API de Word Services propose la classe ConversionJob. Son utilisation est assez simpliste une fois que vous avez référencé les DLLs nécessaire dans votre projet. Pour convertir un document Word Office open XML 2010, les quelques lignes de code qui suivent sont nécessaires :

ConversionJob job = new ConversionJob("Word Automation Services");

job.Name = "PDF archive generator";

job.UserToken = properties.Web.CurrentUser.UserToken;

job.Settings.UpdateFields = true;

job.Settings.OutputFormat = SaveFormat.PDF;

string itemUrl = properties.Web.Url + "/" + properties.ListItem.Url;

job.AddFile(itemUrl, itemUrl + ".pdf");

job.Start();

Le code ci-dessus effectue le travail de récupération de l’instance du service Word Services, du passage des droits de l’utilisateur (via le UserToken), de spécification du format de sortie et du fichier à convertir. Pour finir, vous devez appeler la méthode Start() d’exécution de la tâche.

Comme alternative, vous pouvez également spécifier un répertoire ou une bibliothèque de documents dans son intégralité en utilisant les méthodes AddFolder() et AddLibrary().

Une fois la tâche de conversion lancée, après appel à la méthode Start(), vous pouvez demander au service l’avancement de la tâche de conversion. Pour cela, vous disposez de la classe ConversionStatus et de ses méthodes GetAllActiveJobs() et GetAllJobs().

Le code suivant permet de récupérer les statuts des tâches de conversion lancées par Word Services dans les dernières vingt-quatre heures :

public string CheckWordServicesJobsStatus()

{

StringBuilder sb = new StringBuilder();

ReadOnlyCollection<ConversionJobInfo> jobsInfo =

ConversionJobStatus.GetAllJobs("Word Automation Services", null);

if (jobsInfo.Count == 0)

return "Aucune tâche de conversion en cours";

foreach (ConversionJobInfo info in jobsInfo)

{

// On ne prend que les conversions des dernières 24 heures

if (info.SubmittedTime.AddDays(1.0).CompareTo(DateTime.Now) < 0)

continue;

ConversionJobStatus jobStatus = new ConversionJobStatus("Word Automation Services", info.JobId, null);

string s = jobStatus.Name + " - (" + jobStatus.Count + " documents) - " +

"Annulé (" + jobStatus.Canceled + ") Echoué (" + jobStatus.Failed + ") En cours (" + jobStatus.InProgress + ") Non démarré (" +

jobStatus.NotStarted + ") Réussi (" + jobStatus.Succeeded + ")<br/>";

sb.Append(s);

}

return sb.ToString();

}

L’affichage du résultat du code précédent dans une Webpart pourrait être le suivant :

image

Vous pouvez annuler une tâche de conversion en faisant appel à la méthode Cancel() de la classe ConversionJob.

Pour aller plus loin

Voilà pour une première partie permettant de démarrer avec Word Services. Combiné au SDK Open XML, la puissance de Word Services devrait vous permettre de satisfaire bon nombre de vos besoins. On pourra seulement regretté le manque de synchronisation ou d’évènement de call back à la fin d’une conversion ou d’un traitement de groupe.

[SharePoint 2010] Bug javascript ‘g_ExpGroupXSLTQueue’ du Service Pack 1 de la version Française

Update : le hotfix est disponible à cette adresse : http://support.microsoft.com/kb/2553117/en-us (merci Gribouillon)

Tout ceux qui ont déployé le SP1 en langue Française (que ce soit pour une migration ou une fresh install) ont peut-être constaté certains problèmes :

- Les regroupements des vues ne fonctionnent plus (la première fois, tout fonctionne, après rafraichissement de la page, les éléments des groupes n’apparaissent plus et il n’est plus possible d’ouvrir/fermer les groupes)

- Problème de lenteur à l’ouverture de la fenêtre ‘Télécharger un document’

- Problème de lenteur général dans l’affichage des listes, voire un freeze/plantage d’IE

Pour les utilisateurs d’Internet Exporer (Firefox ne remontant jamais les problèmes de javascript par défaut), vous devriez avoir un message similaire à “g_ExpGroupXSLTQueue' is undefined”.

Le problème remonté depuis quelques semaines à Microsoft n’a toujours pas, semble t-il, trouvé de correctif officiel (dès que le correctif est publié, je mettrai à jour ce post). Le problème se situe dans les script core.js SP1 des langues non anglaises (Français, Italien, etc) et notamment dans les versions de code (14.0.4762 => 14.0.6009 ; merci David pour cette précision).

En effet, ce bug n’apparait pas dans la version anglaise des scripts. Par conséquent, afin de contourner ces soucis assez critique pour les utilisateurs, voici une méthode :

  1. Installer le pack de langue anglais EN
  2. Extrayez les fichiers init.js et init.debug.js contenus dans le répertoire “14\TEMPLATE\LAYOUTS\1033” et coller les (après avoir sauvergarder les versions localisées que vous allez remplacer) dans le répertoire “14\TEMPLATE\LAYOUTS\<LanguageID” soit pour les Français “14\TEMPLATE\LAYOUTS\1036”.

Après application de ces scripts :

  • Le problème disparait …
  • … mais les libellés des actions des menus contextuels se mettront en anglais. Charge à vous de traduire les quelques libellés qui posent problème avec un bon éditeur de texte ou de JS.

Voilà une méthode de contournement pas trop complexe à mettre en oeuvre, en attendant le correctif officiel …

[SharePoint 2010] Récupérer la date d’un répertoire pour mettre à jour une propriété d’un document

Un petit script prenant le nom d’un répertoire similaire à :

XYZ_110904_ABC

et permettant d’extraire la date (ici “110904”) et de la spécifier comme propriété (ici la propriété “Date de la revue”) sur les documents contenus dans le répertoire parent.

if(-not(Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}))
{
    Write-Host "Chargement de la librairie SharePoint pour PowerShell"
    Add-PSSnapin Microsoft.SharePoint.PowerShell
}

$web = Get-SPWeb http://companyweb
$listRP = $web.Lists["Revue de presse"]

# On récupère uniquement les répertoire contenant 6 chiffres dans leur nom
$listRP.Folders | ? { $_.Name -match "(?<num>\d{6})" } | % {
    $_ -match "(?<num>\d{6})" | out-null ;
   
    Write-Host "Update => " $_.Name
    $year = 0;
    $month = 0;
    $day = 0;
    [System.Int32]::TryParse($matches[0].Substring(0,2), [ref] $year)
    [System.Int32]::TryParse($matches[0].Substring(2,2), [ref] $month)
    [System.Int32]::TryParse($matches[0].Substring(4,2), [ref] $day)
   
    $year = $year+2000 # 11 => 2011
    $revueDate = New-Object System.DateTime($year, $month, $day)
  
    $files = $_.Folder.Files
   foreach ($file in $files)
   {
        Write-host "Traitement du fichier ==> " $file.Name
       
        $file.Item["Date de la revue"] = $revueDate
        $file.Item.Update();
   }
}

Si cela peut vous sauver quelques minutes de votre longue journée !

Plus de Messages Page suivante »


Les 10 derniers blogs postés

- SharePoint 2013: Préparation de la migration - Création des site Templates dans 2010 et 2013 par Blog Technique de Romelard Fabrice le 08-20-2014, 16:31

- [ #Yammer ] How to change interface language ? Comment changer la langue de l’interface ? par Le blog de Patrick [MVP SharePoint] le 08-20-2014, 14:21

- Onedrive Sync Engine Host : CPU à 100% par Le petit blog de Pierre / Pierre's little blog le 08-06-2014, 22:22

- SharePoint : Bug sur la gestion des permissions et la synchronisation Office par Blog Technique de Romelard Fabrice le 07-10-2014, 11:35

- SharePoint 2007 : La gestion des permissions pour les Workflows par Blog Technique de Romelard Fabrice le 07-08-2014, 11:27

- TypeMock: mock everything! par Fathi Bellahcene le 07-07-2014, 17:06

- Coding is like Read par Aurélien GALTIER le 07-01-2014, 15:30

- Mes vidéos autour des nouveautés VS 2013 par Fathi Bellahcene le 06-30-2014, 20:52

- Recherche un passionné .NET par Tkfé le 06-16-2014, 12:22

- [CodePlex] Projet KISS Workflow Foundation lancé par Blog de Jérémy Jeanson le 06-08-2014, 22:25