api - LibreOffice Writer API - VB6 中的光标和文本选择/替换

标签 api vb6 libreoffice writer

我一直在尝试用 LibreOffice 替换 vb6 应用程序中的 Office OLE。

我已经取得了一些成功,但是,我在尝试搜索文本,然后根据找到的文本创建光标,然后在文档中的该光标点插入图像时失败了。

我已经能够拼凑出工作代码,使我能够搜索文本、替换文本和插入图像,但是,我似乎无法弄清楚如何创建一个允许我在以下位置插入图像的光标文字所在的步伐是我发现的。在提供的示例中,文档中的 [PICTUREPLACEHOLDER] 文本。

以前有人这样做过吗?他们对如何创建一个允许我指定图像插入位置的光标有什么建议吗?

我已经包含了 VB6 测试应用程序的代码,以便您可以查看源代码以了解其当前的工作方式。

如有任何建议,我们将不胜感激。

请注意 - 这是实验代码 - 非常粗糙且准备就绪 - 远不是最终代码 - 只是想弄清楚它如何与 LibreOffice Writer 配合使用。

要运行此程序,您需要创建一个带有按钮的空 vb6 应用程序。

您还需要安装 LibreOffice。

非常感谢

杆。

Sub firstOOoProc()

    Dim oSM                   'Root object for accessing OpenOffice from VB
    Dim oDesk, oDoc As Object 'First objects from the API
    Dim arg()                 'Ignore it for the moment !
    
    'Instanciate OOo : this line is mandatory with VB for OOo API
    Set oSM = CreateObject("com.sun.star.ServiceManager")
    'Create the first and most important service
    Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")
  
    Dim oProvider As Object
  
    Set oProvider = oSM.createInstance("com.sun.star.graphic.GraphicProvider")
  
    
    'Open an existing doc (pay attention to the syntax for first argument)
    Set oDoc = oDesk.loadComponentFromURL("file:///c:/dev/ooo/testfile.doc", "_blank", 0, arg())
  
  
    ' now - replace some text in the document
    Dim Txt
    Txt = oDoc.GetText
    
    Dim TextCursor
    TextCursor = Txt.CreateTextCursor
    
    ' attempt to replace some text 
    Dim SearchDescriptor
  
    Dim Replace
    Replace = oDoc.createReplaceDescriptor
  
    Replace.SearchString = "[TESTDATA1]"
    Replace.ReplaceString = "THIS IS A TEST"
    oDoc.replaceAll Replace
    
    Dim searchCrtiteria
    
    SearchDescriptor = oDoc.createReplaceDescriptor
  
  
    ' Now - attempt try to replace some text with an image

    SearchDescriptor.setSearchString ("[PICTUREPLACEHOLDER]")
    SearchDescriptor.SearchRegularExpression = False
    
    Dim Found
    Found = oDoc.findFirst(SearchDescriptor)
  
    ' create cursor to know where to insert the image
    Dim oCurs As Object
    
      
    Set thing = oDoc.GetCurrentController
   
    Set oCurs = thing.GetViewCursor
  
    ' make hte call to insert an image from a file into the document
    InsertImage oDoc, oCurs, "file:///c:/dev/ooo/imagefilename.jpg", oProvider

  
    'Save the doc
    Call oDoc.storeToURL("file:///c:/dev/ooo/test2.sxw", arg())

    'Close the doc
    oDoc.Close (True)
    Set oDoc = Nothing
  
    oDesk.Terminate
    Set oDesk = Nothing
  
    Set oSM = Nothing
  
  End Sub 
  
  
Function createStruct(strTypeName)
    Set classSize = objCoreReflection.forName(strTypeName)
    Dim aStruct
    classSize.CreateObject aStruct
    Set createStruct = aStruct
