Pregunta

Bueno, estoy probando mi programa jython, que hace un poco de [" .xls " ;, " .doc " ;, " .rtf quot ;, " .tif " ;, " .tiff " ;, " .pdf " archivos] - > pdf (archivo intermediario) - > conversión tif (salida final) usando Open Office. Nos mudamos de MS Office debido a los problemas que tuvimos con la automatización. Ahora parece que hemos derribado muchas botellas relacionadas con mostrar errores de tapón con una botella restante. OO se cuelga después de un rato.

Sucede donde ves esta línea '< < < < < < < < ; < < < < ' en el código

¿Cuál es la forma correcta de manejar un proceso de Open Office estancado? ¿podría proporcionar enlaces útiles y darme una buena sugerencia al salir?
También una pregunta más.

Resumen:
* ¿Cómo manejar una instancia de Open Office estancada?
* Cómo hacer la conversión con Java sin cabeza, por lo que no tengo una GUI apareciendo todo el tiempo perdiendo memoria.
* También se agradecerá cualquier sugerencia general sobre la calidad del código, las optimizaciones y los estándares generales de codificación.


Traceback (último más interno):
  Archivo & Quot; dcmail.py & Quot ;, línea 184, en?
  Archivo & Quot; dcmail.py & Quot ;, línea 174, en principal
  Archivo & Quot; C: \ DCMail \ digestemails.py & Quot ;, línea 126, en process_inbox
  Archivo & Quot; C: \ DCMail \ digestemails.py & Quot ;, línea 258, en _convertir
  Archivo & Quot; C: \ DCMail \ digestemails.py & Quot ;, línea 284, en _choose_conversion_type
  Archivo & Quot; C: \ DCMail \ digestemails.py & Quot ;, línea 287, en _open_office_convert
  Archivo & Quot; C: \ DCMail \ digestemails.py & Quot ;, línea 299, en _load_attachment_to_convert
com.sun.star.lang.DisposedException: java.io.EOFException
        en com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge $ MessageDi spatcher.run (java_remote_bridge.java:176)

com.sun.star.lang.DisposedException: com.sun.star.lang.DisposedException: java.i o.EOFException

Solo para aclarar esta excepción solo se produce cuando elimino el proceso de oficina abierta. De lo contrario, el programa solo espera a que se complete la oficina abierta. Indefinidamente


El Código (con etiquetas de código no funcionales)

[código]

  
#ghost script handles these file types  
GS_WHITELIST=[".pdf"]  
#Open Office handles these file types  
OO_WHITELIST=[".xls", ".doc", ".rtf", ".tif", ".tiff"]   
#whitelist is used to check against any unsupported files.  
WHITELIST=GS_WHITELIST + OO_WHITELIST   
  
def _get_service_manager(self):
    try:
        self._context=Bootstrap.bootstrap();
        self._xMultiCompFactory=self._context.getServiceManager()
        self._xcomponentloader=UnoRuntime.queryInterface(XComponentLoader, self._xMultiCompFactory.createInstanceWithContext("com.sun.star.frame.Desktop", self._context))
    except:
        raise OpenOfficeException("Exception Occurred with Open Office")

def _choose_conversion_type(self,fn):
    ext=os.path.splitext(fn)[1]
    if ext in GS_WHITELIST:
        self._ghostscript_convert_to_tiff(fn)
    elif ext in OO_WHITELIST:
        self._open_office_convert(fn)

def _open_office_convert(self,fn):
    self._load_attachment_to_convert(fn)
    self._save_as_pdf(fn)
    self._ghostscript_convert_to_tiff(fn)

def _load_attachment_to_convert(self, file):
    file=self._create_UNO_File_URL(file)
    properties=[]
    p=PropertyValue()
    p.Name="Hidden"
    p.Value=True
    properties.append(p)
    properties=tuple(properties) 
    self._doc=self._xcomponentloader.loadComponentFromURL(file, "_blank",0, properties) <<<<<<<<<<<<<<< here is line 299

def _create_UNO_File_URL(self, filepath):
    try:
        file=str("file:///" + filepath)
        file=file.replace("\\", "/")
    except MalformedURLException, e:
        raise e
    return file

def _save_as_pdf(self, docSource):
    dirName=os.path.dirname(docSource)
    baseName=os.path.basename(docSource)
    baseName, ext=os.path.splitext(baseName)
    dirTmpPdfConverted=os.path.join(dirName + DIR + PDF_TEMP_CONVERT_DIR)
    if not os.path.exists(dirTmpPdfConverted):
        os.makedirs(dirTmpPdfConverted)
    pdfDest=os.path.join(dirTmpPdfConverted + DIR + baseName + ".pdf")
    url_save=self._create_UNO_File_URL(pdfDest)
    properties=self._create_properties(ext)
    try:
        try:
            self._xstorable=UnoRuntime.queryInterface(XStorable, self._doc);
            self._xstorable.storeToURL(url_save, properties)
        except AttributeError,e:
                self.logger.info("pdf file already created (" + str(e) + ")")
                raise e
    finally:
        try:
            self._doc.dispose()
        except:
            raise

def _create_properties(self,ext):
    properties=[]
    p=PropertyValue()
    p.Name="Overwrite"
    p.Value=True
    properties.append(p)
    p=PropertyValue()
    p.Name="FilterName"
    if   ext==".doc":
        p.Value='writer_pdf_Export'
    elif ext==".rtf":
        p.Value='writer_pdf_Export'
    elif ext==".xls":
        p.Value='calc_pdf_Export'
    elif ext==".tif":
        p.Value='draw_pdf_Export'
    elif ext==".tiff":
        p.Value='draw_pdf_Export'
    properties.append(p)
    return tuple(properties)

def _ghostscript_convert_to_tiff(self, docSource):
    dest, source=self._get_dest_and_source_conversion_file(docSource)
    try:
        command = ' '.join([
            self._ghostscriptPath + 'gswin32c.exe',
           '-q',
           '-dNOPAUSE',
           '-dBATCH',
           '-r500',
           '-sDEVICE=tiffg4',
           '-sPAPERSIZE=a4',
           '-sOutputFile=%s %s' % (dest, source),
           ])
        self._execute_ghostscript(command)
        self.convertedTifDocList.append(dest)
    except OSError, e:
        self.logger.info(e)
        raise e
    except TypeError, (e):
        raise e
    except AttributeError, (e):
        raise e
    except:
        raise

[/ code]

¿Fue útil?

Solución

La solución icky es tener un monitor para el proceso de OpenOffice. Si su monitor conoce el PID y tiene privilegios, puede usar el tiempo de CPU cada pocos segundos. Si OO se bloquea en un estado detenido (no más CPU), entonces el monitor puede matarlo.

La forma más fácil de manejar esto es tener " wrapper " eso es disparar la tarea de oficina abierta, verlo mientras se ejecuta y matarlo cuando se cuelga. El proceso principal tiene que hacer una espera de todos modos, por lo que también puede monitorear.

Si OpenOffuce se cuelga en un bucle, entonces es más difícil de detectar. La CPU generalmente pasa por el techo, permanece allí y la prioridad cae en picado a la prioridad más baja posible. Procesando o colgado? Llamada de juicio. Tienes que dejarlo colgar así durante & "; Un rato &"; (elija una duración aleatoria, 432 segundos (3 docenas de docenas) por ejemplo; siempre se adivinará usted mismo).

Otros consejos

OpenOffice.org tiene un " -headhead " parámetro para ejecutarlo sin una GUI. No estoy seguro de que esto realmente libere todos los recursos que se gastarían en la GUI. Así es como ejecuto mi instancia sin cabeza del lado del servidor:

soffice -headless -accept="socket,port=1234;urp" -display :25

No puedo decir qué está causando los problemas de bloqueo de su script Python, pero es posible que desee consultar PyODConverter , y vea lo que este script hace de manera diferente para detectar el error que causa su problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top