Domanda

Beh, sto testando il mio programma jython, che fa un po 'di [" .xls " ;, " .doc " ;, " .rtf quot ;, " .tif " ;, " .tiff " ;, " .pdf " file] - > pdf (file intermediario) - > conversione tif (output finale) tramite Open Office. Ci siamo allontanati da MS Office a causa dei problemi con l'automazione. Ora sembra che abbiamo buttato giù molte bottiglie per mostrare errori di tappo con una bottiglia rimasta. OO si blocca dopo un po '.

Succede dove vedi questa linea '< < < < < < < < ; lt &; lt &; lt &; <' nel codice

Qual è il modo corretto per me di gestire un processo Open Office bloccato. potresti per favore fornire link utili e darmi un buon suggerimento sulla via d'uscita.
Anche un'altra domanda.

Riepilogo:
* Come gestire un'istanza di Open Office bloccata?
* Come effettuare la conversione con java senza testa, quindi non ho una GUI che appare continuamente sprecando memoria.
* saranno apprezzati anche eventuali suggerimenti generali sulla qualità del codice, ottimizzazioni e standard generali di codifica.


Traceback (ultimo dentro):
  File & Quot; dcmail.py & Quot ;, riga 184, in?
  File & Quot; dcmail.py & Quot ;, riga 174, nella pagina principale
  File & Quot; C: \ DCMail \ digestemails.py & Quot ;, riga 126, in process_inbox
  File & Quot; C: \ DCMail \ digestemails.py & Quot ;, riga 258, in _convert
  File & Quot; C: \ DCMail \ digestemails.py & Quot ;, riga 284, in _choose_conversion_type
  File & Quot; C: \ DCMail \ digestemails.py & Quot ;, riga 287, in _open_office_convert
  File & Quot; C: \ DCMail \ digestemails.py & Quot ;, riga 299, in _load_attachment_to_convert
com.sun.star.lang.DisposedException: java.io.EOFException
        at 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 per chiarire questa eccezione viene generata solo quando uccido il processo di ufficio aperto. In caso contrario, il programma attende solo il completamento dell'ufficio aperto. Indefinitamente


Il codice (con tag di codice non funzionali)

[codice]

  
#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]

È stato utile?

Soluzione

La soluzione icky è quella di avere un monitor per il processo OpenOffice. Se il tuo monitor conosce il PID e ha i privilegi, può ottenere il tempo della CPU usato ogni pochi secondi. Se OO si blocca in uno stato di stallo (non più CPU), il monitor può ucciderlo.

Il modo più semplice per gestirlo è avere il " wrapper " che si sta scatenando dall'ufficio aperto guardalo mentre è in esecuzione e uccidilo quando si blocca. Il processo genitore deve comunque attendere, quindi può anche monitorare.

Se OpenOffuce si blocca in un ciclo, è più difficile individuare. La CPU di solito passa attraverso il tetto, rimane lì e la priorità scende alla priorità più bassa possibile. Elaborazione o sospensione? Chiamata di giudizio. Devi lasciarlo sospeso così per & Quot; un po '& Quot; (scegli una durata casuale, ad esempio 432 secondi (3 dozzine di dozzine); indovinerai sempre te stesso.)

Altri suggerimenti

OpenOffice.org ha un " -headless " parametro per eseguirlo senza una GUI. Non sono sicuro che questo in realtà libera tutte le risorse che verrebbero spese sulla GUI. Ecco come eseguo la mia istanza senza testa sul lato server:

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

Non so cosa sta causando i problemi di stallo del tuo script Python, ma potresti voler dare un'occhiata a PyODConverter , e vedi cosa fa questo script in modo diverso per rilevare l'errore che causa il tuo problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top