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



我已经花了两天的时间来研究这个问题,但我仍然没有弄清楚。

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

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

  1. 检索指定(命名?)的当前值Input field("123"),
  2. "替换"指定的(命名的?)Placeholderhttp://domain.tld/image/123.png加载的图像

这是可能的吗?将是伟大的,因为我试图插入外部生成的条形码到我的文档…

这些都是"文本字段",Andrew Pitonyak的《OpenOffice宏解释》一书中提供了一些信息和宏示例(可从http://www.pitonyak.org/oo.php免费下载pdf)。维基页面也有一些不错的背景。

表单控件(来自工具栏"表单控件")被命名,因此它们在使用宏时具有优势。但是,文本字段(文档中的文本字段)没有命名,因此必须遍历文档中的所有字段,或者突出显示特定的文本,然后在突出显示的区域内循环遍历字段以找到要查找的字段。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可以用占位符指定的内容替换占位符。调度程序可能有一种方法——调度命令列表中诱人地包括"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

最新更新