Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

MARQUER UN DOCUMENT OPENXML EN TANT QUE FINAL


Information sur la source



Description

Word 2007 utilise le format de fichier OpenXML que l'on peut manipuler très facilement avec .net 3 via le namespace System.IO.Packaging. Via l'interface de Word 2007 on peut marquer le document en tant que finale (mark as final) ainsi le document n'est plus modifiable via Word 2007, il est en lecture seule.

Ce code permet de reproduire la fonction "Mark As Final" de Word. Pour cela il faut modifier la propriété "_MarkAsFinal" des "Custom Properties" d'un document OpenXML.
 

Source

  • using System;
  • using System.Collections.Generic;
  • using System.Text;
  • using System.IO.Packaging;
  • using System.IO;
  • using System.Xml;
  • using System.Diagnostics;
  • namespace CS.Utilities
  • {
  • public static class OpenXMLHelper
  • {
  • public static void MarkAsFinal(String docxPath)
  • {
  • MarkAsFinal(docxPath, true);
  • }
  • public static void MarkAsFinal(String docxPath, Boolean markAsFinal)
  • {
  • const String K_customPropertiesContentType = "application/vnd.openxmlformats-officedocument.custom-properties+xml";
  • const String K_customPropertiesRelationType = @"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties";
  • // chargement du package
  • Package package = Package.Open(docxPath);
  • // on positionne une propriété du package mais cela ne suffit pas pour que le document soit marqué comme "Final"
  • if (markAsFinal)
  • package.PackageProperties.ContentStatus = "Final";
  • else if (package.PackageProperties.ContentStatus == "Final")
  • package.PackageProperties.ContentStatus = String.Empty;
  • // On va éditer les Custom Properties du document
  • // Récuperation de l'uri de la partie
  • Uri uri = new Uri(@"/docProps/custom.xml", UriKind.Relative);
  • // obtention ou création de la partie (les custom properties)
  • PackagePart part;
  • if (package.PartExists(uri))
  • {
  • part = package.GetPart(uri);
  • }
  • else
  • {
  • part = package.CreatePart(uri, K_customPropertiesContentType);
  • XmlDocument basicDoc = new XmlDocument();
  • basicDoc.LoadXml(@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
  • <Properties xmlns=""http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"" xmlns:vt=""http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"">
  • </Properties>");
  • StreamWriter sw = new StreamWriter(part.GetStream(FileMode.Create, FileAccess.ReadWrite));
  • basicDoc.Save(sw);
  • sw.Close();
  • sw.Dispose();
  • }
  • // modification de la partie
  • XmlDocument doc = new XmlDocument();
  • doc.Load(part.GetStream());
  • XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
  • nsmgr.AddNamespace("vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes");
  • nsmgr.AddNamespace("def", "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties");
  • // on modifie notre document XML pour qu'il ait ces tags
  • //<property fmtid=""{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"" pid=""2"" name=""_MarkAsFinal"">
  • // <vt:bool>true</vt:bool>
  • //</property>
  • XmlNode node = doc.SelectSingleNode(@"/def:Properties/def:property[@name=""_MarkAsFinal""]/vt:bool", nsmgr);
  • if (node != null)
  • {
  • node.InnerText = markAsFinal ? "true" : "false";
  • }
  • else
  • {
  • node = doc.SelectSingleNode(@"/def:Properties/def:property[@name=""_MarkAsFinal""]", nsmgr);
  • if (node != null)
  • {
  • XmlNode valueNode = doc.CreateElement("vt:bool", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes");
  • valueNode.InnerText = markAsFinal ? "true" : "false";
  • node.AppendChild(valueNode);
  • }
  • else
  • {
  • XmlNode markAsFinalNode = doc.CreateElement("property", "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties");
  • XmlAttribute fmtIDAttribute = doc.CreateAttribute("fmtid");
  • fmtIDAttribute.Value = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}";
  • markAsFinalNode.Attributes.Append(fmtIDAttribute);
  • // le pid minimum est 2, on regarde le maximum et on lui rajoute 1
  • XmlNodeList pidNodes = doc.SelectNodes(@"/def:Properties/def:property/@pid", nsmgr);
  • int pid = 1;
  • foreach (XmlNode pidNode in pidNodes)
  • {
  • if (int.Parse(pidNode.Value) > pid)
  • pid = int.Parse(pidNode.Value);
  • }
  • pid += 1;
  • XmlAttribute pidAttribute = doc.CreateAttribute("pid");
  • pidAttribute.Value = pid.ToString();
  • markAsFinalNode.Attributes.Append(pidAttribute);
  • XmlAttribute nameAttribute = doc.CreateAttribute("name");
  • nameAttribute.Value = "_MarkAsFinal";
  • markAsFinalNode.Attributes.Append(nameAttribute);
  • XmlNode valueNode = doc.CreateElement("vt:bool", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes");
  • valueNode.InnerText = markAsFinal ? "true" : "false";
  • markAsFinalNode.AppendChild(valueNode);
  • doc.DocumentElement.AppendChild(markAsFinalNode);
  • }
  • package.CreateRelationship(uri, TargetMode.Internal, K_customPropertiesRelationType);
  • }
  • // enregistrement du document
  • doc.Save(part.GetStream());
  • package.Flush();
  • package.Close();
  • }
  • }
  • }
using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Packaging;
using System.IO;
using System.Xml;
using System.Diagnostics;

namespace CS.Utilities 
{
    public static class OpenXMLHelper
    {

        public static void MarkAsFinal(String docxPath)
        {
            MarkAsFinal(docxPath, true);
        }

        public static void MarkAsFinal(String docxPath, Boolean markAsFinal)
        {

            const String K_customPropertiesContentType = "application/vnd.openxmlformats-officedocument.custom-properties+xml";
            const String K_customPropertiesRelationType = @"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties";


            // chargement du package
            Package package = Package.Open(docxPath);

            // on positionne une propriété du package mais cela ne suffit pas pour que le document soit marqué comme "Final"
            if (markAsFinal)
                package.PackageProperties.ContentStatus = "Final";
            else if (package.PackageProperties.ContentStatus == "Final")
                package.PackageProperties.ContentStatus = String.Empty;

            // On va éditer les Custom Properties du document

            // Récuperation de l'uri de la partie
            Uri uri = new Uri(@"/docProps/custom.xml", UriKind.Relative);


            // obtention ou création de la partie (les custom properties) 
            PackagePart part;
            if (package.PartExists(uri))
            {
                part = package.GetPart(uri);
            }
            else
            {
                part = package.CreatePart(uri, K_customPropertiesContentType);
                XmlDocument basicDoc = new XmlDocument();
                basicDoc.LoadXml(@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
                                <Properties xmlns=""http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"" xmlns:vt=""http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"">
                                </Properties>");
                StreamWriter sw = new StreamWriter(part.GetStream(FileMode.Create, FileAccess.ReadWrite));
                basicDoc.Save(sw);
                sw.Close();
                sw.Dispose();
            }

            // modification de la partie 
            XmlDocument doc = new XmlDocument();
            doc.Load(part.GetStream());

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
            nsmgr.AddNamespace("vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes");
            nsmgr.AddNamespace("def", "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties");


            // on modifie notre document XML pour qu'il ait ces tags 
            //<property fmtid=""{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"" pid=""2"" name=""_MarkAsFinal"">
            //    <vt:bool>true</vt:bool>
            //</property>

            XmlNode node = doc.SelectSingleNode(@"/def:Properties/def:property[@name=""_MarkAsFinal""]/vt:bool", nsmgr);
            if (node != null)
            {
                node.InnerText = markAsFinal ? "true" : "false";
            }
            else
            {
                node = doc.SelectSingleNode(@"/def:Properties/def:property[@name=""_MarkAsFinal""]", nsmgr);
                if (node != null)
                {
                    XmlNode valueNode = doc.CreateElement("vt:bool", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes");
                    valueNode.InnerText = markAsFinal ? "true" : "false";
                    node.AppendChild(valueNode);
                }
                else
                {
                    XmlNode markAsFinalNode = doc.CreateElement("property", "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties");

                    XmlAttribute fmtIDAttribute = doc.CreateAttribute("fmtid");
                    fmtIDAttribute.Value = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}";
                    markAsFinalNode.Attributes.Append(fmtIDAttribute);

                    // le pid minimum est 2, on regarde le maximum et on lui rajoute 1 
                    XmlNodeList pidNodes = doc.SelectNodes(@"/def:Properties/def:property/@pid", nsmgr);
                    int pid = 1;
                    foreach (XmlNode pidNode in pidNodes)
                    {
                        if (int.Parse(pidNode.Value) > pid)
                            pid = int.Parse(pidNode.Value);
                    }

                    pid += 1;

                    XmlAttribute pidAttribute = doc.CreateAttribute("pid");
                    pidAttribute.Value = pid.ToString();
                    markAsFinalNode.Attributes.Append(pidAttribute);

                    XmlAttribute nameAttribute = doc.CreateAttribute("name");
                    nameAttribute.Value = "_MarkAsFinal";
                    markAsFinalNode.Attributes.Append(nameAttribute);

                    XmlNode valueNode = doc.CreateElement("vt:bool", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes");
                    valueNode.InnerText = markAsFinal ? "true" : "false";
                    markAsFinalNode.AppendChild(valueNode);

                    doc.DocumentElement.AppendChild(markAsFinalNode);
                }

                package.CreateRelationship(uri, TargetMode.Internal, K_customPropertiesRelationType);
            }

            // enregistrement du document 
            doc.Save(part.GetStream());

            package.Flush();
            package.Close();
        }
   }
}

Conclusion

Cet article explique comment modifier les custom properties d'un document OpenXML via le code et via l'interface Word 2007
http://msdn2.microsoft.com/en-us/library/bb308936.aspx
 

Commentaires et avis

Aucun commentaire pour le moment.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

package install [ par Miltiades ] Je cherche de la doc sur comment créer des packages MSI personnalisé (installation à choix multiple ) avec visual studio .NET... Connection R-Database [ par sab741 ] Bonjour,J'utilise le logiciel R, logiciel de statistique et j'essaye de me connecter &#224; une base de donn&#233;es, mais sans r&#233;ussite. J'utili tableau et redondance [ par locus ] bonjourj'essaye d'implanter dans une fonction, un code permettant de v&#233;rifier qu'une entr&#233;e texte dans un textbox ne soit pas d&#233;j&#224; Exécuter une procédure qui renvoie un Curseur en sortie dans C# [ par siadlamri ] bonjour tout le monde; mon probl&#232;me est le suivant : j'ai cr&#233;e une proc&#233;dure stok&#233;e en ORACLE qui prends en entr&#233;e deux param [OpenXml] - les deux points dans les balises [ par romagny13 ] Bonjour,voila j'ai un problême lorsuqe je génére le fichier document.xml (OpenXml)les balises sont de la forme &lt;w:p&gt; ou &lt;w:r&gt; par exemple icone package installation [ par babe59 ] Bonjour,comment puis je modifier l'icone de mon application visible dans le panneau "Ajout / suppression de programmes" ?Je suis sous VS2005, j'ai déf Lire et modifier un document Word OpenXML en C# [ par sghchafaa ] Bonjour;voici un article tés precieux pour ceux qui cherche a traiter la manipulation des documents office avec C# <a target="_top" title="Lire et mod package base de donnée [ par hicham_899 ] Salutj'ai réalisé une application café avec C#.net pour installer sur un appareil tactile mais le problème c'est  comment faire une application .Exe <


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,468 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.