2013-12-12 2 views
3

오픈 오피스를 사용하여 docx에서 pdf로 프로그래밍 방식으로 변환하고 싶습니다. 나는 unconv가 이것을 할 수 있다는 것을 알고 있으며 실제로 unoconv가 별도의 청취자 (unoconv -l 사용)를 실행하고 unoconv -n을 호출하더라도 (리스너에 연결할 수없는 경우 죽을 수 있음) 나를 위해이 작업을 수행 할 것입니다. 따라서 필자는 오픈 오피스/피노 환경이 정상이라고 가정합니다.pyuno로 오픈 오피스 충돌을 디버깅하는 방법

그러나 unoconv 리스너 (또는 수동으로 acceptoffor로 openoffice 호출)를 실행하고 자신의 파이썬 코드 (unoconv에서 파생되고 다른 openoffice 라이브러리와 교차 검사)로 연결하려고하면 리스너가 종료됩니다. 우노 다리는 죽는다.

내가 리스너에서 얻을 오류는 다음과 같습니다

terminate called after throwing an instance of 'com::sun::star::uno::RuntimeException' 

내가 파이썬 끝에 얻을 오류 :

unoconv: RuntimeException during import phase: 
Office probably died. Binary URP bridge disposed during call 

정말 어떻게 여기에 문제를 진단 대해 이동하는 아무 생각이 없다 . 근본적인 원인이나 진단 방법에 대한 제안은 크게 감사하겠습니다. 아래

코드 : 그에 unoconv 때

#dependency on openoffice-python 
import openoffice.streams as oostreams 
import openoffice.officehelper as oohelper 
import uno, unohelper 
from com.sun.star.beans import PropertyValue 
from com.sun.star.connection import NoConnectException 
from com.sun.star.document.UpdateDocMode import QUIET_UPDATE 
from com.sun.star.lang import DisposedException, IllegalArgumentException 
from com.sun.star.io import IOException, XOutputStream 
from com.sun.star.script import CannotConvertException 
from com.sun.star.uno import Exception as UnoException 
from com.sun.star.uno import RuntimeException 

import logging 
logger = logging.getLogger(__name__) 


#connectionstring = 'uno:socket,host=127.0.0.1,port=2002;urp;StarOffice.ComponentContext' 
connectionstring = 'socket,host=127.0.0.1,port=2002' 
## context = uno.getComponentContext() 
## svcmgr = context.ServiceManager 
## resolver = svcmgr.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", context) 

## unocontext = resolver.resolve("uno:%s" % connectionstring) 
unocontext = oohelper.connect(connectionstring) 

#unosvcmgr = unocontext.ServiceManager 
desktop = unocontext.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", unocontext) 


class OutputStream(unohelper.Base, XOutputStream): 
    def __init__(self, stream=None): 
     self.closed = 0 
     self.stream = stream if stream is not None else sys.stdout 

    def closeOutput(self): 
     self.closed = 1 

    def writeBytes(self, seq): 
     self.stream.write(seq.value) 

    def flush(self): 
     pass 

def UnoProps(**args): 
    props = [] 
    for key in args: 
     prop = PropertyValue() 
     prop.Name = key 
     prop.Value = args[key] 
     props.append(prop) 
    return tuple(props) 



FILTERS = {'pdf': 'writer_pdf_Export'} 

def convert_stream(instream, outstream, 
        outdoctype=None, outformat=None): 
    '''instream and outstream are streams. 
    outdoctype and outformat are strings. They correspond 
    to the first two parameters to the Fmt constructor.To 
    convert to pdf use outdoctype="document", 
    outformat="pdf". 
    If you choose inappropriate values, an ValueError 
    will result.''' 
    #fmts is a global object of type FmtList 

    outputfilter = FILTERS[outformat] 

    inputprops = UnoProps(Hidden=True, ReadOnly=True, UpdateDocMode=QUIET_UPDATE, InputStream=oostreams.InputStream(instream)) 
    inputurl = 'private:stream' 
    convert_worker(inputurl,inputprops,outputfilter,outstream=outstream) 
    return outstream 


