Laurent Kempé
Rédaction, Publication et Présentation de contenu crée en XML à l'aide de Word 2003, Partie 3
Présentation du système de publication de contenu mis en place sur notre site Tech Head Brothers utilisant les technologies XML de Word 2003 ainsi que
Par Laurent Kempé publié le 20/04/2004 à 18:01, lu 11012 fois, 1 pages
Introduction
Nous avons installer dans la partie précédente de l'article les outils nécessaire à la création d'un nouveau type de projet sous Visual Studio .NET 2003. Ce type de projet nous permet de créer un document Word 2003 et du code .NET permettant de réagir par exemple aux événements qui surviennent dans le document : Ouverture du document, Fermeture du document...
Dans cet article nous allons voir comment faire évoluer le squelette crée par le modèle de projet afin d'y ajouter des fonctionnalités, comme la possibilité de sauvegarder automatiquement le document en XML sans passer par le dialogue de Word 2003 et toutes ses cases à cocher.
Evénements, Délégués
Nous voulons donc pouvoir sauver notre document sous forme d'un fichier XML en même temps qu'une sauvegarde normale au format Word. Pour cela nous devons déterminer quel événement nous devons utiliser afin de pouvoir être informé au moment ou l'utilisateur demandera à Word 2003 de sauvegarder son document. Pour cela nous ouvrons l'explorateur d'objet de Visual Studio .NET 2003 afin de chercher un délégué correspondant à la sauvegarde du document. Naviguez jusqu'à l'espace de noms :



Puis jusqu'aux délégués:





Maintenant que nous avons trouvé le délégué qui nous intéresse il nous suffit de l'ajouter dans le modèle crée afin que notre code soit appelé juste avant que Word 2003 affiche le dialogue de sauvegarde. Pour cela ouvrez le modèle et plus particulièrement le fichier ThisDocument.cs.Nous ajoutons une variable privée au projet :
private Word.DocumentEvents2_OpenEventHandler openEvent;
private Word.DocumentEvents2_CloseEventHandler closeEvent;
private Word.ApplicationEvents4_DocumentBeforeSaveEventHandler beforesaveEvent;
Puis il faut créer une méthode qui sera appelée lorsque cet événement sera levé :
/// <summary>
/// Called before the user see any dialog in the save process
/// </summary>
protected void ThisDocument_BeforeSave(Word.Document document, ref bool b, ref bool q)
{
    DialogResult result = MessageBox.Show("Do you want to save as XML also?","Tech Head Brothers - Article", MessageBoxButtons.YesNo);

    if ( result == DialogResult.Yes)
    {
        SaveTransformedXml(document);

	...

    }
    else
    {
        result = MessageBox.Show("Do you want to pack all the files in a zip to publish ?","Tech Head Brothers - Article", MessageBoxButtons.YesNo);

        if ( result == DialogResult.Yes)
        {
            SaveTransformedXml(document);

            ...
        }
    }
}
Cette méthode ouvre un dialogue demandant à l'utilisateur si il veut aussi sauver son document sous forme XML. Si la réponse est positive alors l'application appel une méthode que nous verrons un peu plus loin.

Il nous manque encore la méthode nous permettant d'attacher notre méthode à la gestion des événements de Word 2003. La meilleur place pour faire cela est la méthode
_Startup. Cette méthode est générée par le modèle et ce trouve dans la région « Generated initialization code ».
/// <summary>
/// Required procedure. Do not modify.
/// </summary>
/// <param name="application">Application object.</param>
/// <param name="document">Document object.</param>
public void _Startup(object application, object document)
{
    this.thisApplication = application as Word.Application;
    this.thisDocument = document as Word.Document;
Nous ajoutons donc le délégué sur notre méthode « ThisDocument_BeforeSave » :
beforesaveEvent = new Word.ApplicationEvents4_DocumentBeforeSaveEventHandler(ThisDocument_BeforeSave);
thisApplication.DocumentBeforeSave += beforesaveEvent;
Comme nous travaillons sur un document nous en profitons pour ajouter une ligne de code qui nous permet d'ouvrir automatiquement le TaskPane « XML Structure ». Ce qui plus qu'utile lors de la rédaction de document XML.
thisApplication.TaskPanes[Word.WdTaskPanes.wdTaskPaneXMLStructure].Visible = true;
La dernière chose à voir c'est la méthode nous permettant de sauver le document en XML. Pour cela nous récupérons le contenu du document Word 2003 sous forme de XML, puis le nom du fichier Word 2003 auquel nous substitutions l'extension « .doc » par l'extension « .xml ». Et nous utilisons enfin un flux pour sauver le xml sous forme d'un fichier.
void SaveTransformedXml(Word.Document document)
{
    string xmlContents = document.XMLNodes[1].get_XML(true);
    string path = document.Path + @"\" + document.Name.Replace(".doc", ".xml");
    System.IO.StreamWriter writer = new System.IO.StreamWriter(path, false, System.Text.Encoding.UTF8);
    writer.Write(xmlContents);
    writer.Close();
}
Si vous voulez appliquer une transformation XSLT au document c'est le bon emplacement pour lancer ce traitement. Dans notre solution de publication nous avons ajouté une méthode nous permettant de référencer des fichiers sources pour différent langages ou syntaxe (C#, VB.NET, C++, XML ...) ainsi que des images. Le rédacteur dans son article référence un fichier externe qui est lu lors de la sauvegarde, et par exemple dans le cas de source, est mis en forme : formatage, colorisation... Dans le cas d'une image le vrai tag XML est construit dynamiquement. Une prochaine version permettra de déterminer automatiquement si le l'image est trop grande et alors on créera une vignette cliquable par exemple.

Conclusion
Ce qui est à retenir de cette partie c'est que Word 2003 nous offre plein de possibilité pour attacher notre code afin de rajouter du traitement au document. Nous avons vu un exemple, mais les possibilités sont sans limite. Que pensez-vous d'une solution ou le rédacteur lors de la sauvegarde de son document poste son article directement sur le site à l'aide d'un Web Service. Sympa non.

Dans la prochaine partie nous allons voir comment il est possible de faire une transformation XSLT du document et une prévisualisation de rendu comme elle serait faite sur le site, mais en déconnecté.
 
» Démarrer une discussion