Generar un documento RTF simple (sin tablas ni imágenes, por ejemplo) pero con cosas interesantes (fuentes, colores, párrafos, incluso estilos!) es muy fácil.
En inglés hay una pequeña guía en http://search.cpan.org/~sburke/RTF-Writer/lib/RTF/Cookbook.pod, pero no llega a meterse en estilos. También está la especificación completa del formato RTF en la web de Microsoft. Yo necesitaba algo intermedio, y no parece haber guías en castellano, así que aquí está lo que he aprendido y estoy usando.
Detalles interesantes:
RTF es una especie de lenguaje de markup. Hay quien lo compara con TeX. Así que si el RTF se construye con algo cuidado, será bastante legible al abrirlo como texto plano.
Mi RTF necesitaba estilos porque contiene cosas de diferentes fuentes, que quiero poder mantener con formatos diferentes. (Si usas Word o similares con alguna regularidad y no sabes lo que son los estilos, deja esto y dedica un par de minutos a enterarte, porque te simplificará la vida enoooormemente.)
Dentro del RTF, los saltos de linea (chars 0Ah y 0Dh) son ignorados. Ayuda para mantener el texto legible en plano, e implica que tienes que usar otros mecanismos para meter saltos de línea interpretables en RTF. Yo uso párrafos, que junto a los estilos van perfectos para mi propósito.
Queda raro que haya que repetir los comandos de formato tras especificar el estilo de un párrafo (\s1\b\f1\sb200), pero la especificación avisa de que "puede ser necesario", y Word, Wordpad y SimpleText (Mac) lo necesitan. Curiosamente, para OpenOffice, basta con el estilo (\s1). Los demás, si no pones los comandos de formato, muestran el texto con estilo aplicado pero sin formato.
{\rtf1\ansi
La cabecera. Word 2007 aún usa RTF 1.9, que usa sintaxis RTF 1.
{\fonttbl {\f1 \froman\fprq2 Times New Roman;}{\f2 \fmodern\fprq1 Courier New;}}
La tabla de fuentes. f1 será una fuente serif, de ancho variable, a ser posible Times New Roman. f2 será una fuente modern (ancho fijo), re-especifico ancho fijo, a ser posible Courier New.
{\colortbl;\red255\green0\blue0;}
Tabla de colores. El color 0 queda sin especificar, gracias al primer ";" (o sea, color auto). El color 1 es rojo.
{\stylesheet {\s1 \sqformat\sautoupd\spriority1 \b\f1\sb200 Estilo 1;}{\s3 \sqformat\sautoupd\spriority1 \f2\cf1 Estilo 3;}}
Tabla de estilos. s1 usará la fuente 1 en bold, con un tamaño de 200 twips (=10 puntos), y se llamará "Estilo 1". s3 usará la fuente 2, en (front) color 1, y se llamará "Estilo 3". He saltado s2 porque sí: no es necesario usarlos en orden.
sqformat hará que el nombre del estilo aparezca en la Ribbon de Quick Styles de Word 2007. sautoupd activa el autoupdate de estilos, para que incluso la gente que no sabe lo que son los estilos tenga la oportunidad de beneficiarse de ellos. spriority1 hace que los estilos aparezcan entre los primeros de la lista.
{\pard \s1\b\f1\sb200Una linea en estilo 1\par}
{\pard y \par} delimitan los párrafos y sus estilos. En realidad, la cosa es más complicada, pero si estás leyendo esta guía es que no quieres líos.
Tras abrir el párrafo, especifico el estilo con \s1, y después repito la especificación del formato. Después ya viene el texto, que podría llevar más comandos de formato. Por ejemplo, \b y \b0 activan y desactivan la negrita.
{\pard \s3\f1\sb200\cf1Una linea en estilo 3\par}{\pard \s1\b\f1\sb200Otra linea en estilo 1\par}
Esto ya debería ser inteligible sin más.
}
…y cerramos la primera llave, la de la cabecera. Ya tenemos un documento completo.
En las especificaciones completas hay muchísima más información, naturalmente. De hecho puede ser mejor no usar la última especificación, porque cada revisión ha añadido montones de cosas nuevas, y de todas formas es muy posible que lo que interesa sean cosas relativamente básicas (y no tablas anidadas, por poner un ejemplo). Las primeras versiones de la especificación son rápidas de asimilar (http://www.snake.net/software/RTF/). Pero por ejemplo Word 2007 y su dichosa Ribbon y sus dichosos Quick Styles cambian un poco el juego y hacen necesario llegar a la última especificación.
Tengo escrito esto desde hace meses, y quería haberlo arreglado o añadido algo más; pero dejé de usar RTF hace mucho, así que las probabilidades de que esto avance son pocas. Así que mejor lo publico antes de que el bitrot haga presa.
Le agradezco mucho su post, me aclaro totalmente las dudas de los estilos de parrafo.
ReplyDeleteAl final el ejemplo completo queda asi
{\rtf1\ansi
{\fonttbl {\f1 \froman\fprq2 Times New Roman;}{\f2 \fmodern\fprq1 Courier New;}}
{\colortbl;\red255\green0\blue0;}
{\stylesheet {\s1 \sqformat\sautoupd\spriority1 \b\f1\sb200 Estilo 1;}{\s3 \sqformat\sautoupd\spriority1 \f2\cf1 Estilo 3;}}
{\pard \s3\f1\sb200\cf1
Una linea en estilo 3
\par}{\pard \s1\b\f1\sb200
Otra linea en estilo 1
\par}
}