Como executo uma macro do LibreOffice na linha de comando sem a GUI?

Como executo uma macro do LibreOffice na linha de comando sem a GUI?

Quero executar uma macro do LibreOffice em arquivos .odt na linha de comando. Como quero ampliar isso para aplicar a macro a vários arquivos, não quero que a GUI apareça em cada execução da macro.

Atualmente tenho uma macro funcionando (que também fecha o arquivo no final) e, pelo que consigo encontrar, devo conseguir chamá-la da seguinte forma:

soffice --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.odt" "macro:///Standard.Module1.myMacro"

ou

swriter --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.odt" "macro:///Standard.Module1.myMacro"

Ambos os comandos executam a macro corretamente, porém a GUI abre e fecha durante a execução. Como posso evitar isso?

Estou trabalhando em um computador com Windows 10 eAjuda>Sobre o LibreOfficedeu as seguintes informações:

Versão: 5.2.1.2
ID da compilação: 31dd62db80d4e60af04904455ec9c9219178d620
Threads de CPU: 4; Versão do SO: Windows 6.2; Renderização da IU: padrão;
Localidade: en-US (en_US); Cálculo: CL

Responder1

O problema é que embora o LibreOffice fique invisível quando iniciado, ele se torna visível após a abertura de um documento. Existe uma solução emhttps://forum.openoffice.org/en/forum/viewtopic.php?f=5&t=22548:

  1. Execute o LibreOffice sem cabeça para chamar uma macro. A chamada da linha de comando devenãoespecifique o documento a ser aberto, apenas uma macro. Por exemplo (usando a sintaxe de macro mais recente):

    soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine?language=Basic&location=application"

  2. As chamadas macrocarregarComponentFromUrlcom a Hiddenpropriedade definida como true. Isso fará com que o documento não fique visível.

  3. Agora a macro executa tudo o que deveria fazer com o documento.

EDITAR:

Para que funcione para arquivos diferentes, passe o nome do arquivo como parâmetro usando a sintaxe de macro mais antiga. Um exemplo dehttps://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8232:

soffice "macro:///Library3.Module1.test_Args(arg1,123,4.567,2000-12-31)"

Responder2

Para esclarecer um pouco sobre a já boa resposta de Jim K:

function OpenSilent(FilePath as String) as Object
  Dim FileProperties(1) As New com.sun.star.beans.PropertyValue
  FileProperties(0).Name = "Hidden"
  FileProperties(0).Value = True
  OpenSilent = StarDesktop.loadComponentFromURL("file://" & FilePath, "_blank", 0, FileProperties())
end function

sub Headless(FilePath as String)
  Document = OpenSilent(FilePath)
  call MyArgumentlessMacro()
  call Document.close(True)
end sub


sub HeadlessWithArgs(FilePath as String, Arg1 as Variant, Arg2 as Variant)
  Document = OpenSilent(FilePath)
  call MyMacroWithArguments(Arg1, Arg2)
  call Document.close(True)
end sub

Agora podemos fazer:

soffice  --invisible --nofirststartwizard --headless --norestore 'macro:///MyLibrary.MyModule.Headless("/home/user/File.odt")'
# or 
soffice  --invisible --nofirststartwizard --headless --norestore 'macro:///MyLibrary.MyModule.Headless("/home/user/File.odt", "Hello, World", 6847)'

Seria muito melhor poder passar o nome da macro interna para chamar a partir da linha de comando do soffice, ou seja, como argumento para Headless, mas deixarei isso para outra hora.

informação relacionada