Sharepoint : Création d'un filigrane personnalisé
Par
Ludovic Lefort (Site web) (Blog)
Comment créer un filigrane automatique lors de la création d'un document Word dans Sharepoint 2007 (uniquement MOSS 2007).
0. Introduction
1. Contenu de la solution
2. Création de la solution
2.1. L'event handler
2.2. La policy
3. Déploiement
4. Activation de la policy
5. Référence
6. Liens
7. Sources du projet
0. Introduction
Pour commencer : qu'est ce qu'un filigrane (ou Watermark en anglais) ?
Il s'agit d'un texte ou d'une image présente dans le fond de votre document Word pour signaler par
exemple qu'un document est confidentiel.
Dans notre exemple nous allons créer un filigrane contenant la mention DVP et la date de création
du fichier :
Cette fonctionnalité sera activée via une policy définie sur la document library.
1. Contenu de la solution
le déploiement de ce projet contiendra trois fichiers :
-
Une dll contenant la policy
-
Une dll pour l'event handler déclenchée lors de l'ajout d'un element dans la document library
-
Un fichier XML contenant la description de la policy
2. Création de la solution
2.1. L'event handler
Pour débuter créez un nouveau projet de type class library et nommez le CustomPolicyEventHandler
il contiendra le code à exécuter lors de l'ajout d'un élement dans la liste.
Ce projet contiendra deux classes.
La première classe contient le code nécessaire pour ajouter le filigrane dans un document word, nous
l'appellerons helper (vous trouverez ce fichier dans les sources de cet article) :
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using System.Reflection;
using System.Xml;
using System.IO;
using System;
using System.IO.Packaging;
namespace InsideMOSS.Samples
{
public static class Helper
{
public static string SaveToTemp(SPFile doc)
{
if (!Directory.Exists(@"C:\temp"))
Directory.CreateDirectory(@"c:\temp");
Random rnd = new Random();
String random = rnd.Next().ToString();
String fileName = @"c:\temp\" + random + ".docx";
FileStream file = new FileStream(fileName, FileMode.Create);
byte[] buffer = doc.OpenBinary();
file.Write(buffer, 0, (int)doc.TotalLength);
file.Flush();
file.Close();
return fileName;
}
public static void GetFromTemp(string filename, SPFile doc)
{
FileStream file = File.OpenRead(filename);
doc.SaveBinary(file, false);
file.Close();
}
internal static void RemoveFromTemp(string filename)
{
if (File.Exists(filename))
File.Delete(filename);
}
public static void AddWaterMark(string doc, string watermark)
{
string NS_WORDML = "http://schemas.openxmlformats.org/wordprocessingml/2006/3/main";
string NS_REL = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
|
N'oubliez pas d'ajouter ces références à votre projet :
-
Microsoft.Sharepoint
-
Microsoft.Office.Policy
-
WindowsBase
Créons à présent une deuxième classe contenant le code de l'event handler. Je l'ai appelée DatePolicyEventHandler
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using Microsoft.SharePoint;
using Microsoft.Office.RecordsManagement.InformationPolicy;
using InsideMOSS.Samples;
namespace CustomPolicyEventHandler
{
public class DatePolicyEventHandler: SPItemEventReceiver
{
public override void ItemAdded(SPItemEventProperties properties)
{
Policy policy = Policy.GetPolicy(properties.ListItem.ContentType);
PolicyItem policyItem = policy.Items[CustomWatermark.DatePolicy.PolicyID];
string tempfile = Helper.SaveToTemp(properties.ListItem.File);
Helper.AddWaterMark(tempfile, policyItem.CustomData);
Helper.GetFromTemp(tempfile, properties.ListItem.File);
Helper.RemoveFromTemp(tempfile);
base.ItemAdded(properties);
}
}
}
|
Cette classe hérite de SPItemEventReceiver et override la méthode ItemAdded. Cela
signifie que le code sera exécuté à chaque fois qu'un élément est ajouté à notre liste.
L'argument properties contient entre autres le fichier ajouté à notre document library.
Cette méthode récupère le fichier et lui ajoute le watermark.
Autre étape importante : signez votre assembly afin de pouvoir la déployer dans la GAC.
-
Clic droit sur le projet
-
properties
-
Signing
-
Choisir new dans la liste déroulante
-
Entrez le nom CustomPolicyEventHandler.snk
-
décochez Protect my key with a password et cliquez sur OK
2.2. La policy
Nouvelle étape : Créez un nouveau projet de type class library (CustomWatermark) et ajoutez le
en référence au projet précédent.
Ce projet va s'occuper d'exécuter du code lors de l'activation/désactivation de la policy. Il va
aussi contenir un fichier XML décrivant la policy.
Première étape : ajoutez la classe DatePolicy dont voici le code :
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.RecordsManagement.Internal;
using Microsoft.Office.RecordsManagement.InformationPolicy;
using Microsoft.SharePoint;
namespace CustomWatermark
{
public class DatePolicy : IPolicyFeature
{
public static string PolicyID = "Developpez.Policy.DateWatermark";
#region IPolicyFeature Members
public void OnCustomDataChange(PolicyItem policyItem, SPContentType ct)
{
}
public void OnGlobalCustomDataChange(PolicyFeature feature)
{
}
public bool ProcessListItem(SPSite site, PolicyItem policyItem, SPListItem listItem)
{
return true;
}
public bool ProcessListItemOnRemove(SPSite site, SPListItem listItem)
{
return true;
}
public void Register(SPContentType ct)
{
try
{
SPEventReceiverDefinition evdef = ct.ParentList.EventReceivers.Add();
evdef.Assembly = "CustomPolicyEventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0a5599bf8a9da1a4";
evdef.Class = "CustomPolicyEventHandler.DatePolicyEventHandler";
evdef.Name = "Date Watermark";
evdef.Data = "DVP";
evdef.Type = SPEventReceiverType.ItemAdded;
evdef.SequenceNumber = 1001;
evdef.Update();
}
catch (Exception ex)
{
throw new Exception("Impossible d'enregistrer cet event handler", ex);
}
}
public void UnRegister(SPContentType ct)
{
if (ct != null)
{
foreach (SPEventReceiverDefinition evdef in ct.ParentList.EventReceivers)
{
if (evdef.Name == "Date Watermark")
evdef.Delete();
}
}
}
#endregion
}
}
|
Note classe implémente l'interface IPolicyFeature, cela implique que nous devons implémenter certaines
méthodes :
|
Méthode
|
Description
|
|
OnCustomDataChange()
|
Il est possible de développer des contrôles permettant aux administrateurs de modifier certain paramètres
de la policy. Cette métode permet de les sauver.
|
|
OnGlobalCustomDataChange()
|
Idem que la précédente mais au niveau de la ferme ou des Global Settings.
|
|
ProcessListItem()
|
Utile si vous avez déjà des élements de votre document library et que vous souhaiter leurs appliquer
la nouvelle policy.
|
|
ProcessListItemOnRemove()
|
Idem que la précédente mais lors de la désactivation de la policy.
|
|
Regsiter()
|
Ce code est appelé lorsqu'un administrateur assigne la policy à une liste
|
|
UnRegister()
|
Permet d'éxécuter du code lors de la désactivation d'une policy.
|
Dans notre cas seules deux méthodes nous intéressent : Register et Unregister
public void Register(SPContentType ct)
{
try
{
SPEventReceiverDefinition evdef = ct.ParentList.EventReceivers.Add();
evdef.Assembly = "CustomPolicyEventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0a5599bf8a9da1a4";
evdef.Class = "CustomPolicyEventHandler.DatePolicyEventHandler";
evdef.Name = "Date Watermark";
evdef.Data = "DVP - " + DateTime.Now.ToString("dd/MM/yyyy");
evdef.Type = SPEventReceiverType.ItemAdded;
evdef.SequenceNumber = 1001;
evdef.Update();
}
catch (Exception ex)
{
throw new Exception("Impossible d'enregistrer cet event handler", ex);
}
}
|
Lors de l'activation de la policy nous devons ajouter un nouvel event handler à notre document library
(celui créé dans le projet précédent).
Pour récupérer le strong name de votre dll je vous conseille d'utiliser
.net
reflector
Voyons maintenant la méthode
Unregister
public void UnRegister(SPContentType ct)
{
if (ct != null)
{
foreach (SPEventReceiverDefinition evdef in ct.ParentList.EventReceivers)
{
if (evdef.Name == "Date Watermark")
evdef.Delete();
}
}
}
|
Rien de bien compliqué : cette méthode supprime les event handler ajoutés à notre document library. Elle
est déclenchée par la désactivation de la policy.
Il nous reste alors à créer notre manifest XML décrivant la policy et permettant son installation :
Date Watermark Policy
Policy qui ajoute un filigrane contenant la date de création du fichier
Developpez
CustomWatermark, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f4dfb7b463ebd890
CustomWatermark.DatePolicy
|
N'oubliez pas de signer ce projet également et compilez le tout.
3. Déploiement
Le déploiement de la policy est relativement simple, la première étape consiste à installer les deux dll dans la GAC.
Pour cela drag/dropper les deux fichiers dans le répertoire
c:\windows\assembly de votre serveur.
Il nous reste à présent à installer la policy sur le serveur. Pour cela j'utilise le programme
Policy Explorer téléchargeable
ici.
Exécutez le programme sur votre serveur, cliquez sur le bouton
Add Custom Policy et choisissez votre fichier
manifest.xml.
Voila votre policy est installée.
4. Activation de la policy
Allez maintenant dans votre site Sharepoint et créez une nouvelle document library. Ouvez ensuite les document list settings.
Dans la rubrique Permissions and Management cliquez sur Information management policy Settings
Sélectionnez le deuxième élément de la liste Define a policy... et cliquez sur OK
Votre policy apparait dans la liste, cochez la et cliquez sur OK
Voila vous pouvez à présent créer un nouveau document dans votre liste et le sauver. Le filigrane sera ajouté automatiquement.
5. Référence
Livre : Inside Microsoft Office Sharepoint Server 2007 de Patrick Tisseghem.
6. Liens
7. Sources du projet
Cliquez
ici pour télécharger les sources de ce projet.
Je tiens à remercier
RomainVALERI pour la correction orthographique de cet article.


Les sources présentées sur cette page sont libres de droits,
et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©
2008 Ludovic LEFORT. Aucune reproduction,
même partielle, ne peut être faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.