Сглаживайте объединенные по почте документы перед выводом

У меня проблема с объединенными по почте файлами, созданными с помощью скрипта 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;"

person Mark Warburton    schedule 23.11.2018    source источник


Ответы (1)


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

oMailMerge.execute([])

передать пустой кортеж:

oMailMerge.execute((),)

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

Победа для OOo 4.1.6 и провал для LibreOffice 6.0.6.2.

person Mark Warburton    schedule 24.11.2018