NRtfTree permite la modificación de árboles RTF mediante la eliminación, modificación y creación de nuevos nodos en cualquier lugar del árbol. Para ello nos proporciona diversos constructores y métodos públicos que nos facilitarán esta tarea.

Creación de nuevos nodos RTF

Para la creación de nuevos nodos tendremos disponibles varios constructores de la clase RtfTreeNode:

//Crea un nuevo nodo vacío
RtfTreeNode node = new RtfTreeNode();

//Crea un nuevo nodo de tipo Keyword sin parámetro
RtfTreeNode node = new RtfTreeNode(RtfNodeType.Keyword);

//Crea un nuevo nodo de tipo Keyword,
//palabra de control "\fs" y parámetro con valor 1
RtfTreeNode node =
       new RtfTreeNode(RtfNodeType.Keyword, "fs", true, 1);

Una vez creado un nodo éste también puede ser editado a través de sus propiedades:

  • NodeType (tipo de nodo, enumeración RtfNodeType)
  • NodeKey (palabra de control)
  • HasParameter (indica si el nodo tiene parámetro asociado)
  • Parameter (valor del parámetro, 0 si HasParameter es falso)

Inserción de nodos hijos

Los nodos de tipo grupo (RtfNodeType.Group) pueden contener nodos hijos. Para insertarlos pueden utilizarse los métodos AppendChild(), InsertChild(), o acceder directamente a los métodos de su propiedad ChildNodes.

//Inserta un nuevo nodo al final de la lista de hijos
node.AppendChild(nuevoNodo);

//Inserta un nuevo nodo en la posición 3 de la lista de hijos
node.InsertChild(3, nuevoNodo);

//Inserta un nuevo nodo al final de la lista de hijos
node.ChildNodes.Add(nuevoNodo);

//Inserta un conjunto de nodos al final de la lista de hijos
node.ChildNodes.AddRange(coleccionNodos);

//Inserta un nuevo nodo en la posición 3 de la lista de hijos
node.ChildNodes.Insert(3, nuevoNodo);

Eliminación de nodos

Para eliminar nodos de un árbol RTF existen también diversos métodos dependiendo de si necesitamos hacerlo por su posición en el árbol o por su valor. Además, al igual que en el caso de la inserción de nodos, podremos hacerlo utilizando los métodos propios del nodo, o los de su colección de nodos hijos ChildNodes.

//Elimina el cuarto nodo de la lista de hijos
node.RemoveChild(3);

//Elimina un nodo concreto de la lista de hijos
node.RemoveChild(nodoAEliminar);

//Elimina el cuarto nodo de la lista de hijos
node.ChildNodes.RemoveAt(3);

//Elimina 5 nodos hijos a partir de la posición 3
node.ChildNodes.RemoveRange(3, 5);

Creación directa de árboles RTF

Vistos los métodos de creación, inserción y ensamblaje de nodos RTF. ya deberíamos saber construir un árbol RTF desde cero utilizando de forma ordenada todos estos recursos. Vemos por ejemplo como construir el siguiente documento sencillo:

{\rtf1\ansi{\fonttbl{\f0 Arial;}}\pard Prueba\par}

RtfTree tree = new RtfTree();

RtfTreeNode main = new RtfTreeNode(RtfNodeType.Group);

main.AppendChild(
           new RtfTreeNode(RtfNodeType.Keyword, "rtf", true, 1));
main.AppendChild(
           new RtfTreeNode(RtfNodeType.Keyword, "ansi", false, 0));

RtfTreeNode fontTable = new RtfTreeNode(RtfNodeType.Group);
fontTable.AppendChild(
              new RtfTreeNode(RtfNodeType.Keyword, "fonttbl", false, 0));

RtfTreeNode arial = new RtfTreeNode(RtfNodeType.Group);
arial.AppendChild(
          new RtfTreeNode(RtfNodeType.Keyword, "f", true, 0));
arial.AppendChild(
          new RtfTreeNode(RtfNodeType.Text, "Arial;", false, 0));

fontTable.AppendChild(arial);

main.AppendChild(fontTable);
main.AppendChild(
          new RtfTreeNode(RtfNodeType.Keyword, "pard", false, 0));