def convert_worker(inputurl, inputprops, outputfilter, outstream=None,inputfn=None): 
    global exitcode 

    document = None 

    try: 
     ### Import phase 
     phase = "import" 

     document = desktop.loadComponentFromURL(inputurl , "_blank", 0, inputprops) 

     if not document: 
      raise UnoException("The document '%s' could not be opened." % inputurl, None) 

     ### Import style template 
     phase = "import-style" 

     ### Update document links 
     phase = "update-links" 
     try: 
      document.updateLinks() 
     except AttributeError: 
      # the document doesn't implement the XLinkUpdate interface 
      pass 

     ### Update document indexes 
     phase = "update-indexes" 
     for ii in range(2): 
      # At first update Table-of-Contents. 
      # ToC grows, so page numbers grows too. 
      # On second turn update page numbers in ToC. 
      try: 
       document.refresh() 
       indexes = document.getDocumentIndexes() 
      except AttributeError: 
       # the document doesn't implement the XRefreshable and/or 
       # XDocumentIndexesSupplier interfaces 
       break 
      else: 
       for i in range(0, indexes.getCount()): 
        indexes.getByIndex(i).update() 

     ### Export phase 
     phase = "export" 

     outputprops = UnoProps(FilterName=outputfilter, OutputStream=OutputStream(stream=outstream), Overwrite=True) 
     outputurl = "private:stream" 

     try: 
      document.storeToURL(outputurl, tuple(outputprops)) 
     except IOException as e: 
      raise UnoException("Unable to store document to %s (ErrCode %d)\n\nProperties: %s" % (outputurl, e.ErrCode, outputprops), None) 

     phase = "dispose" 
     document.dispose() 
     document.close(True) 

    except SystemError as e: 
     logger.error("unoconv: SystemError during %s phase:\n%s" % (phase, e)) 
     exitcode = 1 

    except RuntimeException as e: 
     logger.error("unoconv: RuntimeException during %s phase:\nOffice probably died. %s" % (phase, e)) 
     exitcode = 6 

    except DisposedException as e: 
     logger.error("unoconv: DisposedException during %s phase:\nOffice probably died. %s" % (phase, e)) 
     exitcode = 7 

    except IllegalArgumentException as e: 
     logger.error("UNO IllegalArgument during %s phase:\nSource file cannot be read. %s" % (phase, e)) 
     exitcode = 8 

    except IOException as e: 
     #   for attr in dir(e): print '%s: %s', (attr, getattr(e, attr)) 
     logger.error("unoconv: IOException during %s phase:\n%s" % (phase, e.Message)) 
     exitcode = 3 

    except CannotConvertException as e: 
     #   for attr in dir(e): print '%s: %s', (attr, getattr(e, attr)) 
     logger.error("unoconv: CannotConvertException during %s phase:\n%s" % (phase, e.Message)) 
     exitcode = 4 

    except UnoException as e: 
     if hasattr(e, 'ErrCode'): 
      logger.error("unoconv: UnoException during %s phase in %s (ErrCode %d)" % (phase, repr(e.__class__), e.ErrCode)) 
      exitcode = e.ErrCode 
      pass 
     if hasattr(e, 'Message'): 
      logger.error("unoconv: UnoException during %s phase:\n%s" % (phase, e.Message)) 
      exitcode = 5 
     else: 
      logger.error("unoconv: UnoException during %s phase in %s" % (phase, repr(e.__class__))) 
      exitcode = 2 
      pass 
+0

문제의 근본 원인은 'io.TextIOWrapper'에 의해 뒷받침되는 스트림, 즉 유니 코드 스트림과 바이트 스트림이 아닌 스트림으로 전달된다는 것입니다. – Marcin

+0

원래이 예외가 제기 된 행은 무엇입니까? – TankorSmash

+0

@TankorSmash 스택 추적이 없었기 때문에 이것이 당황했습니다. – Marcin

답변

1

이 사건이 될 수 있다면 나도 몰라,하지만 난 LogMeIn을가 (내 상자에서 실행) 발견은 포트 2002을 사용하고 있습니다 기계, 나도 같은 오류가 발생 : 이진 URP 다리는 통화하는 동안 배치. 나는 LogMeIn을 죽였고 그 이후는 모두 작동했습니다.

희망이 도움이됩니다.

+0

내 문제의 근본 원인은 위의 의견에 명시된 바와 같습니다. 그러나 그것은 pyuno 다리에 많은 허약함이 있다는 것이 분명합니다. – Marcin

관련 문제