End Function

  Sub InsertImage(ByRef oDoc As Object, ByRef oCurs As Object, sURL As String, ByRef oProvider As Object)


         ' Init variables and instance object
        
        Dim oShape As Object
        Dim oGraph As Object
        Set oShape = oDoc.createInstance("com.sun.star.drawing.GraphicObjectShape")
        Set oGraph = oDoc.createInstance("com.sun.star.text.GraphicObject")
        'Set oProvider = serviceManager.CreateInstance("com.sun.star.graphic.GraphicProvider")

        ' Add shape to document
        oDoc.getDrawPage.Add oShape

        ' Set property path of picture
        Dim oProps(0) As Object
        Set oProps(0) = MakePropertyValue("URL", sURL)

        ' Get size from picture to load
        Dim oSize100thMM
        Dim lHeight As Long
        Dim lWidth As Long
        Set oSize100thMM = RecommendGraphSize(oProvider.queryGraphicDescriptor(oProps))
        If Not oSize100thMM Is Nothing Then
            lHeight = oSize100thMM.Height
            lWidth = oSize100thMM.Width
        End If

        ' Set size and path property to shape
        oShape.graphic = oProvider.queryGraphic(oProps)

        ' Copy shape in graphic object and set anchor type
        oGraph.graphic = oShape.graphic
        oGraph.AnchorType = 1 'com.sun.star.Text.TextContentAnchorType.AS_CHARACTER

        ' Remove shape and resize graphix
        Dim oText As Object
        Set oText = oCurs.GetText
        oText.insertTextContent oCurs, oGraph, False
        oDoc.getDrawPage.Remove oShape
        If lHeight > 0 And lWidth > 0 Then
            Dim oSize
            oSize = oGraph.Size
            oSize.Height = lHeight * 500
            oSize.Width = lWidth * 500
            oGraph.Size = oSize
        End If
        
        

    End Sub
    
    
    '
'Converts a Ms Windows local pathname in URL (RFC 1738)
'Todo : UNC pathnames, more character conversions
'
Public Function ConvertToUrl(strFile) As String
    strFile = Replace(strFile, "\", "/")
    strFile = Replace(strFile, ":", "|")
    strFile = Replace(strFile, " ", "%20")
    strFile = "file:///" + strFile
    ConvertToUrl = strFile
End Function

    '
'Creates a sequence of com.sun.star.beans.PropertyValue s
'
Public Function MakePropertyValue(cName, uValue) As Object
Dim oStruct, oServiceManager As Object
    Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set oStruct = oServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    oStruct.Name = cName
    oStruct.Value = uValue
    Set MakePropertyValue = oStruct
End Function


'
'A simple shortcut to create a service
'
Public Function CreateUnoService(strServiceName) As Object
Dim oServiceManager As Object
    Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set CreateUnoService = oServiceManager.createInstance(strServiceName)
End Function




Public Function RecommendGraphSize(oGraph)
    Dim oSize
    Dim lMaxW As Double
    Dim lMaxH As Double
    
    lMaxW = 6.75 * 2540
    lMaxH = 9.5 & 2540
    
    If IsNull(oGraph) Or IsEmpty(oGraph) Then
        Exit Function
    End If
    
    oSize = oGraph.Size100thMM
    If oSize.Height = 0 Or oSize.Width = 0 Then
        oSize.Height = oGraph.SizePixel.Height * 2540# * Screen.TwipsPerPixelY() '/ 1440
        oSize.Width = oGraph.SizePixel.Width * 2540# * Screen.TwipsPerPixelX() '/ 1440
    End If
    If oSize.Height = 0 Or oSize.Width = 0 Then
        Exit Function
    End If
    If oSize.Width > lMaxW Then
        oSize.Height = oSizeHeight * lMax / oSize.Width
        oSize.Width = lMaxW
    End If
    If oSize.Height > lMaxH Then
        oSize.Width = oSize.Width * lMaxH / oSize.Height
        oSize.Height = lMaxH
    End If
    RecommendGraphSize = oSize
End Function


Private Sub Command1_Click()
    firstOOoProc
End Sub

testFile.Doc文件内容如下所示:

This is a test File

[TESTDATA1]






[PICTUREPLACEHOLDER]


最佳答案

看来您需要将 View 光标移动到找到的位置。

Found = oDoc.findFirst(SearchDescriptor)
oVC = oDoc.getCurrentController().getViewCursor()
oVC.gotoRange(Found, False)
oVC.setString("")

关于api - LibreOffice Writer API - VB6 中的光标和文本选择/替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73671116/

相关文章:

windows - vb6 中的 CommonAppData

vb6 - 无法在 VB 项目中加载 cls 文件

ubuntu - 找不到 libreoffice 的源包

ios - 如何使用 Swift 4 和 Alamofire 从 API 获取数据

Java:当身份验证被排除时我应该/抛出什么?

api - RESTful 如何使用子域作为资源标识符?

excel - 具有多个条件的水平查找

azure - 为什么当我通过 Powershell 将 Api 权限上传到 AzureAd 时,我只得到 Id?

从 Visual Basic 6 调用 C DLL : Double data type not working

version-control - 自由办公室作家 : Strike-out on delete rather than remove?