main.AppendChild(
           new RtfTreeNode(RtfNodeType.Text, "Prueba", false, 0));
main.AppendChild(
           new RtfTreeNode(RtfNodeType.Keyword, "par", false, 0));

tree.RootNode.AppendChild(main);
, , , , ,

El primer paso a la hora de trabajar con documentos RTF mediante NRtfTree es la carga del documento. El proceso de carga será el encargado de leer el código RTF del documento, parsearlo, y construir el árbol RTF equivalente. Como ya comentamos en el apartado de introducción al modelo DOM de NRtfTree, un árbol RTF quedará representado por un objeto de la clase RtfTree, y cada uno de sus nodos será una instancia de RtfTreeNode.

NRtfTree permite cargar documentos desde un fichero en disco o directamente desde una cadena de caracteres. Ambas opciones resultan tan sencillas como llamar al método correspondiente de carga indicando como parámetro la ruta del fichero o la cadena correspondiente.

Así, para cargar un documento RTF desde un fichero de disco procederemos de la siguiente forma:

//Se crea el objeto RtfTree que albergará el árbol RTF
RtfTree tree = new RtfTree();

//Se carga el documento desde un fichero indicando su ruta
int res = tree.LoadRtfFile("midocumento.rtf");

Como vemos, en primer lugar crearemos el objeto RtfTree que va a almacenar el árbol RTF, y en segundo lugar llamamos al método LoadRtfFile() para cargar el documento. El constructor de RtfTree no recibe ningún parámetro, ya que su función es simplemente la de crear un árbol vacío (se crea tan solo el nodo ROOT). Por su parte, el método de carga recibe como parámetro la ruta del fichero a cargar y devuelve un entero con el resultado de la carga, donde un valor 0 indicará que la carga se ha realizado correctamente y un valor -1 indicará que se ha producido algún error.

De forma análoga, la carga de un documento desde una cadena de caracteres se realizaría de la siguiente forma:

//Cadena de caracteres con código RTF
string strdoc =
@"{\rtf1\ansi\ansicpg1252\deff0\deflang1034\deflangfe1034\deftab708" +
@"{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}}" +
@"\viewkind4\uc1\pard\nowidctlpar\lang3082\f0\fs24 example\par}";

//Se crea el objeto RtfTree que albergará el árbol RTF
RtfTree tree = new RtfTree();

//Se carga el documento desde la cadena de caracteres
int res = tree.LoadRtfText(strdoc);

La única diferencia con el ejemplo anterior es la utilización del método LoadRtfText(), que recibe en este caso una cadena de caracteres con el contenido del documento RTF.

La única opción adicional que ofrece NRtfTree a la hora de cargar un documento es la fusión de caracteres especiales con nodos de texto adyacentes. Expliquemos esto un poco. En RTF, algunos caracteres especiales no se incluyen directamente en el codigo, sino que se representan mediante el símbolo de control \’ seguido por su código numérico correspondiente [en hexadecimal] según la codificación utilizada en el documento. Así, como ejemplo que afecta especialmente al idioma castellano, las vocales acentuadas y la letra ñ no aparecen tal cual en el código RTF, sino que aparecen codificadas de la forma descrita. Por ejemplo la vocal acentuada ‘é’ aparecerá como \’e9 .

Si no se indica ninguna opción especial a NRtfTree, cuando la librería genere por ejemplo el árbol RTF correspondiente al texto “apéndice”, cuyo código RTF es “ap\’e9ndice”, se generarán 3 nodos: un nodo de tipo texto con el contenido “ap”, un nodo de tipo control con el parámetro e9 (realmente en el nodo se almacena en decimal, en este caso 233), y otro nodo de texto con el contenido “ndice”.

Aunque para reflejar de forma fiel el contenido RTF real del documento son estos tres nodos los que deben generarse, en ocasiones esto puede no ser lo más práctico. Para ello, NRtfTree ofrece la posibilidad de fusionar, durante la carga del documento, los símbolos de control correspondientes a caracteres especiales con los nodos de texto adyacentes, si existen. Así, siguiendo con el ejemplo, para el texto “apéndice” se generaría un sólo nodo de tipo texto con el contenido completo de la palabra.

Esto se consigue activando la propiedad MergeSpecialCharacters de RtfTree antes de llamar al método de carga correspondiente. Veamos un ejemplo:

