Функции для работы с документами

Управление документами в диспетчере операционной системы



ВАЖНО Для любого пути аргумента в методах объектов pyUNO всегда используйте путь в формате URL, используемую функцию uno.systemPathToFileUrl(PATH). Примечание пользователей Windows: сегменты пути разделяются косой чертой (/).

ВНИМАНИЕ! В следующих примерах замените USER именем пользователя.

Как создать новый пустой документ


import uno

CTX = uno.getComponentContext()
SM = CTX.getServiceManager()

# Это общий блок для следующих двух примеров

def create_instance(name, with_context=False):
   if with_context:
       instance = SM.createInstanceWithContext(name, CTX)
   else:
       instance = SM.createInstance(name)
   return instance

# Чтобы открыть документ Acell, используйте этот блок:

def new_doc_acell():
   desktop = create_instance('com.sun.star.frame.Desktop', True)
   path = 'private:factory/scalc'
   doc = desktop.loadComponentFromURL(path, '_default', 0, ())
   return

# Чтобы открыть документ AText, используйте этот блок:

def new_doc_atext():
   desktop = create_instance('com.sun.star.frame.Desktop', True)
   path = 'private:factory/swriter'
   doc = desktop.loadComponentFromURL(path, '_default', 0, ())
   return

# Завершите макрос следующей строкой:

g_exportedScripts = (new_doc_acell, new_doc_atext)


Для других типов документов используйте аргумент path:
  • AConcept: simpress
  • AGraph: sdraw
  • AMath: smath


Создание и закрытие нового документа в режиме скрытого отображения

Эта функция создает новый документ в режиме скрытого отображения, выводит его заголовок в окне сообщения и затем закрывает его

from com.sun.star.beans import PropertyValue

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

Открыть

ВАЖНО Помните, всегда используйте путь к файлу в формате URL.

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

  • Открыть с аргументами

from com.sun.star.beans import PropertyValue

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

  • Другие общие аргументы

args = {'Hidden': True}
args = {'ReadOnly': True}
args = {'Preview': True}

# Чтобы активировать макросы внутри документа
args = {'MacroExecutionMode': 4}

# Открыть документ из шаблона (True) или открыть шаблон для редактирования (False).
args = {'AsTemplate': True}


Перебрать все открытые документы


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

Получить текущий документ

doc = XSCRIPTCONTEXT.getDocument()
msgbox(doc.Title)

# Другой способ сделать то же самое:

desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.getCurrentComponent()
msgbox(doc.Title)


Экспорт в PDF

Посмотрите дополнительные параметры экспорта в PDF данные фильтра экспорта

  • Экспорт документа ACell в формат 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/acell.pdf')
   doc = XSCRIPTCONTEXT.getDocument()
   args = {
       'FilterName': 'calc_pdf_Export',
   }
   args = dict_to_property(args)
   doc.storeToURL(path_pdf, args)
   return

  • Экспорт с другими параметрами
def main():
   path_pdf = uno.systemPathToFileUrl('/home/mau/acell.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

Управление документами в AlterOffice


Получить тип документа



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


Установить фокус для текущего документа


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

Сделать документ видимым или скрытым


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

Установить коэффициент масштабирования для документа


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

ImplementationName выделенного объекта


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

Управление в строке состояния


  • Попробуйте этот код

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)
   # Важен путой  статус бар
   statusbar.end()
   return

  • Вы не можете ничего просмотреть, потому что выполнение заблокировано.

А теперь попробуйте это


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

Ниже предлагаем вам примеры макросов

  • Создание и закрытие нового документа в режиме скрытого отображения

Смотрите вложение к данной статье (файл new_document_in_hidden.py)

  • Открыть документ с аргументами

Смотрите вложение к данной статье (файл open_document_with_pass.py)

  • Перебрать все открытые документы

Смотрите вложение к данной статье (файл view_name_message.py)
Прикреплённые файлы
new_document_in_hidden.py
404kb
open_document_with_pass.py
404kb
view_name_message.py
404kb