Macros/Guía de Python/Trabajo con documentos

From The Document Foundation Wiki
Jump to: navigation, search
This page is a translated version of the page Macros/Python Guide/Documents and the translation is 100% complete.


Regresar al índice

Other languages:
English • ‎español • ‎italiano • ‎日本語


Gestión de documentos con el sistema operativo

IMPORTANTE En todos los métodos y funciones de los objetos de PyUNO, para cualquier argumento que requiera una ruta a un archivo, es mejor usar la función uno.systemPathToFileUrl(PATH).

PRECAUCIÓN En los siguientes ejemplo, substituya USER con el nombre real de su usuario. Las rutas se ejemplifican en sistemas Linux. Son similares en otros sistemas.

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)
  • 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

Mire 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