BashでLibreOfficeまたはOpenOffice ODTファイルをパスワードで保護する

BashでLibreOfficeまたはOpenOffice ODTファイルをパスワードで保護する

人気のある GNU/Linux ディストリビューションの Bash ターミナルでパスワード保護されていない [OpenDocument Text(.odt)](OpenDocument Text) ドキュメントをパスワードで保護されたドキュメントに変換するには?

残念ながら、LibreOfficeのマニュアルページには「password」という文字列も含まれていないため、ここではあまり役に立ちません。

次の暗号化されたコンテナにファイルをパッケージ化したくありません。圧縮ファイルLibreOfficeで開くには、まず解凍する必要があります。重要なことは、ファイル受信者がファイルを開くためにLibreOfficeを使用する必要がなく、ファイルパスワード以外の情報を知る必要がないことです。

可能であれば、目的の結果を得るためにLibreOffice自体および/または標準のGNU / Linuxユーティリティを使用することをお勧めします。そうでない場合は、通常、GNU / Linuxディストリビューション用にパッケージされた無料のソフトウェアアプリケーションを使用する方がよいでしょう。

ベストアンサー1

私が作成したモジュールはエラーチェックがないため、貴重なファイルを破壊する可能性があります。使用に伴うリスクは、ユーザー自身が負担し、信頼できるバックアップを準備し、絶対にroot権限でこのプログラムを実行しないでください!

階層医者:

  1. モジュールコンテンツのダウンロードここそしてどこかに保存してみてください。
  2. ツール->マクロ->マクロ設定->libreoffice basicでLibreofficeマクロ設定を開始して入力します。
  3. 左側のマクロリストで、「LibreOffice Macros」コンテナに「Tools」というライブラリがあることを確認してください(その中にマクロが必要です)。
  4. ダイアログボックス右側の「Organizer」を選択します。
  5. 「マイマクロ」コンテナを開き、「標準」を選択し、右側から「新規」を選択します。
  6. モジュール名を「saveWithPassword」と指定します。
  7. 新しく作成されたモジュールが強調表示された状態で、編集を選択します。これでIDEが開き、新しいモジュールが表示されます。
  8. 正しいモジュールが選択されていることを確認し、エディタウィンドウの内容を削除します。
  9. たとえば、GUIエディタを使用してダウンロードしたモジュールファイルを開き、geditすべてを選択してソースコード全体を切り取り、LibreOfficeエディタウィンドウに貼り付けます。保存して閉じると完了です。
  10. プログラミングとデバッグに精通している場合は、.odtファイルを開き、マクロIDE(上記)を開き、マクロを段階的に実行し、変数の内容を表示できます。

今マクロをどのように使用しますか?

同じパスワードで保護する必要がある.odtファイルのリストがあるとします。ソースファイルをそのまま残すには、保護されたファイルを別のターゲットフォルダ(必ず存在する必要があります)に保存する必要があります。それからあなたは電話します

$ lowriter --invisible <list of .odt files> macro:///standard.saveWithPasswd.saveWithPasswd

(提案どおりにモジュールを作成したとします。)ファイルがロードされると、マクロが起動し、宛先ディレクトリとパスワードの入力を求められます。これにより、文書が宛先ディレクトリに保存され、提供されたパスワードで保護されます。

Windowsですべての文書を開くのを防ぐには、2番目の(自動)方法があります。

LibreOffice実行中のインスタンスがないことを確認してください。その後実行

$ export password=<the password to use>
$ export target=<full path to the target directory>
$ lowriter --headless <list of .odt files> macro:///standard.saveWithPasswd.saveWithPasswd

今詳しくはこちら

主な機能は、パスワードで保護されたファイルを作成することです。これを行う方法はいくつかあります。対話的に実行する操作を記録すると、次の結果が表示されます。

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///home/user/Untitled%201.odt"
args1(1).Name = "FilterName"
args1(1).Value = "writer8"
args1(2).Name = "EncryptionData"
args1(2).Value = Array(Array("PackageSHA256UTF8EncryptionKey",Array(-14,-81,-47,-54,-53,84,65,-91,-26,90,122,70,10,95,-104,-104,-73,-71,-117,8,-86,99,35,-94,-27,60,-117,-102,-106,-122,-51,-122)),Array("PackageSHA1UTF8EncryptionKey",Array(24,97,84,113,43,45,95,103,-111,-40,91,-102,9,-121,-71,-113,-94,49,119,-100)),Array("PackageSHA1MS1252EncryptionKey",Array(24,97,84,113,43,45,95,103,-111,-40,91,-102,9,-121,-71,-113,-94,49,119,-100)))

dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())

何が複雑すぎる?

