Supprimer du texte masqué d’un document de traitement de texte
Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office afin de supprimer par programmation du texte masqué d’un document de traitement de texte.
Obtention d’un objet WordprocessingDocument
Pour ouvrir un document existant, instanciez la classe WordprocessingDocument comme illustré dans l’instruction using suivante. Dans la même instruction, ouvrez le fichier de traitement de texte ayant le fileName spécifié à l’aide de la méthode Open, où le paramètre Boolean doit avoir la valeur true pour permettre la modification du document.
using (WordprocessingDocument doc =
WordprocessingDocument.Open(fileName, true))
{
// Insert other code here.
}
L'instruction using fournit une alternative recommandée à la séquence .Create, .Save, .Close habituelle. Elle garantit que la méthode Dispose (méthode interne utilisée par le kit de développement Open XML pour nettoyer les ressources) est automatiquement appelée lorsque l'accolade de fermeture est atteinte. Le bloc qui suit l’instruction using établit une étendue pour l’objet créé ou nommé dans l’instruction using, en l’occurrence la documentation. Étant donné que la classe WordprocessingDocument dans le Kit de développement logiciel (SDK) Open XML enregistre et ferme automatiquement l’objet dans le cadre de son implémentation System.IDisposable , et que Dispose est automatiquement appelé lorsque vous quittez le bloc, vous n’avez pas à appeler explicitement Save and Close, tant que vous utilisez l’utilisation.
Structure d’un document WordProcessingML
La structure de base d’un document WordProcessingML se compose des éléments document et body , suivis d’un ou plusieurs éléments de niveau bloc tels que p, qui représente un paragraphe. Un paragraphe contient un ou plusieurs éléments r. Le r signifie « run » (exécution), qui est une zone de texte avec un ensemble de propriétés courant, comme par exemple la mise en forme. Une exécution contient un ou plusieurs éléments t. L'élément t contient une plage de texte. L’exemple de code suivant montre le balisage WordprocessingML pour un document qui contient le texte « Exemple de texte ».
<w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
À l’aide du Kit de développement logiciel (SDK) Open XML, vous pouvez créer une structure de document et du contenu à l’aide de classes fortement typées qui correspondent à des éléments WordprocessingML . Vous trouverez ces classes dans l'espace de noms DocumentFormat.OpenXml.Wordprocessing . Le tableau suivant répertorie les noms des classes qui correspondent aux éléments document, body, p, r et t.
Élément WordprocessingML | Classe du Kit de développement logiciel (SDK) Open XML | Description |
---|---|---|
document | Document | Élément racine de la partie principale du document. |
body | Body | Conteneur des structures de niveau bloc, telles que paragraphs, tables, annotations et autres structures décrites dans la spécification ISO/IEC 29500. |
p | Paragraph | Paragraphe. |
r | Run | Exécution. |
t | Text | Plage de texte. |
Structure de l’élément vanish
L’élément vanish joue un rôle important lors du masquage du texte dans un fichier Word. La propriété de mise en forme Hidden est une propriété bascule, ce qui signifie que son comportement varie selon qu’elle est utilisée dans une définition de style ou en tant que mise en forme directe. Dans le cadre d’une définition de style, l’affectation d’une valeur à cette propriété entraîne la modification ou non de son état actuel. Si la valeur false (ou un équivalent) est affectée à cette propriété, le paramètre actuel est conservé. Toutefois, dans le cadre d’une mise en forme directe, l’affectation de la valeur true ou false définit l’état absolu de la propriété résultante.
Les informations suivantes de la spécification ISO/IEC 29500 présentent l’élément disparu .
vanish (texte masqué)
Cet élément spécifie si le contenu de cette séquence doit être masqué lors de l’affichage d’un document. [Remarque : le paramétrage doit affecter l’affichage normal du texte, mais une application peut modifier les paramètres en forçant l’affichage du texte masqué. Fin de la remarque]
Cette propriété de mise en forme est une propriété bascule (§17.7.3).
En l’absence de cet élément, la valeur par défaut consiste à laisser la mise en forme appliquée au niveau antérieur de la hiérarchie de styles. Si cet élément n’est jamais appliqué dans la hiérarchie de styles, le texte n’est pas masqué lors de l’affichage du document.
[Exemple : voici une séquence de texte dont la propriété de masquage du texte est activée pour le contenu de la séquence. Cette contrainte est spécifiée à l’aide de la syntaxe WordprocessingML suivante :
<w:rPr>
<w:vanish />
</w:rPr>
Cette séquence déclare que la propriété vanish est définie pour le contenu de la séquence ; par conséquent, le contenu de cette séquence est masqué lors de l’affichage du contenu du document. Fin de l’exemple]
© ISO/IEC29500: 2008.
Le segment de schéma XML suivant définit le contenu de cet élément.
<complexType name="CT_OnOff">
<attribute name="val" type="ST_OnOff"/>
</complexType>
La propriété val dans le code ci-dessus est une valeur binaire qui peut être activée ou désactivée. Si la valeur affectée est on, 1 ou true, la propriété est activée. Si la valeur affectée est off, 0 ou false, la propriété est désactivée.
Exemple de code
L’exemple de code suivant montre comment supprimer tout le texte masqué d’un document. Vous pouvez appeler la méthode WDDeleteHiddenText en utilisant l’appel suivant comme exemple pour supprimer le texte masqué d’un fichier nommé « Word14.docx ».
string docName = @"C:\Users\Public\Documents\Word14.docx";
WDDeleteHiddenText(docName);
Remarque
Cet exemple part du principe que le fichier Word14.docx contient du texte masqué. Pour masquer une partie du texte du fichier, sélectionnez-la, puis cliquez sur Ctrl+D afin d’afficher la boîte de dialogue Police. Activez la case à cocher Masqué, puis cliquez sur OK.
Voici l’exemple de code complet en C# et en Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using System;
using System.IO;
using System.Xml;
WDDeleteHiddenText(args[0]);
static void WDDeleteHiddenText(string docName)
{
// Given a document name, delete all the hidden text.
const string wordmlNamespace = "https://schemas.openxmlformats.org/wordprocessingml/2006/main";
using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(docName, true))
{
// Manage namespaces to perform XPath queries.
NameTable nt = new NameTable();
XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
nsManager.AddNamespace("w", wordmlNamespace);
if (wdDoc.MainDocumentPart is null || wdDoc.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
// Get the document part from the package.
// Load the XML in the document part into an XmlDocument instance.
XmlDocument xdoc = new XmlDocument(nt);
using (Stream stream = wdDoc.MainDocumentPart.GetStream())
{
xdoc.Load(stream);
XmlNodeList? hiddenNodes = xdoc.SelectNodes("//w:vanish", nsManager);
if (hiddenNodes is null)
{
return; // No hidden text.
}
foreach (System.Xml.XmlNode hiddenNode in hiddenNodes)
{
if (hiddenNode.ParentNode is null || hiddenNode.ParentNode.ParentNode is null || hiddenNode.ParentNode.ParentNode.ParentNode is null)
{
continue;
}
XmlNode topNode = hiddenNode.ParentNode.ParentNode;
XmlNode topParentNode = topNode.ParentNode;
topParentNode.RemoveChild(topNode);
if (topParentNode.ParentNode is null)
{
continue;
}
if (!topParentNode.HasChildNodes)
{
topParentNode.ParentNode.RemoveChild(topParentNode);
}
}
}
using (Stream stream2 = wdDoc.MainDocumentPart.GetStream(FileMode.Create, FileAccess.Write))
{
// Save the document XML back to its document part.
xdoc.Save(stream2);
}
}
}