//Se crea el objeto RtfTree que albergará el árbol RTF
RtfTree tree = new RtfTree();

//Se activa la opción de combinar caracteres especiales
tree.MergeSpecialCharacters = true;

//Se carga el documento desde un fichero indicando su ruta
int res = tree.LoadRtfFile("midocumento.rtf");

En el siguiente apartado veremos cómo una vez cargado el documento y generado su árbol RTF equivalente podemos navegar facilmente por su contenido a través de sus nodos.

, , , ,

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.

El formato RTF (Rich Text Format) nace como un método de codificación de texto con formato e imágenes fácil de transferir entre distintos dispositivos, sistemas y aplicaciones. Con la especificación de este formato se pretende que un documento creado en un sistema determinado pueda consultarse y manipularse en cualquier otro contexto diferente sin las barreras impuestas por otros formatos propietarios.

Esta capacidad surge del hecho de que internamente un documento RTF se almacena como texto plano, en el que se incluye tanto la información del documento en sí como una serie de metadatos que informan del formato del documento y del resto de propiedades adicionales aportadas por RTF.

Un documento RTF se compone de cuatro elementos básicos: texto sin formato, palabras de control (también llamadas palabras clave), símbolos de control y grupos.

Una palabra de control es un comando RTF que se utilizará para dar información acerca del formato del documento o cualquier otro tipo de información adicional sobre el texto. Las palabras de control tienen la siguiente forma:

\PalabraControl<Delimitador>

donde PalabraControl puede ser cualquier combinación de letras en minúscula y <Delimitador> puede ser uno de los siguientes:

  1. Un espacio en blanco. En este caso éste se considerará parte de la palabra de control, es decir, no formará parte del texto del documento.
  2. Un dígito o un guión (“-”). Esto significará que existe un parámetro numérico que acompaña a la palabra de control. Este parámetro terminará al encontrarse un espacio o cualquier caracter no alfanumérico.
  3. Cualquier caracter no alfanumérco. En este caso este caracter no se considerará parte de la palabra de control.

Un símbolo de control se utilizará, entre otras cosas, para representar determinados caracteres especiales y tendrá la siguiente forma:

\SimboloControl<Parametro>

donde SimboloControl puede ser cualquier caracter no alfanumérico y <Parametro> (opcional) será cualquier valor alfanumérico. Además, es importante remarcar que los símbolos de control no van separados por ningún tipo de delimitador. Un ejemplo de símbolo de control puede ser \~ que representa un espacio indivisible.

Un grupo consiste en un conjunto de texto, palabras y símbolos de control encerrados entre llaves (‘{‘ y ‘}’) de forma que todo el texto del documento contenido en un grupo comparte las mismas propiedades. Además, existen grupos especiales que forman parte de la cabecera de un documento RTF y contienen información sobre las fuentes, colores y estilos, entre otros, contenidos en el documento.

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.

La estructura general de un documento fuente RTF es la siguiente:

‘{‘ <Cabecera> <Contenido del documento> ‘}’

Por su parte, la cabecera del documento tendrá la siguiente estructura:

<Cabecera> –> \rtf <charset> \deff ? <fonttbl> <filetbl>? <colortbl>? <stylesheet>? <listtables>? <revtbl>?

con los siguientes significados:

<charset> : Tabla de caracteres utilizada en la codificación del documento.

\deff : Fuente por defecto.

<fonttbl>: Tabla de fuentes. Aquí se incluirán todas las fuentes utilizadas en el documento.

<filetbl>: Tabla de ficheros. Utilizada sólo cuando el documento incluye subdocumentos.

<colortbl>: Tabla de colores. Aquí se incluirán todos los colores de fuente utilizados en el documento.

<stylesheet>: Tabla de estilos. Aquí se incluirán los estilos utilizados en el documento.

<listtables>: Tablas de listas. Donde se incluye información sobre las listas, numeradas o no, contenidas en el documento.

<revtbl>: Tabla de revisiones. Que contendrá información sobre las modificaciones realizadas en el documento.

De todos estos elementos, tan sólo el conjunto de caracteres y la tabla de fuentes son obligatorios, y normalmente, tan sólo éstos junto con la tabla de colores serán los que aparezcan en la mayoría de documentos.

