在输出前拼合邮件合并的文档

Posted

技术标签:

【中文标题】在输出前拼合邮件合并的文档【英文标题】:Flatten mailmerged documents before output 【发布时间】:2018-11-23 05:51:50 【问题描述】:

我遇到了使用 python uno 脚本创建的邮件合并文件的问题。使用 mailmerge 向导在 LibreOffice 中运行 mailmerge 就像在隐藏字段中一样,文档中的其他字段被展平/执行,生成的文档具有正确的最终展平输出。

相比之下,当使用下面的代码运行时,生成的是一系列输出文档,其中仍然包含域代码,并且隐藏的段落仍然可见。每个文档都设置到 mailmerge 数据库的相应行,就像我在设置 Mailmerge 时在 LibreOffice 中的预览一样。在不同的机器上打开这些文档,数据不会显示,因为它需要先访问后端数据库才能获取字段数据。

如果在我的脚本中我将 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()

系统在 Ubuntu 18 x64 上运行 LibreOffice 6.0.6.2

这是我在调用脚本之前启动 LibreOffice 的方式:

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

【问题讨论】:

【参考方案1】:

这与其说是真正的解决方案,不如说是一种解决方法。我无法让它与 LibreOffice 一起工作。但是,如果我更改调用函数:

oMailMerge.execute([])

传递一个空元组:

oMailMerge.execute((),)

现在它可以作为后端在 OpenOffice 4.1.6 上运行,并且与 LibreOffice 不同的是,它可以按预期运行,输出 html、text 和 pdf 类型。它还可以输出 writer8 文件,因为它仍在导出域代码,但即使数据源不存在,它也会填写正确的值,并且重要的是正确处理隐藏的段落。

OOo 4.1.6 获胜,LibreOffice 6.0.6.2 失败。

【讨论】:

以上是关于在输出前拼合邮件合并的文档的主要内容,如果未能解决你的问题,请参考以下文章

Word邮件合并不能发送HTML格式以及怎么带附件?

WORD 实现邮件合并

如何为包含文档中标题名称的电子邮件创建邮件合并模板?

Aspose 在文档上调用 UpdateFields() 会丢失邮件合并字段数据

基于WPS的Word最佳实践系列(邮件合并实现邮件批量发送)

使用 Google 脚本创建和/或更新邮件合并 Google 文档