web-dev-qa-db-ja.com

LibreOfficeまたはOpenOfficeODTファイルをBashからパスワードで保護します

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

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

LibreOfficeで開く前にファイルを抽出する必要がある Zipファイル などの暗号化されたコンテナでファイルをラップしたくありません。ファイルの受信者が、LibreOfficeとファイルのパスワードの知識以外は何も必要とせずにファイルを開くことができることが重要です。

可能であれば、LibreOffice自体や標準のGNU/Linuxユーティリティを使用して目的の結果を達成したいと思います。それ以外の場合は、GNU/Linuxディストリビューション用に一般的にパッケージ化されているフリーソフトウェアアプリケーションのみを使用することをお勧めします。

2
sampablokuper

私が作成したモジュールは簡単なハックです。エラーチェックがないため、貴重なドキュメントが破壊される可能性があります。 自己責任で使用し、信頼できるバックアップを手元に用意し、ルート権限でこれを実行しないでください!!

Tl; dr:

  1. モジュールの内容をダウンロード ここ そしてどこかに保存します。
  2. Libreofficeを開始し、ツール->マクロ->マクロの整理-> libreofficebasicからマクロの整理に移動します。
  3. 左側のマクロリストから、コンテナ「LibreOfficeMacros」に「Tools」という名前のライブラリがあることを確認してください(そこにあるマクロが必要です)
  4. ダイアログの右側にある「オーガナイザー」を選択します
  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ライブラリ「ツール」がロードされます。そこにあるマクロのいくつかは、文字列などの処理に使用されます。

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

これは、現在開いているドキュメント/フレームを繰り返し処理します。テストとデバッグに関しては、IDE open、フレームに本当に有効なドキュメントが含まれているかどうかをテストする必要がありました。

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

ここでは、「ツール」ライブラリの機能が使用されます。特に、オプション_--headless_を指定してlowriterを呼び出す場合は、ドキュメントを最後に閉じる必要があります。そうしないと、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 If_まで、_oFileDialog.SetDisplayDirectory_を除くすべてを切り取ることができます。コマンドラインから実行する場合は、InitPath = Environ("PWD")を設定することもできます。今のところ、開始はLibreOffice設定で「マイドキュメント」フォルダとして定義したフォルダです。

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

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

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

あなたはアイデアを得ました...

私が考えることができる多くの変更があります。最初に、元のファイルを上書きしないようにエラーチェックを実行します(たとえば、TargetDirが空かどうかをテストします)、またはその他の害を及ぼします。または、元のファイル名、ターゲット、およびパスワードを使用してテキストファイルを作成し、それをマクロに渡して順番に実行します(アイデアはわかりましたか?)。または、すべての元のドキュメントを1つのフォルダーに入れ、そのフォルダーパスをマクロに渡してから、ディレクトリリストを繰り返します(例もあります)。

調査中に、多くの例を含むいくつかの優れたドキュメントを見つけました(そして使用しました)。

[1] OpenOffice Macros Explained by Andrew Pitonyak (ドイツ語版としても入手可能)

[2]同じ作成者によるマクロの例: 説明されている例 および テストされていないマクロ

[3] LibreOffice APIドキュメント

および https://ask.libreoffice.org/en/question/29997/how-to-run-a-macro-on-multiple-files-batch/ のような質問/回答

最後に、あなたの質問とあなたの忍耐に感謝します。マクロプログラミングに戻るのはとても楽しかったです、そして私はいくつかの知識をリフレッシュし、多くの新しいことを学びました。

3
ridgy