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 document
elementos , body
, p
, r
e 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
, 1
ou true
se a propriedade estiver ativada. Se for dado o valor off
, 0
ou 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 List
Vanish
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>();
}
}
}
}