2011-03-31 17 views
6

He estado usando PHPWord para la generación de archivos docx. Y ha estado funcionando genial. Pero ahora tengo la necesidad de poner a disposición algunos de esos archivos en una versión en pdf.Docx to pdf usando openoffice sin cabeza demasiado lento

Después de algunas investigaciones encontré PyODConverter que usan OOo. Parecía una buena opción, ya que no quiero depender de servicios web de terceros. Lo probé en mi máquina y funciona con una multa, por lo que también lo he aplicado en mi servidor. Me llevó un poco más de tiempo, pero también pude hacerlo funcionar allí.

Sin embargo, hay un (mal) problema. En el servidor esto toma alrededor de 21 segundos para hacerlo, mientras que en mi máquina no lleva más tiempo que 2. :( Esto es demasiado tiempo para mis necesidades, así que he estado tratando de detectar lo que podría estar causando este retraso. Iniciando openoffice en modo healess con la creación de socket está bien Así que he estado buscando en el script python tratando de averiguar qué instrucción podría estar causando la desaceleración. Lo he reducido a esta línea:

context = resolver.resolve("uno:socket,host=127.0.0.1,port=8100;urp;StarOffice.ComponentContext") 

Esta es la acción que está teniendo sobre 20Segs para ejecutar el código en el que se inserta:.

localContext = uno.getComponentContext() 
resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext) 
try: 
    context = resolver.resolve("uno:socket,host=127.0.0.1,port=8100;urp;StarOffice.ComponentContext") 
except NoConnectException: 
    raise DocumentConversionException, "failed to connect to OpenOffice.org on port %s" % port 
self.desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context) 

¿Alguna pista sobre lo que podría estar causando este retraso? He descartado el documento que intento convertir, ya que estas operaciones ocurren antes de eso. ¿Podría ser un problema con 'uno'? ¿O tal vez otra biblioteca faltante que pueda estar causando pruebas inútiles durante la operación de resolución()?

Cualquier idea es bienvenida. :)

Saludos, inquieto

+0

¿Cuáles son las especificaciones de hardware de las dos máquinas? –

+1

Mi servidor se ejecuta en una pequeña instancia estándar de AWS. [Tipos de instancias de AWS] (http://aws.amazon.com/ec2/instance-types/) En mi máquina, CPU: AMD Athlon II X4 635 Procesador de cuatro núcleos Socket AM3 de 2.9GHz, Memoria: DIMM síncrono 1333 MHz (2 + 2GiB). Pero dudo que esto esté relacionado con el hardware .. – Restless

Respuesta

3

me las arreglo para eliminar el retardo mediante el uso de tuberías en lugar de tomas de corriente para la conexión.

context = resolver.resolve("uno:pipe,name=myuser_OOffice;urp;StarOffice.ComponentContext") 

todavía tienen un problema sin embargo ... el usuario que ejecuta el script en Python debe ser el mismo que se inicia OOo para que todo funcione bien.Por lo general, no sería un gran problema, pero estoy tratando de ejecutar Python desde mi aplicación web y todavía no lo pude hacer funcionar. estoy tratando con algo como esto:

exec('sudo -u#1000 -s python path/to/DocumentConverter.py filename.docx filename.pdf'); 

me estoy haciendo nada de esto .. y yo no entiendo por qué. ¿Tal vez el usuario (www-data) que ejecuta exec() no tiene permiso para ejecutar sudo?

+2

Eso fue todo. Hice que www-data sea sudoer y todo está funcionando bien ahora. Gracias a todos los que intentaron ayudar. :) – Restless

+0

¿dónde encontraste la documentación de 'uno: pipe'? Todavía estoy buscando, pero no encuentro nada. –

+0

Mi problema parece ser que DocumentConverter.py no puede encontrar el conducto con nombre. ¿Puede proporcionar más detalles sobre cómo creó su tubería y pegar el script de openoffice de su otra respuesta? –

2

Tal vez la resolución de nombres en el servidor no sabe localhost (lo que sería muy extraño, pero 20 segundos suena como un tiempo de espera de DNS). Podría intentar reemplazarlo con 127.0.0.1.

Alternativamente, quizás está haciendo bien la búsqueda, recuperando direcciones IPv6 e IPv4 para localhost, tratando de hacer la conexión a través de IPv6 y fallando (es decir, es posible que el componente no admita IPv6 o no se una a esa interfaz predeterminado) y solo luego volver a caer en IPv4. En ese caso, el remedio sería el mismo: reemplace localhost con 127.0.0.1.

+1

Hola kindall. Ya he intentado usar 127.0.0.1 en lugar de _localhost_. Y de hecho, fue entonces cuando obtuve el 21sec, cuando estaba usando _localhost_ tardé aún más (alrededor de 27/28). – Restless

+1

Interesante. Bueno, 20 segundos todavía me suena como un tiempo de espera de red (especialmente porque utilizar 127.0.0.1 en lugar de localhost ayudó). ¿Es posible que OOo intente conectarse en algún lugar al inicio (por ejemplo, para buscar actualizaciones) pero su servidor no está configurado para permitir eso? Me gustaría ver qué tipo de conexiones de red están abiertas durante el proceso de conversión. – kindall

2

Es una lástima que la oficina abierta sea tan pesada. También lo estaba considerando, pero luego encontré una solución más ligera que es abiword.

Tuve que generar las vistas previas de 4 primeras páginas del documento cargado. Esto es lo que hice:

abiword document.doc --to=ps --exp-props="pages:1-4" 
gs -q -dNOPAUSE -dBATCH -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r72 -sDEVICE=pnggray -sOutputFile=preview%d.png document.ps 

por lo que puede conseguir el abiword reciente y probar algo como esto:

abiword document.docx --to=pdf 
+1

Hola. Ya probé abiword, pero excluye las imágenes de encabezado en mis documentos. : | – Restless