Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se muestra cómo usar las clases del SDK de Open XML para Office para quitar mediante programación texto oculto de un documento de procesamiento de texto.
Estructura de un documento WordProcessingML
La estructura básica de un WordProcessingML documento consta de los document elementos y body , seguidos de uno o varios elementos de nivel de bloque, como p, que representa un párrafo. Un párrafo contiene uno o varios r elementos. significa r ejecutar, que es una región de texto con un conjunto común de propiedades, como el formato. Una ejecución contiene uno o varios t elementos. El t elemento contiene un intervalo de texto. En el ejemplo de código siguiente se muestra el WordprocessingML marcado de un documento que contiene el texto "Texto de ejemplo".
<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>
Con el SDK de Open XML, puede crear contenido y estructura de documentos mediante clases fuertemente tipadas que corresponden a WordprocessingML elementos. Encontrará estas clases en el espacio de DocumentFormat.OpenXml.Wordprocessing nombres. En la tabla siguiente se enumeran los nombres de clase de las clases correspondientes a los documentelementos , body, p, ry t .
| Elemento de WordprocessingML | Open XML SDK (clase) | Descripción |
|---|---|---|
<document/> |
Document | El elemento raíz del elemento de documento principal. |
<body/> |
Body | El contenedor de las estructuras a nivel de bloque, como párrafos, tablas, anotaciones y otras recogidas en la especificación ISO/IEC 29500. |
<p/> |
Paragraph | Un párrafo. |
<r/> |
Run | Un segmento. |
<t/> |
Text | Un intervalo de texto. |
Para obtener más información sobre la estructura general de los elementos y elementos de un documento WordprocessingML, vea Estructura de un documento WordprocessingML.
Estructura del elemento Vanish
El vanish elemento desempeña un papel importante al ocultar el texto en un archivo Word. La Hidden propiedad de formato es una propiedad toggle, lo que significa que su comportamiento difiere entre usarlo dentro de una definición de estilo y usarlo como formato directo. Cuando se usa como parte de una definición de estilo, al establecer esta propiedad se alterna su estado actual.
Si se establece false en (o en un equivalente), se mantiene la configuración actual sin cambios. Sin embargo, cuando se usa como formato directo, al establecerlo true en o false establece el estado absoluto de la propiedad resultante.
La siguiente información de la especificación ISO/IEC 29500 presenta el vanish elemento .
vanish (Texto oculto)
Este elemento especifica si el contenido de este segmento debe ocultarse en la visualización de un documento. [Nota: la configuración debería afectar a la visualización normal del texto, pero es posible que una aplicación tenga valores de configuración para forzar la visualización del texto oculto. Fin de la nota]
Esta propiedad de formato es una propiedad de alternancia (§17.7.3).
Si este elemento no está presente, el valor predeterminado es dejar el formato aplicado en el nivel anterior en la jerarquía de estilos. Si este elemento nunca se aplica en la jerarquía de estilos, este texto no se ocultará cuando se muestre en un documento.
[Ejemplo: considere un segmento de texto que debe tener la propiedad de texto oculto activada para el contenido del segmento. Esa restricción se especifica mediante el siguiente WordprocessingML:
<w:rPr>
<w:vanish />
</w:rPr>
Este segmento declara que la propiedad vanish se establece para el contenido de este segmento, por lo que dicho contenido se ocultará cuando se visualice el contenido del documento. Fin del ejemplo]
© ISO/IEC 29500: 2016
El siguiente fragmento de esquema XML define el contenido de este elemento.
<complexType name="CT_OnOff">
<attribute name="val" type="ST_OnOff"/>
</complexType>
La val propiedad del código anterior es un valor binario que se puede activar o desactivar. Si se le asigna un valor de on, 1o true la propiedad está activada. Si se especifica el valor off, 0o false la propiedad está desactivada.
Funcionamiento del código
El WDDeleteHiddenText método funciona con el documento que especifique y quita todos los run elementos ocultos y quita elementos adicionales vanish . El código comienza abriendo el documento, usando el Open método e indicando que el documento debe abrirse para el acceso de lectura y escritura (el parámetro true final). Dado el documento abierto, el código usa la MainDocumentPart propiedad para navegar al documento principal y almacenar la referencia en una variable.
using (WordprocessingDocument doc = WordprocessingDocument.Open(docName, true))
{
Obtener una lista de elementos Vanish
En primer lugar, el código comprueba que doc.MainDocumentPart y doc.MainDocumentPart.Document.Body no son null y produce una excepción si falta una. A continuación, usa el Descendants() que le pasa el Vanish tipo para obtener un IEnumerable elemento de los Vanish elementos y los convierte en una 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();
Quitar ejecuciones con texto oculto y elementos de desvanecimiento adicionales
Para quitar el texto oculto, a continuación, se recorre el bucle de los List elementos de Vanish . El Vanish elemento es un elemento secundario de RunProperties , pero RunProperties puede ser un elemento secundario de Run o xref:DocumentFormat.OpenXml.Wordprocessing.ParagraphProperties>, por lo que obtenemos el elemento primario y el abuelo de cada Vanish uno y comprobaremos su tipo. A continuación, si el abuelo es un Run , quitamos esa ejecución y, si no, quitamos los Vanish elementos secundarios del elemento primario.
// 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 ejemplo
Nota:
En este ejemplo se supone que el archivo que se está abriendo contiene texto oculto. Para ocultar parte del texto del archivo, selecciónelo y haga clic en CTRL+D para mostrar el cuadro de diálogo Fuente. Active la casilla de verificación Oculto y haga clic en Aceptar.
A continuación se incluye el código de ejemplo completo en C# y 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>();
}
}
}
}