Macro/Guida a Python/Documenti

    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:

    ⇐ Ritorna all'indice


    Gestione dei Documenti all'interno del gestore dei file del sistema operativo

    IMPORTANTE: ogni volta che passate un percorso come argomento di un metodo di un oggetto pyUNO, indicate il percorso in formato URL; potete convertirlo da percorso di sistema a URL usando la funzione uno.systemPathToFileUrl(PATH) Nota per gli utenti di Windows: nei percorsi le cartelle sono separate da uno slash (/).

    ATTENZIONE Negli esempi che seguono, sostituite USER con il vostro nome utente effettivo.

    Nuovo documento vuoto

    import uno
    
    
    CTX = uno.getComponentContext()
    SM = CTX.getServiceManager()
    
    # Questo è un blocco comune ai due esempi che seguono
    
    def create_instance(name, with_context=False):
        if with_context:
            instance = SM.createInstanceWithContext(name, CTX)
        else:
            instance = SM.createInstance(name)
        return instance
    
    
    # Per aprire un documento di Calc usate questo blocco:
    
    def new_doc_calc():
        desktop = create_instance('com.sun.star.frame.Desktop', True)
        path = 'private:factory/scalc'
        doc = desktop.loadComponentFromURL(path, '_default', 0, ())
        return
    
    
    # Per aprire un documento di Writer usate questo blocco:
    
    def new_doc_writer():
        desktop = create_instance('com.sun.star.frame.Desktop', True)
        path = 'private:factory/swriter'
        doc = desktop.loadComponentFromURL(path, '_default', 0, ())
        return
    
    # Terminate la  macro con la seguente riga:
    
    g_exportedScripts = (new_doc_calc, new_doc_writer)


    • Per altri tipi di documento usate l'argomento path:
    • Impress: simpress
    • Draw: sdraw
    • Math: smath

    ATTENZIONE: Copiate o importate la funzione msgbox dalle Funzioni utili

    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

    • Per un nuovo database di Base usate:

    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

    Apri

    IMPORTANTE

    • Ricordatevi di usare sempre i percorsi dei file in formato URL.

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

    • Apri con degli argomenti

    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

    • Altri argomenti comunemente usati

    args = {'Hidden': True}
    args = {'ReadOnly': True}
    args = {'Preview': True}
    
     # per attivare le macro all'interno del documento 
    args = {'MacroExecutionMode': 4}
    
    # Per aprire un documento da un modello (True), oppure per aprire un modello per modificarlo (False). 
    args = {'AsTemplate': True}

    Iterazione su tutti i documenti aperti

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

    Selezionare il documento corrente

    doc = XSCRIPTCONTEXT.getDocument()
    msgbox(doc.Title)
    
    # Un altro modo per ottenere lo stesso effetto:
    
    desktop = create_instance('com.sun.star.frame.Desktop', True)
    doc = desktop.getCurrentComponent()
    msgbox(doc.Title)

    Esportare in PDF

    Potete trovare maggiori informazioni sulle possibili opzioni in Filtro dati per l'esportazione in PDF

    • Esportare documenti di Calc in 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

    • Esportare con altre opzioni

    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


    Gestione del documento all'interno di LibreOffice

    Ottenere il tipo di documento

    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

    Impostare il focus sul documento attivo

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

    Rendere visibile il documento o nasconderlo

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

    Impostare il fattore di zoom per un documento

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

    Ottenere la selezione corrente

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

    Gestione della barra di stato

    • Provate questo codice

    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

    • Non potete vedete nulla perché l'esecuzione è bloccata.

    Ora provate così.

    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

    ⇐ Ritorna all'indice