miércoles, 4 de marzo de 2015

Office 2007 en Mint 64 bits con Wine

En un desarrollo reciente me encontré nuevamente con una vieja necesidad: exportar a Word. Pero esta vez no podía simplemente utilizar alguna de las múltiples librerías para PHP disponibles, ya que no se trataba de generar un documento desde cero, sino de cargar uno ya existente, realizar ciertas modificaciones, y exportarlo. Además, ese documento preexistente utilizaba muchas características de Word que simplemente no funcionaban como debían en OpenOffice. En resumen, para probar los resultados de la conversión, necesitaba un Word auténtico, y no me interesaba trabajar en simultáneo en Windows y Linux. Así que me puse manos a la obra a instalar Office en Linux.

Antes que nada, a instalar Wine y algunos paquetes opcionales:

$ sudo apt-get install wine wine-mono0.0.8 gecko-mediaplayer

Al intentar instalar Office 2010 usando el comando wine directamente no tuve suerte: casi al terminar la instalación me dio un error. Es posible que hubiera podido resolverlo con lo que sé ahora, pero en ese momento decidí que Office 2007 también me era suficiente, por lo cual me puse a instalarlo.

La instalación transcurrió perfectamente, pero al ejecutar el Word instalado descubrí para mi sorpresa que no tenía ningún soporte a XML, lo que le impedía cargar archivos .docx (lo cual era prioritario para mí) y además fallaba al cerrarse. Investigando descubrí que no se trataba de algún problema con libxml2, sino que simplemente se debía a que lo había instalado en modo 64 bits, y por algún motivo, aunque luego se lance en 32 bits, las aplicaciones no lograban encontrar la librería adecuadamente.

La solución consistió en preparar un nuevo directorio de Wine, como si fuera un nuevo ordenador, en modo 32 bits (si el directorio, aquí /home/fer/prefix32, no existe, winecfg lo creará):

$ WINEARCH=win32 WINEPREFIX=/home/fer/prefix32 winecfg

Y luego ejecutar de nuevo el setup.exe con estos parámetros:

$ WINEARCH=win32 WINEPREFIX=/home/fer/prefix32 wine setup.exe

Entonces, ya podía ejecutar el Word con:

$ WINEARCH=win32 WINEPREFIX=/home/fer/prefix32 wine /home/fer/prefix32/.../winword.exe

Ahora bien, si al final agregaba como parámetro un nombre de archivo con ruta relativa, lo abría correctamente. Si, en cambio, usaba una ruta absoluta, no lo encontraba. La solución, agregar z: al principio, por ejemplo: 'z:/home/fer/archivo.docx'.

Pero esto no resultó suficiente para archivos con espacios. Wine convierte los espacios automáticamente en %20, el código de escape estándar, y entonces Word se queja de que le han pedido abrir un archivo inexistente. La solución consiste en nuevamente modificar la ruta, indicando que se la trate como una URL, mediante el prefijo 'file:///'. Así que, si queremos abrir '/home/fer/archivo con espacio.docx', debemos suministrar el argumento 'file:///z:/home/fer/archivo con espacio.docx'.

El siguiente paso fue crear un ejecutable para no tener que recordar todo esto. Debido a que voy mejor con PHP que con Bash, creé un archivo 'winword', con permisos de ejecución, y el siguiente contenido:

#!/usr/bin/php5
<?php

$app = '/home/fer/prefix32/drive_c/Program Files/Microsoft Office/Office12/WINWORD.EXE';
$wineroot = '/home/fer/prefix32';
$args = array_slice($argv,2);
$file = @$argv[1];
if( $file ) {
    $file = '\'file:///Z:'.$file.'\'';
}
$cmd = ("WINEARCH=win32 WINEPREFIX=$wineroot wine '$app' $file ".join(" ",$args));
passthru($cmd);

Luego, sólo quedaba hacer que Chrome abriera los docx con mi ejecutable. Lamentablemente, ya tenía asociada la extensión .docx con LibreOffice, y el navegador no ofrece ningún mecanismo para cambiar esto. La respuesta es abrir un explorador de carpetas, como Nautilus o Dolphin, buscar un archivo .docx, y con el menú contextual cambiar la asociación.

Espero que esto le haya servido de ayuda a alguien. Como mínimo me servirá a mí mismo para no tener que recordar todos estos pasos cuando cambie mi ordenador!