[2] 5.8.3では、より簡単な解決策が見つかりました。

Dim args(0) As New com.sun.star.beans.PropertyValue
Dim sURL$
args(0).Name ="Password"
args(0).Value = "test"
sURL=ConvertToURL("/andrew0/home/andy/test.odt")
ThisComponent.storeToURL(sURL, args())

今やるべきほとんどの仕事は

  • パスワードと宛先ファイル名/ディレクトリをマクロに渡す
  • 開いている文書を繰り返す
  • 環境変数とダイアログボックスの使用
  • 既存のライブラリ関数の検索と使用

モジュールの一部を詳しく説明します(残りはマイナーなようです)。

GlobalScope.BasicLibraries.loadLibrary("Tools")

これにより、グローバルLibreOfficeライブラリ「Tools」がロードされます。これらのマクロの一部は文字列処理などに使用されます。

oComponents = StarDesktop.getComponents()
oDocs = oComponents.createEnumeration()
Do While oDocs.hasMoreElements()
  oDoc = oDocs.nextElement()
  .
  . 
Loop

これは現在開いている文書/フレームを繰り返します。テストとデバッグでは、IDEも開いているので、フレームワークに実際に有効なドキュメントが含まれていることをテストする必要があります。

sUrl     = oDoc.getUrl()
If sUrl <> "" Then

ドキュメントがURLを定義した場合(実際に存在するかどうかをテストしないでください...)、新しいURLが作成され、ドキュメントがパスワードで保存されます。

sName    = FileNameoutofPath(sUrl)
sName    = myTargetDir & "/" & sName
sUrl     = ConvertToURL(sName)
aArgs(0).Name = "Password"
aArgs(0).Value = myPassword
oDoc.storeToURL(sURL, aArgs())
oDoc.close(true)

ここでは、「ツール」ライブラリの機能が使用されます。特にlowriterオプションで呼び出すと、--headlessドキュメントは最後に閉じる必要があります。そうしないと終了しませlowriterん。

「パスワード」と「ターゲットディレクトリ」をパラメータとしてモジュールに渡すことができないため、2つの方法を使用します。シェル環境変数(完全に自動化できるため)とダイアログボックスを入力します。

「Environ」機能と基本的な「InputBox」を使用すると、パスワードを取得するのは非常に簡単です。パスワードの入力中にパスワードを非表示にするには、独自のダイアログボックスを作成する必要があります。

ターゲットフォルダを選択するのは単純なランタイム機能ではないため、少し面倒です。

oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FolderPicker")
oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess")
InitPath = GetPathSettings("Work")
If oUcb.Exists(InitPath) Then
  oFileDialog.SetDisplayDirectory(InitPath)
End If

静的「InitPath」(開くときに「FolderPicker」が始まるパス)を使用することにした場合は、それを定義してからからのすべてのoUcb =項目を切り取ることができます。コマンドラインから実行するときに設定することもできます。スタートフォルダは、設定で「マイドキュメント」フォルダとして定義したフォルダです。End IfoFileDialog.SetDisplayDirectoryInitPath = Environ("PWD")LibreOffice

oFileDialog.SetTitle(sTitle)
iAccept = oFileDialog.Execute()
If iAccept = 1 Then
  sPath = oFileDialog.Directory
  getFolderName = sPath
End If

これは自明だと思います。ただし、ここではエラーチェックがないことに注意してください。ファイルダイアログをキャンセルすると、TargetPathは定義されません。これにより、マクロが完全に中断されるか、inのwhile代わりにループを定義する必要があります。IfaskForTarget

Do While myTargetDir = "" 
  myTargetDir = getFolderName("Please select output directory") 
Loop

わかりました…

私が考えることができる多くの修正があります。まず、エラーチェックで元のファイルを上書きするか(たとえば、TargetDirnullテスト)、破損していないことを確認します。または、元のファイル名、宛先、およびパスワードを使用してテキストファイルを生成し、マクロに渡して順番に完了します。または、すべてのソース文書をフォルダに配置し、そのフォルダパスをマクロに渡してからディレクトリリストを繰り返します(例もあります)。

調査中、私は多くの例を含む素晴らしい文書を見つけて使用しました。

[1]OpenOffice マクロの説明渡すアンドリュー・フィトニアック(ドイツ語でも可能)

[2]同じ著者のマクロの例:説明例そしてテストされていないマクロ

[サム]LibreOffice API ドキュメント

そして質問/回答。https://ask.libreoffice.org/en/question/29997/how-to-run-a-macro-on-multiple-files-batch/

最後に、あなたの質問と忍耐に感謝します。マクロプログラミングを再開するのは本当に楽しかったし、気分もさわやかで、多くの新しいことを学びました。

おすすめ記事