如何检索输入字段的值并使用它来修改 LibreOffice Basic 宏中的占位符?

How to retrieve the value of an Input field and use it to modify a placeholder in a LibreOffice Basic macro?

我已经在这上面花了两天时间,但我仍然无法弄明白 8-)

我有一个包含 Placeholders (Insert -> Fields -> More Fields -> Functions -> Placeholder -> Image) 和 Input fields (Insert -> Fields -> More Fieds -> Functions -> Input field) 的 LibreOffice Writer 文档,我需要检索Input field 的值并用它替换同一文档中指定的 Placeholder

更准确地说。我有一个 Input field,我在其中输入例如 123 在文档的某处有一个按钮,它触发了一个宏,这个宏应该:

  1. 检索指定(命名?)的当前值Input field ("123"),
  2. "replace" 一个指定的(命名?)Placeholder 图像从 http://domain.tld/image/123.png
  3. 加载

这有可能吗?太好了,因为我正在尝试将外部生成的条形码插入到我的文档中...

这些都是 "Text fields",一些信息和宏示例在 Andrew Pitonyak 的书 OpenOffice Macros Explained 中(可从 http://www.pitonyak.org/oo.php). The wiki page 免费下载 pdf,也有一些很好的背景知识。

表单控件(来自工具栏 "Form controls")已命名,因此它们在使用宏时具有优势。但是,文本字段(文档中的那种)未命名,因此您必须循环浏览文档中的所有字段,或者突出显示特定的 运行 文本并循环浏览突出显示区域内的字段找到你想要的那个。 Pitonyak 文档有这两种方法的示例。

假设文档只有一个输入字段,此 StarBasic 代码将打印其当前值:

Sub DisplayFields

Dim oEnum As Object
Dim oField As Object

oEnum = ThisComponent.getTextFields().createEnumeration()
Do While oEnum.hasMoreElements()
    oField = oEnum.nextElement()
    If oField.getPresentation(True) = "Input field" Then
        Print "Input field contents: " & oField.getPresentation(False)
        Exit Do
    End If
Loop

End Sub

据我所知,没有 API 可以用指定的内容替换占位符。调度程序可能有一种方法 - list of dispatch commands 诱人地包含 "FieldDialog" - 但我找不到任何文档或示例。

我认为您需要做的是找到该字段,将光标放在那里,插入图像,然后删除占位符字段。更多 StarBasic 代码(再次假设文档中只有一个占位符字段):

Sub InsertImage

Dim oEnum As Object
Dim oField As Object
Dim oAnchor As Object
Dim oText As Object
Dim oCursor As Object
Dim FileName As String
Dim FileURL As String
Dim objTextGraphicObject As Object

oEnum = ThisComponent.getTextFields().createEnumeration()
Do While oEnum.hasMoreElements()
    oField = oEnum.nextElement()
    If oField.getPresentation(True) = "Placeholder" Then
        oAnchor = oField.Anchor
        oText = oAnchor.getText()
        oCursor = oText.createTextCursorByRange(oAnchor.getEnd)

        FileName = "C:\after zoo.JPG"
        FileURL = convertToURL(FileName)
        objTextGraphicObject = ThisComponent.createInstance("com.sun.star.text.TextGraphicObject") 

        REM Optional to set the size
'       Dim objSize as New com.sun.star.awt.Size
'       objSize.Width = 3530
'       objSize.Height = 1550
'       objTextGraphicObject.setSize(objSize)
        objTextGraphicObject.GraphicURL = FileURL
        oText.insertTextContent(oCursor.Start, objTextGraphicObject, false)

        oField.dispose()
        Exit Do
    End If
Loop

End Sub