Macros/Guía de Python/Trabajo con documentos

    From The Document Foundation Wiki
    This page is a translated version of the page Macros/Python Guide/Documents and the translation is 100% complete.
    Other languages:

    ⇐ Volver al índice


    Gestión de documentos con el sistema operativo

    IMPORTANTE Para cualquier argumento de rutas en métodos de objetos pyUNO, use siempre la ruta en formato URL, use la función uno.systemPathToFileUrl(PATH). Nota para los usuarios de Windows: los segmentos de la ruta están separados por una barra inclinada (/).

    PRECAUCIÓN En los siguientes ejemplos, sustituya USUARIO por su nombre de usuario real.

    Nuevo documento en blanco

    import uno
    
    
    CTX = uno.getComponentContext()
    SM = CTX.getServiceManager()
    
    # El siguiente es un bloque de código común a los dos siguientes ejemplos
    
    def create_instance(name, with_context=False):
        if with_context:
            instance = SM.createInstanceWithContext(name, CTX)
        else:
            instance = SM.createInstance(name)
        return instance
    
    
    # Para abrir un documento de Calc use el siguiente bloque de código
    
    def new_doc_calc():
        desktop = create_instance('com.sun.star.frame.Desktop', True)
        path = 'private:factory/scalc'
        doc = desktop.loadComponentFromURL(path, '_default', 0, ())
        return
    
    
    # Para abrir un documento de Writer use el siguiente bloque de código
    
    def new_doc_writer():
        desktop = create_instance('com.sun.star.frame.Desktop', True)
        path = 'private:factory/swriter'
        doc = desktop.loadComponentFromURL(path, '_default', 0, ())
        return
    
    # Finalice la macro con la siguiente línea de código:
    
    g_exportedScripts = (new_doc_calc, new_doc_writer)


    Para crear otro tipo de documento, debe usar, respectivamente, al final del argumento path:

    • Impress: simpress
    • Draw: sdraw
    • Math: smath
    • Impress: simpress
    • Draw: sdraw
    • Math: smath

    PRECAUCIÓN En estos ejemplos se usa la función msgbox. Cópiela desde Funciones útiles o impórtela en su macro.

    from com.sun.star.beans import PropertyValue
    
    
    def new_doc_args():
        desktop = create_instance('com.sun.star.frame.Desktop', True)
        path = 'private:factory/sdraw'
        args = (PropertyValue(Name='Hidden', Value=True),)
        doc = desktop.loadComponentFromURL(path, '_default', 0, args)
        msgbox(doc.Title)
        doc.close(True)
        return

    • Para abrir un nuevo documento Base use:

    def new_db():
        path = uno.systemPathToFileUrl('/home/USER/newdb.odb')
        dbc = create_instance('com.sun.star.sdb.DatabaseContext')
        db = dbc.createInstance()
        db.URL = 'sdbc:embedded:firebird'
        db.DatabaseDocument.storeAsURL(path, ())
        return

    Abrir un documento ya existente

    IMPORTANTE Recuerde siempre usar la ruta al archivo en formato URL.

    path = uno.systemPathToFileUrl('/home/USER/calc.ods')
    desktop = create_instance('com.sun.star.frame.Desktop', True)
    doc = desktop.loadComponentFromURL(path, '_default', 0, ())

    • Abrir un documento con los argumentos más comunes

    from com.sun.star.beans import PropertyValue
    
    def open_args():
        path = uno.systemPathToFileUrl('/home/USER/writer.odt')
        desktop = create_instance('com.sun.star.frame.Desktop', True)
        args = (PropertyValue(Name='Password', Value='letmein'),)
        doc = desktop.loadComponentFromURL(path, '_default', 0, args)
        return

    • Abrir un documento con otros argumentos posibles

    args = {'Hidden': True}
    args = {'ReadOnly': True}
    args = {'Preview': True}
    
     # Para que se activen las macros del documento 
    args = {'MacroExecutionMode': 4}
    
    # Para abrir un documento a partir de una plantilla (True), o para abrir una plantilla para su edición (False) 
    args = {'AsTemplate': True}

    Iterar sobre todos los documentos abiertos

    desktop = create_instance('com.sun.star.frame.Desktop', True)
    for doc in desktop.getComponents():
        msgbox(doc.Title)

    Obtener el documento activo

    doc = XSCRIPTCONTEXT.getDocument()
    msgbox(doc.Title)
    
    # Otra manera de hacer lo mismo que arriba:
    
    desktop = create_instance('com.sun.star.frame.Desktop', True)
    doc = desktop.getCurrentComponent()
    msgbox(doc.Title)

    Exportación a PDF

    Consulte más opciones disponibles para la exportación en Opciones del filtro de exportación a PDF

    • Exportar un libro de Calc como PDF

    from com.sun.star.beans import PropertyValue
    
    
    def dict_to_property(values, uno_any=False):
        ps = tuple([PropertyValue(Name=n, Value=v) for n, v in values.items()])
        if uno_any:
            ps = uno.Any('[]com.sun.star.beans.PropertyValue', ps)
        return ps
    
    
    def main():
        path_pdf = uno.systemPathToFileUrl('/home/mau/calc.pdf')
        doc = XSCRIPTCONTEXT.getDocument()
        args = {
            'FilterName': 'calc_pdf_Export',
        }
        args = dict_to_property(args)
        doc.storeToURL(path_pdf, args)
        return

    • Un ejemplo de exportación con otras opciones

    def main():
        path_pdf = uno.systemPathToFileUrl('/home/mau/calc.pdf')
        doc = XSCRIPTCONTEXT.getDocument()
        args = {
            'EncryptFile': True,
            'DocumentOpenPassword': 'letmein',
        }
        filter_data = dict_to_property(args, True)
        args = {
            'FilterName': 'calc_pdf_Export',
            'FilterData': filter_data,
        }
        args = dict_to_property(args)
        doc.storeToURL(path_pdf, args)
        return


    Gestión de documentos dentro de LibreOffice

    Conocer el tipo de documento activo

    def get_type_doc(doc):
        TYPE_DOC = {
            'calc': 'com.sun.star.sheet.SpreadsheetDocument',
            'writer': 'com.sun.star.text.TextDocument',
            'impress': 'com.sun.star.presentation.PresentationDocument',
            'draw': 'com.sun.star.drawing.DrawingDocument',
            'base': 'com.sun.star.sdb.DocumentDataSource',
            'math': 'com.sun.star.formula.FormulaProperties',
            'basic': 'com.sun.star.script.BasicIDE',
        }
        for k, v in TYPE_DOC.items():
            if doc.supportsService(v):
                return k
        return ''
    
    
    def main():
        doc = XSCRIPTCONTEXT.getDocument()
        msgbox(get_type_doc(doc))
        return

    Establecer el foco para el documento activo

    doc = XSCRIPTCONTEXT.getDocument()
    win = doc.getCurrentController().getFrame().getComponentWindow()
    win.setFocus()

    Mostrar u ocultar el documento

    doc = XSCRIPTCONTEXT.getDocument()
    win = doc.getCurrentController().getFrame().getComponentWindow()
    win.setVisible(False)
    msgbox(doc.Title)
    win.setVisible(True)

    Establecer el factor de ampliación para ver el documento

    doc = XSCRIPTCONTEXT.getDocument()
    doc.getCurrentController().ZoomValue = 150

    Obtener la selección activa

    doc = XSCRIPTCONTEXT.getDocument()
    sel = doc.getCurrentSelection()
    msgbox(sel.ImplementationName)

    Gestión en la barra de estado

    • Intente con este código

    from time import sleep
    
    
    def main():
        doc = XSCRIPTCONTEXT.getDocument()
        statusbar = doc.getCurrentController().getStatusIndicator()
        statusbar.start('Line', 10)
        for i in range(10):
            statusbar.setValue(i)
            sleep(1)
        # ~ Is important free status bar
        statusbar.end()
        return

    • No verá ningún cambio o movimiento porque la ejecución está bloqueada.

    Ahora pruebe este otro código.

    import threading
    from time import sleep
    
    
    def run_in_thread(fn):
        def run(*k, **kw):
            t = threading.Thread(target=fn, args=k, kwargs=kw)
            t.start()
            return t
        return run
    
    
    @run_in_thread
    def update_status_bar(statusbar, text, limit):
        statusbar.start(text, limit)
        for i in range(limit):
            statusbar.setValue(i)
            sleep(1)
        # ~ Is important free status bar
        statusbar.end()
        return
    
    
    def main():
        doc = XSCRIPTCONTEXT.getDocument()
        statusbar = doc.getCurrentController().getStatusIndicator()
        update_status_bar(statusbar, 'Line', 10)
        return

    ⇐ Volver al índice