Выровнять документы, отправленные по почте, перед выводом - PullRequest
0 голосов
/ 23 ноября 2018

У меня проблема с почтовыми файлами, созданными с использованием сценария python uno.Запуск mailmerge внутри самого LibreOffice с помощью мастера mailmerge работает так, как в скрытых полях, а другие поля в документе сглаживаются / выполняются, а полученный документ имеет правильный окончательный сглаженный вывод.

В отличие от этого при запуске сПриведенный ниже код представляет собой серию выходных документов, в которых все еще есть коды полей, а скрытые абзацы по-прежнему видны.Каждый документ настроен на соответствующую строку базы данных mailmerge, так же, как я получаю предварительный просмотр в LibreOffice при настройке Mailmerge.При открытии этих документов на другом компьютере данные не отображаются, так как для получения полевых данных сначала необходим доступ к внутренней базе данных.

Если в моем сценарии я установил SaveFilter, скажем, «HTML (StarWriter)» или «writer_pdf_export», то он сгладит файл, но не удалит скрытые абзацы из вывода.

Не могли бы вы помочь мне воспроизвести способ, которым LibreOffice выполняет почтовое слияние, но с использованием интерфейса uno python?

import uno

def mergeit():
    localContext = uno.getComponentContext()
    resolver = localContext.ServiceManager.createInstanceWithContext(
        "com.sun.star.bridge.UnoUrlResolver", localContext )
    ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
    smgr = ctx.ServiceManager
    oMailMerge = smgr.createInstanceWithContext( "com.sun.star.text.MailMerge",ctx)
    oMailMerge.DocumentURL = "file:////home/user/templates/testtemplate.odt"  #Source document (forward slashes only)
    oMailMerge.DataSourceName = "jdbcpostgresmailmerge" #name of data source (included in source document)
    oMailMerge.CommandType = 0                                 #0 = table name, 1 = query name, 3 = SQL command
    oMailMerge.Command = "public.mailmergedata"                #name of table in data source
    oMailMerge.OutputType = 2                                  #1 = printer, 2 = file, 3 = email
    oMailMerge.OutputURL = uno.systemPathToFileUrl("/home/user/output/")    #output directory (forward slashes only)
    oMailMerge.SaveFilter = "writer8"
    oMailMerge.FileNameFromColumn = True       #get file name from data source column
    oMailMerge.FileNamePrefix = "mergefilename"      #name of data source column
    oMailMerge.SaveAsSingleFile = False        #save as multiple files
    oMailMerge.execute([])
    # Do a nasty thing before exiting the python process. In case the
    # last call is a oneway call (e.g. see idl-spec of insertString),
    # it must be forced out of the remote-bridge caches before python
    # exits the process. Otherwise, the oneway call may or may not reach
    # the target object.
    # I do this here by calling a cheap synchronous call (getPropertyValue).
    ctx.ServiceManager

def main():
    mergeit()

if __name__ == '__main__':
    main()

Система работает под управлением LibreOffice 6.0.6.2 в Ubuntu 18 x64

Вот какЯ запускаю LibreOffice перед вызовом моего скрипта:

libreoffice --headless --accept="socket,host=localhost,port=2002;urp;"

1 Ответ

0 голосов
/ 24 ноября 2018

Это скорее обходной путь, чем настоящее решение.Я не смог заставить его работать с LibreOffice.Однако, если я изменю вызывающую функцию:

oMailMerge.execute([])

для пропускания пустого кортежа:

oMailMerge.execute((),)

Теперь она может работать на OpenOffice 4.1.6 в качестве фоновой и, в отличие отс LibreOffice он функционирует, как и ожидалось, с выводом html, text и pdf типов.Он также работает с выводом файлов writer8, поскольку он все еще экспортирует коды полей, но даже если источник данных отсутствует, он заполняет правильные значения и, что важно, правильно обрабатывает скрытые абзацы.

Победадля OOo 4.1.6 и сбой для LibreOffice 6.0.6.2.

...