Reparando un archivo de openOffice/LibreOffice

Hace un par de meses me encontré un viejo disco de respaldo y en él, unos documentos de openOffice que no abrían, daba un error de mal-formado y se cerraban (eran unas hojas de cálculo) de tal manera que intenté repararlo de una manera manual, para ver que “aprendo”.

Un documento ODF: diseccionado

Pantallazo

Un archivo ODF es simplemente una estructura de directorio contenida dentro de un archivo comprimido con un algoritmo zlib, de tal manera que podemos usar cualquier herramienta de descompresión para abrirlo y ver su contenido.

Las imágenes adjuntas al documento están en la carpeta “Pictures”, el contenido del mismo en un archivo XML formato ODF llamado “content.xml”, la configuración como formato de página y parrafo están en “settings.xml” y los estilos definidos por el usuario están en “styles.xml”.

Analizando el archivo XML

Para descomprimirlo, simplemente le dije “Extraer Aquí” con el botón derecho en mi navegador de archivos Nautilus, para quienes no vean la opción “Extraer Aquí” o usen otro sistema, imagino tendrán que cambiar la extensión a .ZIP y ya renombrado podrán descomprimirlo.

Utilizando la herramienta XMLLINT (es parte del paquete libxml2-utils), pude observar con claridad el error que presentaba el archivo content.xml, este decía:

xmllint content.xml

Y la respuesta fue:

content.xml:2: parser error : Attribute table:end-cell-address redefined
0.36cm” table:end-y=”0.491cm” draw:z-index=”4″ table:number-columns-repeated=”4″
^
content.xml:2: parser error : Attribute table:end-x redefined
0.36cm” table:end-y=”0.491cm” draw:z-index=”4″ table:number-columns-repeated=”4″

Aparecen atributos redefinidos (una etiqueta dos veces mal puesta), al parecer el analizador XML de OpenOffice 1.2 era “menos estricto” qué el de LibreOffice 4, asi que utilicé la herramienta para “darle un mejor formato” para luego utilizar un editor XML para reparar el daño.

xmllint --memory --format --xinclude --recover content.xml > content.xml.edit

Al crear el archivo “.edit” y ejecutar xmllint vemos que este archivo sigue teniendo atributos redefinidos,

Lo bueno es que al estar formateado correctamente, es más fácil encontrar la línea, ejemplo usando “XML Copy Editor” o Geany, vim e incluso “sed”.

Ejemplo, podría reparar el error en la línea 2114 usando sed únicamente:

sed -ie '2114s/table:end-x="0.36cm" table:end-y="0.491cm" draw:z-index="4"/ /'  content.xml.edit

Ya por último, arreglados las etiquetas XML con problemas, xmllint ya no retornará nada (indicando que el archivo está completamente corregido), reemplazamos content.xml con content.xml.edit, volvemos a comprimir la carpeta utilizando algoritmo ZIP y listo!, habrán arreglado cualquier detalle de su documento ODF.

Acerca de phenobarbital

http://about.me/phenobarbital

Publicado el 2 abril 2013 en Blogeando!, La nota del día, PlanetaLinux. Añade a favoritos el enlace permanente. Deja un comentario.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: