Freigeben über


Entfernen von ausgeblendetem Text aus einem Textverarbeitungsdokument

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um ausgeblendeten Text programmgesteuert aus einem Textverarbeitungsdokument zu entfernen.


Abrufen eines WordprocessingDocument-Objekts

Instanziieren Sie zum Öffnen eines vorhandenen Dokuments die WordprocessingDocument-Klasse wie in der folgenden using-Anweisung gezeigt. Öffnen Sie in derselben Anweisung die Textverarbeitungsdatei mit dem angegebenen fileName-Wert, indem Sie die Open-Methode verwenden, wobei der boolesche Parameter auf true festgelegt ist, um die Bearbeitung des Dokuments zu ermöglichen.

    using (WordprocessingDocument doc = 
        WordprocessingDocument.Open(fileName, true))
    {
       // Insert other code here. 
    }

Die using-Anweisung stellt eine empfohlene Alternative zu der üblichen Sequenz „.Create, .Save, .Close“ dar. Mit dieser wird sichergestellt, dass die Dispose-Methode (interne vom Open XML SDK zum Bereinigen von Ressourcen verwendete Methode) automatisch aufgerufen wird, wenn die schließende Klammer erreicht ist. Der Block, der auf die using-Anweisung folgt, erstellt einen Bereich für das Objekt, das in der using-Anweisung erstellt oder benannt wird, in diesem Fall „doc“. Da die WordprocessingDocument-Klasse des Open XML SDK automatisch das Objekt als Teil der System.IDisposable-Implementierung speichert und schließt, und da Dispose automatisch beim Beenden des Blocks aufruft, müssen Sie nicht explizit Speichern und Schließen aufrufen, solange Sie using verwenden.


Struktur eines WordProcessingML-Dokuments

Die grundlegende Struktur eines WordProcessingML-Dokuments besteht aus den document- und body-Elementen, gefolgt von einem oder mehreren Block-Level-Elementen wie p, das für einen Absatz steht. Ein Absatz enthält ein oder mehrere r-Elemente. r steht für ausführen und meint einen Textbereich mit gemeinsamen Eigenschaften wie Formatierung. Eine Ausführung besteht aus einem oder mehreren t-Elementen. Das t-Element enthält einen Textbereich. Das folgende Codebeispiel zeigt das WordprocessingML-Markup für ein Dokument, das den Text "Beispieltext" enthält.

    <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>

Mit dem Open XML SDK können Sie Dokumentstrukturen und -inhalte mit stark typisierten Klassen erstellen, die WordprocessingML-Elementen entsprechen. Diese Klassen sind im DocumentFormat.OpenXml.Wordprocessing -Namespace enthalten. Die folgende Tabelle enthält die Namen der Klassen, die den Elementen document, body, p, r und t entsprechen.

WordprocessingML-Element Open XML SDK-Klasse Beschreibung
document Document Das Stammelement des Hauptdokumentteils.
Text Body Der Container für die Strukturen auf Blockebene, z. B. Absätze, Tabellen, Anmerkungen und andere, die in der Spezifikation ISO/IEC 29500 angegeben sind.
p Paragraph Ein Absatz.
r Run Ein Lauf.
t Text Ein Textbereich.

Struktur des vanish-Elements

Das vanish-Element spielt eine wichtige Rolle beim Ausblenden von Text in einer Word-Datei. Die Hidden-Formatierungseigenschaft ist eine Umschalteigenschaft, d. h., dass ihr Verhalten anders ist, wenn sie als Formatdefinition oder als direkte Formatierung verwendet wird. Wenn sie als Teil einer Formatdefinition verwendet wird, wird durch Festlegen dieser Eigenschaft der aktuelle Status umgeschaltet. Das Festlegen auf false (oder einen entsprechenden Wert) führt dazu, dass die aktuelle Einstellung unverändert bleibt. Wenn die Eigenschaft jedoch als direkte Formatierung verwendet wird, wird durch ein Festlegen auf true oder false der absolute Status der resultierenden Eigenschaft festgelegt.

Die folgenden Informationen aus der SPEZIFIKATION ISO/IEC 29500 stellen das Verschwinden-Element vor.

vanish (Ausgeblendeter Text)

Mit diesem Element wird festgelegt, ob die Inhalte dieses Laufs zur Anzeigezeit in einem Dokument ausgeblendet werden. [Hinweis: Die Einstellung sollte Auswirkungen auf die normale Anzeige des Texts haben, eine Anwendung kann jedoch auch über Einstellungen verfügen, in denen die Anzeige von ausgeblendetem Text erzwungen wird. Ende des Hinweises]

Diese Formatierungseigenschaft ist eine Umschalteigenschaft (§17.7.3).

Falls dieses Element nicht vorhanden ist, gibt der Standardwert an, dass die Formatierung beibehalten wird, die auf der vorherigen Ebene in der Formathierarchie angewendet wurde. Falls dieses Element in der Formathierarchie nicht angewendet wird, dann soll dieser Text nicht ausgeblendet werden, wenn er in einem Dokument angezeigt wird.

[Beispiel: Stellen Sie sich einen Textlauf vor, in dem die Eigenschaft für ausgeblendeten Text für die Inhalte des Laufs festgelegt sein soll. Diese Einschränkung wird mithilfe des folgenden WordprocessingML-Markups angegeben:

    <w:rPr>
      <w:vanish />
    </w:rPr>

Dieser Lauf deklariert, dass die vanish-Eigenschaft für die Inhalte dieses Laufs festgelegt sein soll, daher werden die Inhalte dieses Laufs ausgeblendet, wenn die Dokumentinhalte angezeigt werden. Ende des Beispiels]

© ISO/IEC29500: 2008.

Das folgende XML-Schemasegment definiert den Inhalt dieses Elements.

    <complexType name="CT_OnOff">
       <attribute name="val" type="ST_OnOff"/>
    </complexType>

Die val-Eigenschaft im Code oben ist ein binärer Wert, der ein- oder ausgeschaltet werden kann. Falls er auf on, 1 oder true festgelegt ist, ist die Eigenschaft aktiviert. Bei einem Wert von off, 0 oder false ist die Eigenschaft deaktiviert.


Beispielcode

Im folgenden Codebeispiel wird veranschaulicht, wie der gesamte ausgeblendete Text aus einem Dokument entfernt wird. Sie können die Methode WDDeleteHiddenText aufrufen, indem Sie den folgenden Aufruf als Beispiel verwenden, um den ausgeblendeten Text aus einer Datei namens "Word14.docx" zu löschen.

    string docName = @"C:\Users\Public\Documents\Word14.docx";
    WDDeleteHiddenText(docName);

Hinweis

In diesem Beispiel wird davon ausgegangen, dass die Datei Word14.docx ausgeblendeten Text enthält. Um einen Teil des Dateitexts auszublenden, markieren Sie ihn, und drücken Sie STRG+D, um das Dialogfeld Schriftart anzuzeigen. Wählen Sie das Feld Ausgeblendet aus, und klicken Sie auf OK.

Nachstehend ist der vollständige Beispielcode in C# und Visual Basic aufgeführt.

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);
        }
    }
}

Siehe auch