martes, 22 de enero de 2008
Libro de OpenXML
Podrán descargar el libro en formato PDF desde aquí.
Y podrán acceder a un versión en formato docx desde aquí.
Limpiar los items recientes en Visual Studio 2005
Se trata de un add-in para borrar las entradas de los proyectos recientes en Visual Studio 2005, y no solo de los proyectos, sino también la lista de archivos recientes. La siguiente imagen muestra su uso:
Lo he probado y funciona muy bien. Pueden descargar una versión de este complemento para Visual Studio 2005 aquí. Y pueden obtener una versión beta para Orcas aquí.
miércoles, 16 de enero de 2008
Los documentos WordprocessingML
Partes de un documento WordprocessingML
Como ya hemos dicho, un documento WordprocessingML tiene muchas partes relacionadas que se almacenan dentro de un contenedor. Actualmente se utiliza el formato ZIP para empaquetar y contener un documento WordprocessingML. Si renombramos un documento .docx a .zip podremos descomprimirlo y explorar internamente cada una de las partes del documento.
Figura 1: Estructura de un documento WordprocessingML
Ests estructura es definida por la especificación Open Packaging Conventions del formato OOXML. Como se muestra en la figura, el archivo.zip contiene una estructura de carpetas y archivos XML que forman las partes del documento. El contenido principal del documento se almacena en el archivo document.xml de la carpeta word y los demás archivos .xml (fontTable.xml, settings.xml, styles.xml, webSettings.xml) contienen información de estilos, fuentes, configuración, etc. El siguiente gráfico muestra un esquema de documento WordprocessingML y sus partes relacionadas:
Figura 2: Partes de un documento WordprocessingML
En la raíz del paquete .zip existe un archivo llamado [Content_Types].xml que describe todos los tipos de contenido para cada una de las partes dentro del paquete. El Content Type indica al consumidor del documento qué tipo de contenido debe ser esperado dentro del paquete.
Si continuamos explorando el archivo .zip, veremos una carpeta llamada _rels. Esta carpeta contiene un archivo XML con extensión .rels que describe las relaciones entre las diferentes partes del documento y permite unir el documento y sus partes.
En la carpeta docProps, encontraremos varios archivos XML como core.xml, app.xml y custom.xml. Estos archivos almacenan las propiedades del documento. Por ejemplo, el archivo core.xml contiene las propiedades generales aplicacables a todos los documentos de OOXML como Título, Asunto, Autor, etc. EL archivo app.xml contiene propiedades específicas del documento como Número de páginas, Número de líneas de texto, Versión de la aplicación, etc. Finalmente, el archivo custom.xml contiene propiedades personalizadas agregadas por el autor o usuario del documento.
Archivos binarios
El formato XML no soporta nativamente los datos binarios como imágenes u objetos OLE. OOXML almacena los datos binarios en como partes binarias en su formato nativo. Si examinamos la carpeta media encontraremos las imágenes y objetos binarios que han sido incluidos en el documento.
Un documento WordprocessingML básico
Si quisiéramos crear un documento WordprocessingML básico, necesitaríamos al menos 3 partes:
- Un archivo document.xml que contiene el cuerpo principal del documento.
- Un archivo [Content_Types].xml que describe los tipos de contenidos incluidos en el paquete.
- Un archivo .rels que define las relaciones entre las diferentes partes y permite ubicar cada parte dentro del paquete.
Figura 3: Documento Wordprocessing básico
La parte de inicio, document.xml
El primer elemento al crear un documento de OOXML es la parte de inicio (start-part). Este es el lugar donde los consumidores empezarán a parsear el contenido del documento. Los 3 lenguajes de marcas principales de OOXML (WordprocessingML, SpreadsheetML, PresentationML) contienen dentro del archivo ZIP una parte considerada como la parte de inicio. En WordprocessingML la parte de inicio es el archivo document.xml y es usado para almacenar el contenido principal del documento.
La siguiente figura muestra un ejemplo del contenido de un archivo document.xml:
Figura 4: Contenido de document.xml
Se puede observar una estructura XML bastante sencilla para formar un documento. Dentro del elemento document se puede crear los bloques de construcción del documento como párrafos, tablas y gráficos. Muchos de estos elementos utilizan el mismo identificador de espacio de nombres XML. Microsoft Office 2007 utiliza el prefijo w. Podemos usar cualquier otro prefijo, pero debemos mantener el espacio de nombres XML de WordprocessingML:
http://schemas.openxmlformats.org/wordprocessingml/2006/main
Los tipos de contenidos, [Content_Types].xml
Los consumidores de OOXML necesitan saber qué tipos de contenidos existen dentro del paquete. La lista de tipos de contenidos está definida dentro del archivo [Content_Types].xml que debe estar ubicado en la raíz del contenedor.
Los tipos de contenidos se identifican de dos formas:
- Utilizando la extensión del archivo de partes dentro del paquete.
- Especificando la ubicación y tipo de contenido del archivo dentro del paquete.
Figura 5: Contenido de [Content_Types].xml
Se puede ver claramente las dos estrategias utilizadas para identificar y definir los tipos de contenidos de cada parte dentro del paquete. Dentro del elemento Types se puede crear dos elementos, Default y Override. En el ejemplo, el elemento Default asocia la extensión xml con el tipo de contenido application/xml, y de forma similar puede observarse el tipo de contenido asociado a los archivos rels y los archivos png.
Anteriormente, hablamos del archivo document.xml , que es la parte de inicio y contiene el cuerpo principal del documento. Como la extensión de este archivo es xml, el elemento default, del archivo de tipos de contenidos, indicaría que se trata de un simple archivo de tipo application/xml, sin embargo este archivo es especial y debe ser definido como tal. Para ello se utiliza el elemento Override, para sobrescribir la asociación de tipos por defecto y especificar el tipo de contenido asociado en forma explícita.
En el ejemplo, existe un elemento Override que asocia el archivo /word/document.xml con el tipo de contenido application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml. Este mismo enfoque se utiliza para definir el tipo de contenido de las partes restantes del documento.
Las relaciones entre partes
Otro elemento requerido en un documento Wordprocessing, es el archivo de relaciones entre partes. En el archivo .zip existe una carpeta _rels que contiene un archivo .rels. Este es un archivo XML que define las relaciones y ubicación de las partes principales del paquete.
La siguiente figura muestra el contenido del archivo .rels:
Figura 6: Contenido del archivo .rels
El elemento Relationship contiene tres piezas básicas de información:
- ID: Un identificador único para la relación.
- Type: define el tipo de relación.
- Target: especifica la ubicación del elemento o parte relacionada.
Debe observarse que no hay información sobre el origen (Source) de la relación. En este caso, el origen de la relación es implícito y relativo a la raíz del paquete.
Además del archivo .rels principal, dentro de la carpeta word/_rels existe un archivo document.xml.rels que define las partes relacionadas al documento.xml como el encabezado, pie, estilos y fuentes.
Utilizando el attributo type y target del archivo .rels, los consumidores de documentos OOXML pueden localizar el documento principal (start-part), y, luego, usando el archivo de relaciones asociado al documento principal (document.xml.rels), es posible ubicar el encabezado y pie, encontrar las imágenes y otras partes relacionadas al documento.
Hasta aquí hemos visto las partes principales de un documento de WordprocessingML, su formato y estructura. En la próxima entrega empezaremos a hacer ejercicios y veremos cómo crear y empaquetar esas partes en forma manual y en forma programatica, utilizando la API de Packaging (System.IO.Packaging) incluida en .NET 3.0.
martes, 15 de enero de 2008
Conociendo Office Open XML
Componentes de OOXML
Como vimos en el post anterior, Office Open XML es una especificación basada en XML para documentos digitales como planillas de cálculo, gráficos, presentaciones y documentos de procesamiento de texto. La especificación fue desarrollada por Microsoft para suceder al formato binario de Microsoft Office y fue estandarizada por la ECMA en diciembre de 2006.
En la especificación actual aparecen tres lenguajes de marcas principales:
- WordprocessingML: para documentos.
- SpreadsheetML: para hojas de cálculo.
- PresentationML: para presentaciones
Las partes de un documento OOXML son empaquetadas dentro de un contenedor. Hoy se utiliza el formato ZIP para empaquetar y contener los archivos y recursos que componen un documento, sin embargo, podría utilizarse una base de datos como contenedor de documentos OOXML.
Finalmente, además de los lenguajes de marcas, la estructura interna dentro del paquete o contenedor también ha sido estandarizada. Esta estructura se conoce como Open Packaging Convention.
El siguiente gráfico resume los elementos principales de la especificación OOXML. ZIP y XML + Unicode no son parte de la especificación.
Figura 1: Componentes de Office Open XML
En el siguiente post exploraremos el formato y estructura de documentos WordprocessingML y comprenderemos mejor la relación entre los componentes de OOXML.
¿Por qué Office Open XML?
Actualmente, la especificación está siendo evaluada por la ISO referida como DIS 29500 (Draft International Standard 29500) y se ha generado una polémica en su entorno que escapa los fines de este post.
Software + Servicios
Más allá de la polémica suscitada sobre la estandarización, muchos desarrolladores se preguntarán por qué o para qué necesito aprender OOXML. Bueno, existen muchas motivaciones para usarlo. En los siguientes enlaces encontrarán dos artículos en español interesantes que hablan acerca de los fundamentos del nuevo mundo de documentos y los formatos de Open XML: http://www.microsoft.com/spain/interop/openxml/new_world_of_docs.mspx http://www.microsoft.com/spain/interop/openxml/ds_open_xml.mspx
De las diferentes oportunidades que OOXML puede generar, la que más me ha interesado como desarrollador fue la posibilidad de construir e implementar soluciones S+S (Software + Services) combinando las soluciones de clientes ricos y soluciones móviles con servicios de Internet.
Por ejemplo, crear una solución basada en planillas de cálculo que permita generar una orden de compra y publicarla en el sistema de gestión de compras a través de Internet; o escribir un artículo en el procesador de texto y publicarlo en la web con un solo clic.
Se trata de aprovechar la flexibilidad y experiencia de usuario enriquecida proporcionada por las aplicaciones de escritorio y móbiles y combinarlas con servicios de Internet basados, por ejemplo, en el modelo SaaS. De hecho, podría arriesgar a decir que S+S intenta cubrir los aspectos que se pierden en un enfoque SaaS puro, como la experiencia de usuario enriquecida basada en soluciones de escritorio ricas, capacidad de trabajo offline, mayor aprovechamiento de la plataforma subyacente, etc.
El papel de OOXML en S+S
Resulta interesante la idea de S+S, pero ¿qué papel juega OOXML?. En el pasado ya se han construido aplicaciones capaces de generar o capturar información a través de planillas de cálculo y documentos de texto utilizando los formatos binarios de Microsoft Office y otras suites.
Entiendo que un aspecto interesante de OOXML para los desarrolladores es, por ejemplo, el soporte que ofrece Microsoft a través de .NET Framework para crear y manipular documentos de OOXML, facilitando la integración y construcción de soluciones S+S.
Muchos aún discuten que OOXML no es estándar, que no es abierto, que no es XML, etc. Pero la realidad es que la mayoría de las empresas en el mundo centran su trabajo en el uso de documentos electrónicos. Aplicaciones como Excel y Word, se han convertido en la herramienta principal o preferida para registrar, visualizar, manipular y publicar datos. Estos escenarios basados en documentos representan nuevas oportunidades para complementar, interoperar y extender nuestros productos y servicios.
En los próximos post empezaré a explorar este nuevo mundo de Open XML desde la perspectiva del desarrollador; veremos la teoría y crearemos ejemplos en .NET.
Hasta la próxima!