|
Trouver une ressource
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
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
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 à une base de données, mais sans réussite. J'utili
tableau et redondance [ par locus ]
bonjourj'essaye d'implanter dans une fonction, un code permettant de vérifier qu'une entrée texte dans un textbox ne soit pas déjà
Exécuter une procédure qui renvoie un Curseur en sortie dans C# [ par siadlamri ]
bonjour tout le monde; mon problème est le suivant : j'ai crée une procédure stokée en ORACLE qui prends en entré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 <w:p> ou <w:r> 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
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|