Mettre à jour le type de contenu des documents d’une bibliothèque SharePoint 2010 avec PowerShell

Beaucoup de travail, beaucoup de nouvelles astuces à partager mais pas beaucoup de temps pour le faire, voici ce qui devrait changer dans les prochaines semaines.

Pour la reprise, voici quelques scripts PowerShell qui pourrait vous épargner quelques minutes d’écriture. Le premier très simple (je n’ai pas le niveau de notre SPAdmin préfére Fabrice69), pour changer le type de contenu de documents contenus dans un répertoire récemment migré :

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
# La liste contenant les documents à mettre à jour
$listRP = $web.Lists[« Revue de presse »]

# On prend que certains répertoires (ici ceux contenant le nom de notre journal local)
$folders = $listRP.Folders | where { $_.Name -like « *LNC* » }
foreach ($folder in $folders)
{
   Write-Host « Mise à jour répertoire =>  » $folder.Name
   $files = $folder.Folder.Files
   foreach ($file in $files)
   {
        Write-host « Traitement du fichier ==> » $file.Name
        if ($file.Level -eq [Microsoft.SharePoint.SPFileLevel]::Checkout)
        {
            $file.CheckIn(« Archiver par le système »)
        }
        # Créez le type de contenu dans les types de contenu de site
        $file.Item[« ID du type de contenu »] = $web.ContentTypes[« Revue de Presse »].Id;
        # Champ de type choix

        $file.Item[« Nom du média »] = « LNC »;
        $file.Item.Update();
   }
}

Happy PS ! (Dédicace à mon coéquipier de terrain David)

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 etSystem.Web.DataVisualization.

Ces DLLs se situent à deux endroits différents sur le disque dur. La première DLLMicrosoft.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_47FBCB1E

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_thumb_14EBEF1D

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

image_thumb_62E428C5

Les espaces de noms de Word Services

Le service Word possède plusieurs espaces de nom dans son assemblyMicrosoft.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éthodeStart() 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() etAddLibrary().

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_thumb_1AA6471C

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.

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_thumb_774025ED

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

image_thumb_44CC2CA1

Bonne lecture