En el primer ejemplo podemos ver estas dos tablas habituales. Por un lado la tabla de fuentes donde se definen dos fuentes distintas Arial y Courier New:

{\fonttbl{\f0\fswiss\fcharset0 Arial;}{\f1\fmodern\fprq1\fcharset0 Courier New;}}

Y por otro lado tembién tenemos la tabla de colores, donde definimos tres colores, uno predeterminado que depende de la aplicación que trate el documento (indicado por el primer punto y coma) y otros dos definidos por sus valores RGB:

{\colortbl ;\red255\green0\blue0;\red0\green0\blue128;}

Por último, justo a continuación de la cabecera del documento, comienza el contenido del documento en sí, que irá acompañado de las palabras y símbolos de control que den información sobre su formato. Así por ejemplo, el fragmento siguiente:

\b\f0\fs20 NRTFTree v0.1

indica que el texto “NRTFTree v0.1” se escribirá en negrita (\b), con la fuente número 0 de la tabla de fuentes (\f0) y con tamaño de fuente 20 (\fs20).

Para una información más detallada sobre la especificación del formato RTF se puede descargar la documentación oficial desde el siguiente enlace: [Especificación RTF versión 1.8]

, , , ,

Librería CRtfTree

La librería CRtfTree es una traducción al lenguaje C++ de la librería NRtfTree.

Esta versión ha sido realizada y cedida amablemente por Nicolás Alonso. Se encuentra actualmente en una etapa muy temprana de su desarrollo aunque, por lo que he podido ver, las clases base ya están implementadas, de forma que ya puede resultar útil su uso.

Si en algún momento está disponible una versión más completa de CRtfTree la publicaré puntualmente en esta misma página.

En el fichero zip disponible para la descarga se proporciona el código fuente íntegro del proyecto escrito bajo Visual C++ 2003.

Descarga Tamaño Descripción
CRtfTree 491 Kb Fuentes completos de la librería CRtfTree (versión 13/01/2007).

Nota Importante:

Como he indicado anteriormente, esta versión de la librería no es propia por lo que no ofrezco soporte personalmente ni asumo ningún tipo de responsabilidad sobre la misma.

, , , ,

Librería JRtfTree

Índice de secciones

  1. Introducción
  2. Descargas

Enlaces relacionados

Introducción a JRtfTree

