GUI なしでコマンド ラインから LibreOffice マクロを実行するにはどうすればよいですか?

GUI なしでコマンド ラインから LibreOffice マクロを実行するにはどうすればよいですか?

コマンドラインから .odt ファイルに対して LibreOffice マクロを実行したいと考えています。マクロを複数のファイルに適用できるようにスケールアップしたいので、マクロを実行するたびに GUI がポップアップ表示されるのは望ましくありません。

現在、動作するマクロ(最後にファイルも閉じます)があり、私が調べた限りでは、次のように呼び出すことができるはずです。

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

または

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

どちらのコマンドもマクロを正しく実行しますが、実行中に GUI が開いたり閉じたりします。これを防ぐにはどうすればよいですか?

私はWindows 10のコンピューターで作業しており、ヘルプ>LibreOfficeについて以下の情報を提供しました:

バージョン: 5.2.1.2
ビルド ID: 31dd62db80d4e60af04904455ec9c9219178d620
CPU スレッド: 4; OS バージョン: Windows 6.2; UI レンダリング: デフォルト;
ロケール: en-US (en_US); 計算機: CL

答え1

問題は、LibreOfficeが起動時に非表示であっても、文書を開くと表示されることです。解決策はhttps://forum.openoffice.org/en/forum/viewtopic.php?f=5&t=22548:

  1. マクロを呼び出すには、LibreOfficeをヘッドレスで実行します。コマンドライン呼び出しはない開くドキュメントをマクロのみで指定します。例 (新しいマクロ構文を使用) :

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

  2. マクロ呼び出しURLからコンポーネントを読み込むプロパティHiddenを true に設定します。これにより、ドキュメントは表示されなくなります。

  3. これで、マクロはドキュメントに対して実行しようとしていた操作を実行します。

編集:

異なるファイルで動作させるには、古いマクロ構文を使用してファイル名をパラメータとして渡します。https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8232:

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

答え2

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

今、私たちは次のことができるようになりました:

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)'

soffice コマンドラインから呼び出す内部マクロの名前を、つまり Headless への引数として渡すことができれば、はるかに便利ですが、それはまた別の機会に説明します。

関連情報