人気のあるGNU/LinuxディストリビューションのBashターミナルから、パスワードで保護されていない[OpenDocument Text(.odt)](OpenDocument Text)ドキュメントをパスワードで保護されたドキュメントに変換するにはどうすればよいですか?
残念ながら、LibreOfficeのmanページには「password」という文字列すら含まれていないため、ここではあまり役に立ちません。
LibreOfficeで開く前にファイルを抽出する必要がある Zipファイル などの暗号化されたコンテナでファイルをラップしたくありません。ファイルの受信者が、LibreOfficeとファイルのパスワードの知識以外は何も必要とせずにファイルを開くことができることが重要です。
可能であれば、LibreOffice自体や標準のGNU/Linuxユーティリティを使用して目的の結果を達成したいと思います。それ以外の場合は、GNU/Linuxディストリビューション用に一般的にパッケージ化されているフリーソフトウェアアプリケーションのみを使用することをお勧めします。
私が作成したモジュールは簡単なハックです。エラーチェックがないため、貴重なドキュメントが破壊される可能性があります。 自己責任で使用し、信頼できるバックアップを手元に用意し、ルート権限でこれを実行しないでください!!
Tl; dr:
Libreoffice
を開始し、ツール->マクロ->マクロの整理-> libreofficebasicからマクロの整理に移動します。gedit
)で開き、すべてを選択してから、完全なソースコードを切り取ってLibreOfficeエディターウィンドウに貼り付けます。保存して閉じると完了です。では、マクロの使い方は?
同じパスワードで保護する必要がある.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は定義されません。これにより、マクロが完全に中断するか、while
のIf
の代わりにaskForTarget
ループを定義する必要があります。
_Do While myTargetDir = ""
myTargetDir = getFolderName("Please select output directory")
Loop
_
あなたはアイデアを得ました...
私が考えることができる多くの変更があります。最初に、元のファイルを上書きしないようにエラーチェックを実行します(たとえば、TargetDir
が空かどうかをテストします)、またはその他の害を及ぼします。または、元のファイル名、ターゲット、およびパスワードを使用してテキストファイルを作成し、それをマクロに渡して順番に実行します(アイデアはわかりましたか?)。または、すべての元のドキュメントを1つのフォルダーに入れ、そのフォルダーパスをマクロに渡してから、ディレクトリリストを繰り返します(例もあります)。
調査中に、多くの例を含むいくつかの優れたドキュメントを見つけました(そして使用しました)。
[1] OpenOffice Macros Explained by Andrew Pitonyak (ドイツ語版としても入手可能)
[2]同じ作成者によるマクロの例: 説明されている例 および テストされていないマクロ
および https://ask.libreoffice.org/en/question/29997/how-to-run-a-macro-on-multiple-files-batch/ のような質問/回答
最後に、あなたの質問とあなたの忍耐に感謝します。マクロプログラミングに戻るのはとても楽しかったです、そして私はいくつかの知識をリフレッシュし、多くの新しいことを学びました。