begin process at 2012 02 11 13:04:56
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > MARQUER UN DOCUMENT OPENXML EN TANT QUE FINAL

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/bb30 8936.aspx


 Sources du même auteur

Source .NET (Dotnet) ENTITY FRAMEWORK - AVOIR UN INCLUDE TYPÉ
Source .NET (Dotnet) WEBTESTPLUGIN - IGNORER DES URLS LORS D'UN TEST WEB VISUAL S...
Source avec Zip Source .NET (Dotnet) MECANISME DE SYNCHRONISATION DE THREAD - MONITOR, MUTEX, SEM...
Source avec Zip Source avec une capture Source .NET (Dotnet) GESTION DES IMPRIMANTES - ADDIN POUR WHS
Source .NET (Dotnet) CALCUL DES NOMBRES PREMIERS PAR LA CRIBLE D'ÉRATOSTHÈNE

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) EXPLORATEUR DE DOSSIERS ET FICHIERS par Yanith
Source avec Zip Source avec une capture Source .NET (Dotnet) ZIP-UNZIP AVEC SHARPZIPLIB par buno
Source avec Zip Source .NET (Dotnet) SUPER COPIER par casseur
Source .NET (Dotnet) SERIALIZATION/DESERIALIZATION COMPLÈTE DE CLASSES par DedeSurf
Source avec Zip CONVERSION DE FICHIERS FORTRAN 77 EN FORTRAN 95 par deadhand

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) [.NET 3.0] OPENXML MANAGER - CHARGEMENT ET EDITION/SAUVEGAR... par romagny13

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 < Convertion RTF en OpenXML [ par lbensch ] Bonjour, Je souhiaterais convertir un text RTF en OpenXML via codage c#. J'ai chercher un peu dans les fonctions fournies dans DocumentFormat.Open Utilisateur pour l'exécution de package SSIS depuis C# [ par krimog ] Bonjour à tous.Objectif :A partir du code behind d'un site ASP.net (je pense que le problème serait le même avec une application classique, c'est pour


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,217 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales