Esta entrada forma parte de una serie de artículos dedicados a NRtfTree, la librería .NET para tratamiento de documentos RTF, entre los cuales podrás encontrar una descripción detallada de la librería, documentación técnica, ejemplos y tutoriales de uso que pueden ser de tu interés. No olvides consultar la página principal de NRtfTree para más información.
En el apartado anterior vimos como las clases RtfTree y RtfTreeNode nos van a dar la posibilidad de tratar los distintos elementos de un documento RTF como si formaran parte de una estructura en forma de árbol. Esto facilita en gran medida el análisis y modificación de un documento por parte de nuestras aplicaciones, siempre de forma muy general y sin imponer en ningún momento tratamientos o conversiones específicas del contenido.
Una vez cargado un documento en el árbol [consultar el siguiente apartado del manual para más información sobre la carga de documentos], cada nodo de éste (de la clase RtfTreeNode) representará un elemento del código RTF, que se diferenciará por su tipo de nodo, su clave, y el valor de su parámetro en caso de existir.
En cuanto al tipo de nodo, almacenado en la propiedad NodeType, NRtfTree considera 5 posibles tipos, declarados en la clase RtfNodeType, de acuerdo a los distintos elementos que componen un documento RTF [consultar el apartado de introducción al formato RTF para más detalles]:
Tipo de Nodo | Descripción |
ROOT | Nodo raíz del árbol |
KEYWORD | Palabra de control |
CONTROL | Símbolo de control |
TEXT | Texto del documento |
GROUP | Grupo RTF |
El único tipo de nodo que no habíamos visto hasta ahora es el llamado nodo raíz o ROOT. Éste es un nodo auxiliar (es decir, no forma parte del documento real) creado por NRtfTree del cual va a partir el resto del árbol RTF del documento. Un árbol RTF vacío será aquel que cuente únicamente con el nodo ROOT.
El segundo elemento destacable de un nodo RTF es su clave, almacenada en la propiedad NodeKey de la clase RtfTreeNode. El contenido de ésta dependerá del tipo de nodo en cuestión, pudiendo tener los siguientes significados:
Tipo de Nodo | Contenido de la clave del nodo [propiedad NodeKey] |
ROOT | Vacío |
KEYWORD | Palabra de control del nodo [ Ejemplo: \b –> NodeKey = ‘b’ ] |
CONTROL | Símbolo de control del nodo [ Ejemplo: \~ –> NodeKey = ‘~’ ] |
TEXT | Texto del nodo |
GROUP | Vacío |
Por último, cada nodo también contendrá el valor de su parámetro, si existe. Este valor se almacenará en la propiedad Parameter de RtfTreeNode. Si el elemento RTF no va acompañado de ningún parámetro, el valor de esta propiedad será 0. Esto nos lleva al problema de distinguir cuándo un nodo no tiene parámetro, o sí lo tiene pero con valor 0. Para ello, cada nodo cuenta también con una propiedad booleana llamada HasParameter, que indica si el nodo tiene o no parámetro asociado.
Por mostrar un pequeño ejemplo de código, si consideramos un nodo equivalente a la palabra de control ‘\deflang3082‘, el siguiente código mostraría la siguiente salida:
Console.WriteLine("Tipo: " + nodo.NodeType); Console.WriteLine("Clave: " + nodo.NodeKey); Console.WriteLine("Tiene parámetro: " + nodo.HasParameter); Console.WriteLine("Valor parámetro: " + nodo.Parameter); /****************************** Salida del programa: Tipo: KEYWORD Clave: deflang Tiene parámetro: True Valor parámetro: 3082 *******************************/
Con todos estos elementos en cuenta, ya podemos ver un ejemplo del árbol RTF creado por NRtfTree para un documento sencillo. A continuación se muestra un documento con formato, su código interno RTF, y una representación textual del árbol RTF creado por NRtfTree (en formato «<Tipo>: <Clave> <Parámetro>»):
Texto enriquecido del documento
NRTFTree v0.1 es una librería escrita en C# para el tratamiento estructurado de documentos RTF.
Código RTF interno del documento
{\rtf1\ansi\ansicpg1252\deff0\deflang3082
{\fonttbl{\f0\fswiss\fcharset0 Arial;}{\f1\fmodern\fprq1\fcharset0 Courier New;}}
{\colortbl ;\red255\green0\blue0;\red0\green0\blue128;}
\viewkind4\uc1\pard\b\f0\fs20 NRTFTree v0.1\b0 es una librer\’eda \cf1\b\fs24 escrita en C# \cf0\b0\fs20 para el \cf2\i\fs24 tratamiento estructurado\fs20 \cf0\i0 de\f1\fs40 documentos RTF\f0\fs20 .\par}
Árbol RTF generado por NRtfTree
ROOT GROUP KEYWORD: rtf 1 KEYWORD: ansi KEYWORD: ansicpg 1252 KEYWORD: deff 0 KEYWORD: deflang 3082 GROUP KEYWORD: fonttbl GROUP KEYWORD: f 0 KEYWORD: fswiss KEYWORD: fcharset 0 TEXT: Arial; GROUP KEYWORD: f 1 KEYWORD: fmodern KEYWORD: fprq 1 KEYWORD: fcharset 0 TEXT: Courier New; GROUP KEYWORD: colortbl TEXT: ; KEYWORD: red 255 KEYWORD: green 0 KEYWORD: blue 0 TEXT: ; KEYWORD: red 0 KEYWORD: green 0 KEYWORD: blue 128 TEXT: ; KEYWORD: viewkind 4 KEYWORD: uc 1 KEYWORD: pard KEYWORD: b KEYWORD: f 0 KEYWORD: fs 20 TEXT: NRTFTree v0.1 KEYWORD: b 0 TEXT: es una librer CONTROL: ' 237 TEXT: a KEYWORD: cf 1 KEYWORD: b KEYWORD: fs 24 TEXT: escrita en C# KEYWORD: cf 0 KEYWORD: b 0 KEYWORD: fs 20 TEXT: para el KEYWORD: cf 2 KEYWORD: i KEYWORD: fs 24 TEXT: tratamiento estructurado KEYWORD: fs 20 TEXT:� KEYWORD: cf 0 KEYWORD: i 0 TEXT: de KEYWORD: f 1 KEYWORD: fs 40 TEXT: documentos RTF KEYWORD: f 0 KEYWORD: fs 20 TEXT: . KEYWORD: par
En la figura anterior se muestra cada elemento del documento RTF con su nivel dentro del árbol, su tipo de nodo, la palabra clave o símbolo de control correspondiente y su parámetro asociado en caso de existir. Como puede comprobarse, la estructura de árbol del documento proviene de la dependencia creada entre los nodos de tipo Grupo y sus nodos hijos asociados. NRtfTree tan sólo crea esta dependencia para los grupos RTF (y para el nodo ROOT), los demás tipos de nodo no tendrán descendientes en el árbol.
Una vez cargado el documento, las clases RtfTree y RtfTreeNode proporcionan una serie de métodos sencillos con los que se puede recorrer el árbol y modificar su contenido añadiendo, modificando o eliminando nodos. En el siguiente apartado veremos los mecanismos disponibles para navegar entre los nodos de un árbol RTF [Para una información más detallada de todos los métodos y propiedades disponibles también se puede consultar la documentación de la API de la librería proporcionada en formato CHM o HTML junto al código fuente de la misma].
Veamos un ejemplo de documento RTF donde aparecen todos los elementos comentados:
{\rtf1\ansi\ansicpg1252\deff0\deflang3082
{\fonttbl{\f0\fswiss\fcharset0 Arial;}{\f1\fmodern\fprq1\fcharset0 Courier New;}}
{\colortbl ;\red255\green0\blue0;\red0\green0\blue128;}
\viewkind4\uc1\pard\b\f0\fs20 NRTFTree v0.1\b0 es una librer\’eda \cf1\b\fs24 escrita en C# \cf0\b0\fs20 para el \cf2\i\fs24 tratamiento estructurado\fs20 \cf0\i0 de\f1\fs40 documentos RTF\f0\fs20 .\par}
El código RTF mostrado corresponde al texto con formato siguiente:
NRTFTree v0.1 es una librería escrita en C# para el tratamiento estructurado de documentos RTF.