JRtfTree es una traducción al lenguaje Java de mi proyecto NRtfTree (C#). JRtfTree se distribuye bajo licencia GPL.

Se trata de una librería dirigida a facilitar el tratamiento estructurado de documentos con formato RTF.

El formato RTF (Rich Text Format) permite la creación de texto enriquecido en el que pueden insertarse una gran cantidad de elementos extra como imágenes, tablas, listas, hipervínculos y otras muchas características propias de cualquier procesador de texto actual.

La API ofrecida por JRtfTree permite de forma sencilla el análisis, lectura y modificación de documentos RTF, pudiendo utilizar para ello dos modelos distintos de ejecución análogos a los modelos SAX y DOM aplicados al formato XML.

Bajo el primero de los modelos, estilo DOM, JRtfTree permite analizar de forma automática un documento RTF tras convertirlo a una estructura de datos interna en forma de árbol, manejable e intuitiva, a través de la cual poder analizar y modificar el documento de una forma sencilla y eficaz sin tener que conocer a fondo los detalles del formato RTF.

Con el segundo de los modos de ejecución, estilo SAX, el documento RTF podrá analizarse de forma secuencial bajo un modelo basado en eventos, donde sólo habrá que implementar las actuaciones necesarias para tratar cada uno de los elementos leidos del documento RTF que sean relevantes para nuestra aplicación.

Mientras completo la sección de JRtfTree con más información específica para Java, puede conseguir más información sobre el proyecto visitando la página de NRtfTree, versión original de la librería en C#, que contiene información adicional y ejemplos que pueden ser aplicados muy fácilmente a la versión Java.

La versión disponible actualmente de JRtfTree (v0.1.1b) se encuentra aún en fase beta y abarca toda la funcionalidad de las clases base de la versión 0.2 de NRtfTree. Las clases de nodos especiales (imagen, objeto y grupo de información) se publicarán más adelante una vez estabilizada la versión actual.

, , , , ,

Descargas NRtfTree

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 esta sección se mostrarán todas las descargas disponibles para el proyecto NRtfTree:

Última Versión: 0.3 Final (0.3.3503)

Fuentes NRtfTree 0.3 Final (0.3.3503) [1.29 Mb]

Esta descarga incluye:

  • Fuentes completos de la librería NRtfTree v0.3.0 beta 2.
  • Fuentes completos de las aplicaciones de ejemplo de NRtfTree.
  • Documentación API de la librería NRtfTree en formato CHM y HTML.

Ejecutables NRtfTree v0.3 Final (0.3.3503) [131 Kb]

Esta descarga incluye:

  • Librería NRtfTree compilada.
  • Ejecutables de las aplicaciones de ejemplo.
  • Documentos de ejemplo.

Documentacion API NRtfTree 0.3 Formato CHM [300 Kb]

Esta descarga incluye:

  • Documentación de la librería NRtfTree 0.3 en formato CHM.

Documentacion API NRtfTree 0.3 Formato HTML [658 Kb]

Esta descarga incluye:

  • Documentación de la librería NRtfTree 0.3 en formato HTML.

Aunque no recomendable, también es posible descargar versiones anteriores de la librería:

Versión 0.3.0 beta 2

Fuentes NRtfTree 0.3.0 beta 2 [1.07 Mb]

Esta descarga incluye:

  • Fuentes completos de la librería NRtfTree v0.3.0 beta 2.
  • Fuentes completos de las aplicaciones de ejemplo de NRtfTree.
  • Documentación de la librería NRtfTree en formato CHM y HTML.

Ejecutables NRtfTree v0.3.0 beta 2 [243 Kb]

Esta descarga incluye:

  • Librería NRtfTree compilada.
  • Ejecutables de las aplicaciones de ejemplo.
  • Documentos de ejemplo.

Versión 0.3.0 beta 1

Librería NRtfTree v0.3.0 beta 1 [63 Kb]

Fuentes completos de la librería NRtfTree v0.3.0 beta 1 y de la aplicación de ejemplo.

Aplicación de ejemplo NRtfTree v0.3.0 beta 1 [548 Kb]

Ejecutables de la librería, aplicación de ejemplo y documentación HTML. Se incluyen tres documentos de ejemplo para utilizar con la demostración.


Versión 0.2.1

Librería NRtfTree v0.2.1 [45 Kb]

Fuentes completos de la librería NRtfTree v0.2.1 y de la aplicación de ejemplo.

Aplicación de ejemplo NRtfTree v0.2.1 [195 Kb]

Ejecutables de la librería y  la aplicación de ejemplo. Se incluyen tres documentos de ejemplo para utilizar con la demostración.

Documentación NRtfTree v0.2.1 [100 Kb]

Documentación en formato CHM de la librería [en español].


, , , ,

RTF y la librería NRtfTree

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.

El formato RTF (Rich Text Format) nace como un método de codificación de texto con formato e imágenes fácil de transferir entre distintos dispositivos, sistemas y aplicaciones. Con la especificación de este formato se pretende que un documento creado en un sistema determinado pueda consultarse y manipularse en cualquier otro contexto diferente sin las barreras impuestas por otros formatos propietarios.

Esta capacidad surge del hecho de que internamente un documento RTF se almacena como texto plano, en el que se incluye tanto la información del documento en sí como una serie de metadatos que informan del formato del documento y del resto de propiedades adicionales aportadas por RTF.

Un documento RTF se compone de cuatro elementos básicos: texto sin formato, palabras de control (también llamadas palabras clave), símbolos de control y grupos.

Una palabra de control es un comando RTF que se utilizará para dar información acerca del formato del documento o cualquier otro tipo de información adicional sobre el texto. Las palabras de control tienen la siguiente forma:

\PalabraControl<Delimitador>

donde PalabraControl puede ser cualquier combinación de letras en minúscula y <Delimitador> puede ser uno de los siguientes:

  1. Un espacio en blanco. En este caso éste se considerará parte de la palabra de control, es decir, no formará parte del texto del documento.
  2. Un dígito o un guión (“-”). Esto significará que existe un parámetro numérico que acompaña a la palabra de control. Este parámetro terminará al encontrarse un espacio o cualquier caracter no alfanumérico.
  3. Cualquier caracter no alfanumérco. En este caso este caracter no se considerará parte de la palabra de control.

Un símbolo de control se utilizará, entre otras cosas, para representar determinados caracteres especiales y tendrá la siguiente forma:

\SimboloControl<Parametro>

donde SimboloControl puede ser cualquier caracter no alfanumérico y <Parametro> (opcional) será cualquier valor alfanumérico. Además, es importante remarcar que los símbolos de control no van separados por ningún tipo de delimitador. Un ejemplo de símbolo de control puede ser \~ que representa un espacio indivisible.

Un grupo consiste en un conjunto de texto, palabras y símbolos de control encerrados entre llaves (‘{‘ y ‘}’) de forma que todo el texto del documento contenido en un grupo comparte las mismas propiedades. Además, existen grupos especiales que forman parte de la cabecera de un documento RTF y contienen información sobre las fuentes, colores y estilos, entre otros, contenidos en el documento.

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.

La estructura general de un documento fuente RTF es la siguiente:

‘{‘ <Cabecera> <Contenido del documento> ‘}’

Por su parte, la cabecera del documento tendrá la siguiente estructura:

<Cabecera> –> \rtf <charset> \deff ? <fonttbl> <filetbl>? <colortbl>? <stylesheet>? <listtables>? <revtbl>?

con los siguientes significados:

<charset> : Tabla de caracteres utilizada en la codificación del documento.

\deff : Fuente por defecto.

<fonttbl>: Tabla de fuentes. Aquí se incluirán todas las fuentes utilizadas en el documento.

<filetbl>: Tabla de ficheros. Utilizada sólo cuando el documento incluye subdocumentos.

<colortbl>: Tabla de colores. Aquí se incluirán todos los colores de fuente utilizados en el documento.

<stylesheet>: Tabla de estilos. Aquí se incluirán los estilos utilizados en el documento.

<listtables>: Tablas de listas. Donde se incluye información sobre las listas, numeradas o no, contenidas en el documento.

<revtbl>: Tabla de revisiones. Que contendrá información sobre las modificaciones realizadas en el documento.

De todos estos elementos, tan sólo el conjunto de caracteres y la tabla de fuentes son obligatorios, y normalmente, tan sólo éstos junto con la tabla de colores serán los que aparezcan en la mayoría de documentos.

En el primer ejemplo podemos ver estas dos tablas habituales. Por un lado la tabla de fuentes donde se definen dos fuentes distintas Arial y Courier New:

{\fonttbl{\f0\fswiss\fcharset0 Arial;}{\f1\fmodern\fprq1\fcharset0 Courier New;}}

Y por otro lado tembién tenemos la tabla de colores, donde definimos tres colores, uno predeterminado que depende de la aplicación que trate el documento (indicado por el primer punto y coma) y otros dos definidos por sus valores RGB:

{\colortbl ;\red255\green0\blue0;\red0\green0\blue128;}

Por último, justo a continuación de la cabecera del documento, comienza el contenido del documento en sí, que irá acompañado de las palabras y símbolos de control que den información sobre su formato. Así por ejemplo, el fragmento siguiente:

\b\f0\fs20 NRTFTree v0.1

indica que el texto “NRTFTree v0.1” se escribirá en negrita (\b), con la fuente número 0 de la tabla de fuentes (\f0) y con tamaño de fuente 20 (\fs20).

Para una información más detallada sobre la especificación del formato RTF se puede consultar el documento oficial en el enlace que se indica al final de este artículo.

Librería NRtfTree

La librería de clases NRtfTree proporciona una serie de mecanismos generales para la lectura y manipulación de documentos RTF.

Como se ha podido comprobar en el apartado anterior, la estructura de un documento RTF resulta en principio un tanto encríptica y a priori nada fácil de manipular de forma automática. Aunque en el fondo esto no es así, si que es cierto que el desarrollo de analizadores a medida para este tipo de documentos es una tarea relativamente complicada o al menos laboriosa, y es en este aspecto donde NRtfTree puede resultar de gran ayuda.

Las estrategias utilizadas por NRtfTree para el análisis estruturado de documentos RTF son las mismas que las utilizadas para otro tipo de documentos y formatos muy extendidos como el XML. En el contexto del formato XML existen dos aproximaciones principales al problema del análisis de su contenido: DOM (Document Object Model) y SAX (Simple API for XML).

El primero de los métodos, DOM, consiste básicamente en la carga de un documento XML completo en una estructura de datos en forma de árbol que puede manipularse fácilmente mediante una serie de métodos para el recorrido y modificación del árbol.

La segunda de las soluciones, SAX, consiste en la lectura y análisis secuencial del documento XML, durante el cual se van lanzando una serie de eventos tratables por el desarrollador y que se corresponden con la lectura de cada uno de los elementos contenidos en el documento. Así, por ejemplo, cada vez que el analizador lee del documento una etiqueta de apertura de un elemento se lanza un evento que se podrá capturar para realizar la acciones oportunas.

El primero de los métodos es quizá el más flexible de ambos debido a que una vez cargado el documento completo éste puede recorrerse tantas veces como se desee y en el sentido que se necesite. En cambio, con SAX el documento es leido una sóla vez y las acciones realizadas deben ejecutarse a medida que se analiza el documento y sin tener la posibilidad de “volver atrás”.

Pues bien, NRtfTree transfiere estas dos mismas soluciones al campo del formato RTF, y de esta forma tendremos dos clases principales:

  • RtfTree y RtfTreeNode, que proporcionan los métodos necesarios para cargar y manipular un documento RTF en forma de estructura de árbol.
  • RtfReader y SARParser, que dan la posibilidad de realizar un tratamiento al estilo SAX de un documento RTF.

RtfTree y RtfTreeNode

Como hemos comentado, RtfTree nos va dar la posibilidad de tratar los distintos elementos de un documento RTF como si formaran parte de una estructura en forma de árbol. Esto facilitará 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, cada nodo de éste representará un elemento del documento, que se diferenciarán por el tipo de nodo. De esta forma existirán 5 tipos de nodo:

ROOT      Nodo raíz del árbol.
KEYWORD   Palabra de control.
CONTROL   Símbolo de control.
TEXT      Texto del documento.
GROUP     Grupo RTF

Cada nodo del árbol irá acompañado además de su parámetro correspondiente en caso de exisitir, por lo que quedarán perfectamente separados todos los elementos del documento y su información asociada.

Como ejemplo, veamos el árbol creado al cargar el documento de la figura 1:

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.

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. Para una información más detallada de los métodos y propiedades disponibles se puede consultar la documentación proporcionada en formato CHM junto al código fuente de la misma.

RtfReader y SARParser

El objetivo de estas dos clases es proporcionar la posibilidad de realizar un tratamiento secuencial del documento RTF a medida que éste se va analizando.

El procedimiento general seguido para la utilización de esta técnica será el siguiente:

1. Implementar una clase derivada de SARParser donde habrá que redefinir, entre otros, los métodos correspondientes a cada uno de los eventos lanzados durante la lectura del documento RTF. Los eventos lanzados serán los siguientes:

  • Comienzo del documento.
  • Palabra de control leida.
  • Símbolo de control leido.
  • Texto leido.
  • Inicio de grupo leido.
  • Fin de grupo leido.
  • Fin del documento.

2. Crear una instancia de las clases RtfReader y de la clase anterior. El objeto RtfReader se encargará de cargar el documento y comenzar su lectura. En el constructor de éste se pasará como parámetro el objeto derivado de SARParser, de forma que le estamos indicando a RtfReader qué acciones tomar cada vez que se lance un evento determinado.

3. Comenzar la lectura del documento llamando al método Parse() del objeto RtfReader.

Enlaces relacionados

Especificación formato RTF versión 1.6 [http://latex2rtf.sourceforge.net/rtfspec.html]

, , , , , ,

NRtfTree Library

NRtfTree Library is an open source .NET library written entirely in C# that may be used to manage RTF documents in your own applications. NRtfTree Library is licensed under the GNU LGPL license.

Note: If you are looking for a Java port of NRtfTree, you can have a look at JRtfTree Project.

Table of Contents

  1. Introduction
  2. NRtfTree by Example
  3. Downloads
  4. Changelog

Related Links

Introduction

RTF (Rich Text Format) is a method of encoding formatted text and graphics for easy transfer between applications. An RTF document can contain text, images, tables, lists, hyperlinks and many other text and graphic elements. In addition, RTF is the format used internally by the RichTextBox control included as part of .NET Framework. Nevertheless, RichTextBox functionality is not enough to satisfy all aspects of RTF file management, and NRtfTree will help you in this scenario.

NRtfTree will help you to:

  • Open and parse RTF files.
  • Analyze the content of RTF files.
  • Add, modify and remove document elements (i.e. text, control words, control symbols).
  • Create new RTF documents.

NRtfTree has two modes of operation:

  1. DOM-like mode: RTF documents are loaded in a tree structure and are provided several methods to traverse it, access tag contents and modify or create new nodes. This implementation requires the entire content of a document to be parsed and stored in memory.
  2. SAX-like mode: RTF file parser is implemented as an event-driven model in which the programmer provides callback methods that are invoked by the parser as part of its traversal of the RTF document.

Support Requests

, , , , , , , ,

Acabo de publicar la nueva versión 0.3.0b1 de la librería NRtfTree. Destacar que por el momento tan sólo se trata de una versión preliminar (beta) donde se han corregido algunos errores de versiones anteriores y se ha añadido alguna funcionalidad adicional que podrá sufrir cambios en betas posteriores. Los cambios más significativos son los siguientes:

  • Cambio de licencia. A partir de esta versión la librería se distribuye bajo licencia LGPL.
  • Nueva clase RtfDocument, RtfColorTable, RtfFontTable y RtfTextFormat. Pretenden facilitar la creación de documentos RTF desde cero, añadiendo fácilmente fragmentos de texto e imágenes. En esta versión preliminar se ofrece sólo un soporte básico para realizar estas funciones.
  • Clase RtfTree
    • Nueva propiedad MergeSpecialCharacters. Activando esta propiedad, si se encuentra un caracter especial (\’) éste se convertirá a un nodo de tipo texto y se intentará combinar con los nodos tipo texto adyacentes, de forma que se obtenga un único nodo.
    • Nueva propiedad Text. Devuelve el texto plano del documento.
    • Nuevo método GetEncoding(). Devuelve la codificación utilizada en el documento.
  • Clase RtfTreeNode
    • Nueva propiedad Tree. Devuelve una referencia al árbol propietario del nodo.
    • Nuevo método ToString(). Devuelve una representación textual del nodo.
    • Nuevo método InsertChild(). Inserta un nuevo nodo en cualquier posición de la lista de nodos hijos.
    • Se sustituyen los métodos SelectXXXByType() por sobrecargas de SelectXXX().
    • Nuevos métodos SelectSibling() (+3 sobrecargas). Seleccionan nodos hermanos.
  • Clase RtfNodeCollection
    • Nuevo método Insert(). Inserta un nuevo nodo en cualquier posición de la colección.
    • Nuevo método RemoveRange(). Elimina un conjunto de nodos contiguos de la colección.
  • Clase InfoGroup
    • Nuevo método ToString(). Decuelve una representación textual del nodo.
  • Bugs corregidos
    • Los nodos de tipo Group y Root no se inicializaban con ninún texto.
    • En ocasiones la propiedad RtfTreeNode.Rtf no devolvía la última llave ‘}’.
    • No se trataban correctamente los caracteres especiales ‘\’, ‘{‘ y ‘}’ como parte del texto.
    • Cuando se añade un nuevo nodo con AppendChild() o InsertChild() no se actualizaban las propiedades Root y Tree de forma recursiva.

Como siempre la nueva versión puede ser descargada desde la página principal del proyecto NRtfTree.

Espero comentarios sobre la nueva versión.

, , , , , , ,

Ya tenemos versión en C++ para la librería NRtfTree. Mil gracias a su autor, Nicolás Alonso, por el trabajo y por enviármela para su publicación.

Aún falta por implementar completamente alguna funcionalidad de la librería original, como por ejemplo los nodos especiales para el tratamiento de imágenes, pero aún así puede resultar ya muy útil para el trabajo con texto.

He preparado una página para publicar comentarios y descargas sobre esta librería, que podéis visitar pulsando aquí [CRtfTree].

, , , ,