Compartilhar via


Remover texto oculto de um documento de processamento de texto

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


Estrutura de um Documento wordProcessingML

A estrutura de documentos básica de um WordProcessingML documento consiste nos document elementos e body , 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 r elementos. Significa r execução, que é uma região de texto com um conjunto comum de propriedades, como formatação. Uma execução contém um ou mais t elementos. O t elemento contém um intervalo de texto. O seguinte exemplo de código mostra a WordprocessingML marcação de um documento que contém o texto "Texto de exemplo".

    <w:document xmlns:w="http://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>

Com o SDK Open XML, pode criar estrutura e conteúdo de documentos com classes com tipos fortes que correspondem a WordprocessingML elementos. Encontrará estas classes no espaço de nomes. A tabela seguinte lista os nomes das classes que correspondem aos documentelementos , body, p, re t .

WordprocessingML Element Abrir Classe SDK XML Descrição
<document/> Document O elemento raiz para a parte do documento principal.
<body/> Body O contentor 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.

Para obter mais informações sobre a estrutura geral das partes e elementos de um documento do WordprocessingML, veja Structure of a WordprocessingML document (Estrutura de um documento wordprocessingML).


Estrutura do Elemento Vanish

O vanish elemento desempenha um papel importante ao ocultar o texto num ficheiro de Word. A Hidden propriedade de formatação é uma propriedade de alternar, o que significa que o respetivo comportamento difere entre utilizá-la numa definição de estilo e utilizá-la como formatação direta. Quando utilizada como parte de uma definição de estilo, a definição desta propriedade alterna o estado atual. Defini-lo como false (ou equivalente) resulta em manter a definição atual inalterada. No entanto, quando utilizada como formatação direta, defini-la como true ou false define o estado absoluto da propriedade resultante.

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

desaparecer (Texto Oculto)

Este elemento especifica se o conteúdo desta execução deve ser ocultado da apresentação no momento da apresentação num documento. [Nota: a definição deve afetar a apresentação normal de texto, mas uma aplicação pode ter definições para forçar a apresentação do texto oculto. nota de fim]

Esta propriedade de formatação é uma propriedade de alternar (}17.7.3).

Se este elemento não estiver presente, o valor predefinido é deixar a formatação aplicada ao nível anterior na hierarquia de estilos. Se este elemento nunca for aplicado na hierarquia de estilos, este texto não será ocultado quando apresentado num documento.

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

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

Esta execução declara que a propriedade de desaparecimento está definida para o conteúdo desta execução, pelo que o conteúdo desta execução será ocultado quando os conteúdos do documento forem apresentados. exemplo final]

© ISO/IEC 29500: 2016

O seguinte segmento de esquema XML define o conteúdo deste elemento.

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

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

Como Funciona o Código

O WDDeleteHiddenText método funciona com o documento que especificar e remove todos os run elementos que estão ocultos e remove elementos adicionais vanish . O código começa por abrir o documento, utilizando o Open método e indicando que o documento deve ser aberto para acesso de leitura/escrita (o parâmetro verdadeiro final). Dado o documento aberto, o código utiliza a MainDocumentPart propriedade para navegar para o documento main, armazenando a referência numa variável.

using (WordprocessingDocument doc = WordprocessingDocument.Open(docName, true))
{

Obter uma Lista de Elementos Desaparecidos

O código verifica primeiro se doc.MainDocumentPart e doc.MainDocumentPart.Document.Body não são nulos e gera uma exceção se um estiver em falta. Em seguida, utiliza a Descendants() transmissão do Vanish tipo para obter um IEnumerable dos elementos e lança-os Vanish para uma lista.

if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
{
    throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}

// Get a list of all the Vanish elements
List<Vanish> vanishes = doc.MainDocumentPart.Document.Body.Descendants<Vanish>().ToList();

Remover Execuções com Texto Oculto e Elementos De Fuga Extra

Para remover o texto oculto, vamos repetir o ciclo sobre os ListVanish elementos. O Vanish elemento é subordinado doRunProperties, mas RunProperties pode ser subordinado de um Run ou xref:DocumentFormat.OpenXml.Wordprocessing.ParagraphProperties>, pelo que obtemos o pai e o avô de cada Vanish um e marcar o seu tipo. Então, se o avô é um Run nós removemos essa corrida e se não nós removemos os Vanish elementos subordinados do pai.

// Loop over the list of Vanish elements
foreach (Vanish vanish in vanishes)
{
    var parent = vanish?.Parent;
    var grandparent = parent?.Parent;

    // If the grandparent is a Run remove it
    if (grandparent is Run)
    {
        grandparent.Remove();
    }
    // If it's not a run remove the Vanish
    else if (parent is not null)
    {
        parent.RemoveAllChildren<Vanish>();
    }
}

Código de exemplo

Observação

Este exemplo pressupõe que o ficheiro que está a ser aberto contém algum texto oculto. Para ocultar parte do texto do ficheiro, selecione-o e clique em CTRL+D para mostrar a caixa de diálogo Tipo de Letra. Selecione a caixa Oculto e clique em OK.

A seguir está o código de exemplo completo em C# e em Visual Basic.

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Collections.Generic;
using System.Linq;


static void WDDeleteHiddenText(string docName)
{
    // Given a document name, delete all the hidden text.

    using (WordprocessingDocument doc = WordprocessingDocument.Open(docName, true))
    {

        if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
        }

        // Get a list of all the Vanish elements
        List<Vanish> vanishes = doc.MainDocumentPart.Document.Body.Descendants<Vanish>().ToList();

        // Loop over the list of Vanish elements
        foreach (Vanish vanish in vanishes)
        {
            var parent = vanish?.Parent;
            var grandparent = parent?.Parent;

            // If the grandparent is a Run remove it
            if (grandparent is Run)
            {
                grandparent.Remove();
            }
            // If it's not a run remove the Vanish
            else if (parent is not null)
            {
                parent.RemoveAllChildren<Vanish>();
            }
        }
    }
}

Confira também