Compartilhar via


Remover texto oculto de um documento de processamento de texto

Este tópico mostra como usar as classes no SDK Do Open XML para Office para remover programaticamente texto oculto de um documento de processamento de palavras.


Como obter um objeto WordprocessingDocument

Para abrir um documento existente, instancie a classe WordprocessingDocument , conforme mostrado na instrução de uso a seguir. Na mesma instrução, você abre o arquivo de processamento de palavras com o arquivo especificadoName usando o método Open , com o parâmetro booliano definido como true para habilitar a edição do documento.

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

A instrução de uso fornece uma alternativa recomendada ao típico . Criar. Salvar. Fechar sequência. Ela garante que o método Dispose (método interno usado pelo SDK do Open XML para limpar recursos) seja chamado automaticamente quando a chave de fechamento for atingida. O bloco que segue a instrução de uso estabelece um escopo para o objeto que é criado ou nomeado na instrução de uso, nesse caso, doc. Como a classe WordprocessingDocument no SDK Open XML salva e fecha automaticamente o objeto como parte de sua implementação System.IDisposable e, como o Dispose é chamado automaticamente quando você sai do bloco, você não precisa chamar explicitamente Salvar e Fechar─desde que você use o uso.


Estrutura de um documento WordProcessingML

A estrutura básica do documento de um documento WordProcessingML consiste nos elementos do documento e do corpo , seguidos por um ou mais elementos de nível de bloco, como p, que representa um parágrafo. Um parágrafo contém um ou mais elementos r . O r significa run, que é uma região de texto com um conjunto comum de propriedades, como a formatação. Uma execução contém um ou mais elementos t . O elemento t contém um intervalo de texto. O exemplo de código a seguir mostra a marcação WordprocessingML para um documento que contém o texto "Texto de exemplo".

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

Usando o SDK do Open XML, você pode criar estrutura de documentos e conteúdo usando classes fortemente tipdas que correspondem aos elementos WordprocessingML . Você encontrará essas classes no namespace DocumentFormat.OpenXml.Wordprocessing . A tabela a seguir lista os nomes de classe das classes que correspondem aos elementos documento, corpo, p, r e t .

Elemento WordprocessingML Classe SDK Open XML Descrição
document Document O elemento raiz para a parte do documento principal.
corpo Body O contêiner para as estruturas de nível de bloco, como parágrafos, tabelas, anotações e outros especificados na especificação ISO/IEC 29500 .
p Paragraph Um parágrafo.
r Run Uma execução.
t Text Um intervalo de texto.

Estrutura do Elemento Vanish

O elemento vanish desempenha um papel importante na ocultação do texto em um arquivo Word. A propriedade de formatação oculta é uma propriedade de alternância, o que significa que seu comportamento difere entre usá-la dentro de uma definição de estilo e usá-la como formatação direta. Quando usada como parte de uma definição de estilo, definir essa propriedade alterna seu estado atual. Defini-lo como false (ou equivalente) resulta em manter a configuração atual inalterada. No entanto, quando usada como formatação direta, defini-la como true ou false define o estado absoluto da propriedade resultante.

As informações a seguir da especificação ISO/IEC 29500 introduzem o elemento vanish .

vanish (Texto Oculto)

Esse elemento especifica se o conteúdo dessa execução deve ser oculto da exibição no tempo de exibição em um documento. [Observação: a configuração deve afetar a exibição normal do texto, mas um aplicativo pode ter configurações para forçar a exibição do texto oculto. nota final]

Essa propriedade de formatação é uma propriedade de alternância (§17.7.3).

Se esse elemento não estiver presente, o valor padrão será deixar a formatação aplicada no nível anterior na hierarquia de estilo . Se esse elemento nunca for aplicado na hierarquia de estilos, esse texto não será oculto quando exibido em um documento.

[Exemplo: considere uma execução de texto que deve ter a propriedade de texto oculto ativada para o conteúdo da execução. Essa restrição é especificada usando o seguinte WordprocessingML:

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

Essa execução declara que a propriedade vanish está definida para o conteúdo desta execução, portanto, o conteúdo dessa execução será oculto quando o conteúdo do documento for exibido. exemplo final]

© ISO/IEC29500: 2008.

O segmento de esquema XML a seguir define o conteúdo desse elemento.

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

A propriedade val no código acima é um valor binário que pode ser ativado ou desativado. Se dado um valor de ativado, 1 ou true , a propriedade será ativada. Se dado o valor desativado, 0 ou false , a propriedade será desativada.


Código de exemplo

O exemplo de código a seguir mostra como remover todo o texto oculto de um documento. Você pode chamar o método WDDeleteHiddenText usando a chamada a seguir como exemplo para excluir o texto oculto de um arquivo chamado "Word14.docx".

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

Observação

Este exemplo pressupõe que o arquivo Word14.docx contém algum texto oculto. Para ocultar parte do texto do arquivo, selecione-o e clique em CTRL+D para mostrar a caixa de diálogo Fonte . Selecione a caixa Oculta e clique em OK.

A seguir está o código de exemplo completo em C# e em 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);
        }
    }
}

Confira também