2020年3月15日日曜日

33: LibreOfficeをファイルコンバーターとして最適に用いる(Basic実装)

<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

OpenDocument/Microsoft Office/等フォーマット間で、またPDFフォーマットへ、高速かつ柔軟に。ファイルに手を加えられる。OpenOfficeにも適用可能。

話題


About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: LibreOffice Basic
About: Apache OpenOffice Basic

この記事の目次

記法

  • 'Office'は、LibreOfficeまたはApache OpenOfficeを意味します。

開始コンテキスト



ターゲットコンテキスト



  • 読者は、UNO APIを直接使用してファイルをコンバートする、あるOffice Basic実装を取得および理解する。
ト書き
Hypothesizer 7、Objector 33A、Objector 33Bがコンピューターの前にいる。


オリエンテーション


Hypothesizer 7
本記事の本パートでは、UNO APIを直接使用して最適にファイルをコンバートする、あるOffice Basic実装を見て理解します。

Objector 33A
LibreOffice内のマクロとして呼べるということかな?

Hypothesizer 7
はい、サー。

Objector 33A
LibreOfficeインスタンスの中からのみ呼べるということかな?

Hypothesizer 7
実際には、Officeマクロは容易にOfficeインスタンスの外部から呼べます。

Objector 33A
おう?どうやって?

Hypothesizer 7
えーと、Java、C++、あるMicrosoft .NET Frameworkプログラミング言語(多分、C#またはVisual Basic.NET)、Pythonのいずれかで小さなプログラムを作成するつもりがおありでしたら、方法を将来の記事で見ます。

Objector 33A
おありじゃないな、実のところ。

Hypothesizer 7
おありでなければ、任意のマクロサブルーチンを'soffice'コマンドを介して呼出せます、それはファンクションでなくサブルーチンでなければならず、その方法はある程度非効率で制限的ではありますが

Objector 33A
...サブルーチンではだめだろう、コンバート元ファイルとコンバート先ファイルを少なくとも指定しなけりゃならないんだから。想像力を働かせろ!

Hypothesizer 7
私の想像力は、そういうパラメータはいくらかの方法、例えば、CSV経由、で渡すことが可能だと言っています。

Objector 33A
「CSVファイル」だと?どういう意味だ?

Hypothesizer 7
例えば、そのCSVファイルの行は、コンバート元ファイルURL、コンバート先ファイルURL、フィルター名のリストであり、あなたは、そうした行群をそのCSVファイルに入れ込んで'soffice'コマンドを実行し、サブルーチンは、そのCSVファイルを読んでコンバージョンを実行します。

Objector 33A
...サブルーチンがCSVファイルを読んでいる時に行を追加しようとしたらどうなるんだ?

Hypothesizer 7
そのようなことは起こらないでしょう、シーケンシャルに、CSVファイルを準備し、'soffice'コマンドを実行し、サブルーチン実行が終了するのを待ちさえすれば('soffice'コマンドは非同期にリターンするので、サブルーチンは、自身の実行の完了を、結果ファイルを介してあなたに通知する必要があるでしょう)。

Objector 33A
複数のマクロ実行を同時に走らせたい。

Hypothesizer 7
それは、どのみちできません、Office Basicは、複数実行を同時に走らせることができませんから。

Objector 33A
...'soffice'コマンドが長時間を要している間に、次回実行用のCSVファイルを準備したいかもしれんだろうが。想像力を働かせろ!

Hypothesizer 7
私の想像力は、次回実行用のCSVファイルを別のファイルに準備し、そのファイルを、'soffice'コマンドを呼び出す直前にリネームすればよいだけだと言っています。

Objector 33A
...とにかく、マクロを実行の完了を結果ファイルを介してチェックしなきゃならん。...そんなロジックを実装するのは間違いなく面倒だ!

Hypothesizer 7
それが特に面倒だとは私は考えませんが、確かに、そのロジックは効率的ではありません。したがって、私であれば、マクロを同期に呼び出すプログラムを作成するでしょう。

Objector 33B
どうせ'soffice'を呼ぶんであれば、どうして、いっそ'soffice --convert-to'を呼ばないの?

Hypothesizer 7
マダム、'soffice --convert-to'の機能は限定的であり、'soffice --convert-to'ができないことをするには、UNO APIを直接使用しなければなりません。


本体


1: UNOユーティリティBasicライブラリUNO拡張機能およびファイルコンバーターサンプルBasicライブラリUNO拡張機能を取得して登録する


Hypothesizer 7
ここに、ファイルコンバーターサンプルBasicライブラリUNO拡張機能を格納したZIPファイルがあります。

実際には、そのZIPファイルは、UNOユーティリティBasicライブラリUNO拡張機能(将来のいくつかの記事で紹介される他のライブラリたちでも使用される共通UNOユーティリティコード)も含んでいます。

UNO拡張機能ファイル('.oxt'ファイル)というのは、実際にはZIPファイルであり、任意のZIPツールで展開できます。したがって、そこに何も疑わしいものがないことを確認するために、あなたは、その中身を見ることができます(そして見るべきだ、と私は考えます)。

ト書き
Hypothesizer 7は、Linuxコンピューターで2つのUNO拡張機能を'unzip'で展開する。反対者たちは、展開された内容物ファイル群の中を覗く。

Objector 33B
えーと、ファイルが疑わしいかどうか私にはよく分からないけど...

Hypothesizer 7
少なくとも、ファイルは全てテキストファイルであることを見て取れますね?

Objector 33B
...ええ、実のところ、ファイルは全てXMLファイルのようね。

Hypothesizer 7
'.xba'ファイルはBasicソースファイルであり、その他のファイルはコンフィグレーションファイルです。

Objector 33B
ええ、この'.xba'ファイルのコンテンツはBasicソースコードのように見えます、でも...ちょっと変に見えるけど。

Hypothesizer 7
それは、'<'や '>'のような一部の文字がXMLエスケープされているためです。そのファイルはXMLファイルなので、一部の文字はXMLエスケープされないといけないわけです。

Objector 33B
...ははあ、確かに、これはBasicコードだわ、それが何をやってるのか私には理解できないけど、すぐには。

Hypothesizer 7
時間をとって、心ゆくまで検査なさってください。

Objector 33B
...

Hypothesizer 7
この2つのUNO拡張機能はOfficeに以下のようにして登録できます: Officeインスタンス(もしも、あれば)をシャットダウンし、ターミナルで以下のコマンド群を実行します、ディレクトリパス群は必要に応じて調整して。

@ ソースコード
/usr/lib/libreoffice/program/unopkg add -f -v ${HOME}/myData/development/theBiasPlanet.basicUnoUtilities.unoExtension.oxt
/usr/lib/libreoffice/program/unopkg add -f -v ${HOME}/myData/development/theBiasPlanet.basicFilesConverter.unoExtension.oxt

ト書き
Hypothesizer 7は、既存LibreOfficeインスタンスをシャットダウンし、ターミナルを開き、そのターミナルで上記コマンドを実行する。

Objector 33B
ふーん。

Hypothesizer 7
Basicコードは、3つのライブラリとして登録されています、以下で見られるとおり。

ト書き
Hypothesizerは、LibreOfficeインスタンスを起動し、そのLibreOfficeインスタンスで'Tools(ツール)' -> 'Macros(マクロ)' -> 'Organize Macros(マクロの管理)' -> 'LibreOffice Basic...(Basic...)'をクリックし、現れたダイアログで'Edit(編集)'をクリックする。Basic IDEウィンドウがオープンされる。

Hypothesizer 7
3つのライブラリ、'theBiasPlanet_coreUtilities'、'theBiasPlanet_unoUtilities'、'theBiasPlanet_filesConverter'が'My Macros & Dialogs'内にあります。

Objector 33B
ふーん。

Hypothesizer 7
ファイル群コンバージョンサブルーチンを実行するための準備として、'theBiasPlanet_filesConverter'ライブラリ内の'programs'モジュール内の'FilesConverterMacroProgram_s_conversionOrdersFilePath'にCSVファイルパスをセットしなければなりません。そのCSVファイルは、行群を含み、各行は、1コンバージョンのコンバート元ファイルURL、コンバート先ファイルURL、ドキュメント格納フィルター名を指定します。

いくつかの特別なドキュメント格納プロパティを指定したければ、それらを'programs'モジュール内にセットしなければならないでしょう。

Objector 33B
「いくつかの特別なドキュメント格納プロパティ」?

Hypothesizer 7
はい。

Objector 33B
...それがどういう意味かたずねてるんですけど。

Hypothesizer 7
ファイルをコンバートするというのは、実際には、ただ、コンバート元ファイルをオープンし、そのオープンされたドキュメントをコンバート先ファイルに格納し、そのドキュメントをクローズするだけのことです。ドキュメント格納フィルターは、ターゲットファイルフォーマットを決定します。その他のドキュメント格納プロパティ群は、そのターゲットファイルフォーマットの詳細を決定します。

Objector 33B
「詳細」?

Hypothesizer 7
はい。

Objector 33B
...それが何なのかたずねてるのよ。

Hypothesizer 7
詳細は、...詳細です、例えば、CSVフォーマットの場合の、文字群エンコーディング、項目群デリミタ、全テキスト項目がクウォートされるか否か、フォーミュラが書かれるのかその値が書かれるのか、...

Objector 33B
分かりました。

Hypothesizer 7
'programs'モジュール内の'FilesConverterMacroProgram_main'サブルーチン内で、'l_documentStoringPropertyNamesArray'配列変数および'l_documentStoringPropertyValuesArray'配列変数は、ドキュメント格納プロパティ群の名前群と値群をそれぞれ格納しています。いくつかのフィルターは、プロパティ群配列を'FilterData'('UnoDocumentStoringEnumerablePropertyNamesSet_c_filterData_any'の値)プロパティ値として受け取り、'l_documentStoringFilterDataInPropertiesArrayPropertyNamesArray'配列変数および'l_documentStoringFilterDataInPropertiesArrayPropertyValuesArray'配列変数は、そのプロパティ群配列の名前群と値群をそれぞれ格納しています。いくつかのフィルターは、'FilterOptions'('UnoDocumentStoringEnumerablePropertyNamesSet_c_filterData_string'の値)プロパティ値として文字列を受け取ります。

ご注意いただきたいのですが、プロパティ値群配列内の要素たちは、対応するプロパティ名群配列内要素群の並びに対応する並びになっていなければなりません、プロパティ名群配列内の要素たちの並びは、恣意的ですが。

Objector 33B
PDFフィルターは'FilterData'プロパティ値を取るの?

Hypothesizer 7
はい。

Objector 33B
...どんなプロパティ群をとるのか言うところでしょ!

Hypothesizer 7
それにここで立ち入ることはできません(将来の記事で行ないます)が、GUIの'File' -> 'Export as PDF...'からセットできるパラメータ全てをそこでセットできます。

Objector 33B
...


2: サンプルプログラムを実行する


Hypothesizer 7
サンプルプログラムへの入口は、'theBiasPlanet_filesConverter'ライブラリ内の'program'モジュール内の'FilesConverterMacroProgram_main'サブルーチンです。

ここでは'FilesConverterMacroProgram_s_conversionOrdersFilePath'はそのままにして、ZIPファイルに含まれている'filesConverter/execution/FileConversionOrders.csv'ファイルを使用します(少なくともファイルURL群は調整する必要があります)。

そのタブ区切りCSVファイルは既にテンプレートとしての行を含んでいるものの、URL群が"%the user name%"を含んでいて不完全なので行を編集しなければなりません。

ト書き
Hypothesizer 7は、"%the user name%"を実際のユーザー名に変える。

Objector 33B
...「タブ区切りCSV」って撞着語法だけど...

Hypothesizer 7
仰るとおりです。私がそれを選択したのは、コンマ区切りCSVよりも取り扱いが容易だからです、コンマ区切りCSVでは、項目がコンマを含むかもしれないため、項目をクウォートしなければならなくなりますから。

Objector 33B
そうだろうとは思ったけど。

Hypothesizer 7
次に、カレントディレクトリを'filesConverter'ディレクトリに位置させてOfficeインスタンスを起動します('FilesConverterMacroProgram_s_conversionOrdersFilePath'セッティングのため)。もっと具体的に言うと、ターミナルをオープンして、カレントディレクトリを'filesConverter'に変更し、Linuxでは'soffice'、Windowsでは'soffice.bin'を実行します、以下のように。

ト書き
Hypothesizer 7は、ターミナルをオープンし、カレントディレクトリを'filesConverter'に変更し、'soffice&'を実行する。

Objector 33B
なんでWindowsには'soffice.bin'なわけ?

Hypothesizer 7
なぜなら、Windowsの'soffice'は、自身のディレクトリにカレントディレクトリを強制的に変更するからです

Objector 33B
ああ、どのみち、'FilesConverterMacroProgram_s_conversionOrdersFilePath'を絶対パスでセットすればそんなこと心配しなくていいんでしょ?

Hypothesizer 7
されなくて結構です、それでも、ログファイルはカレントディレクトリに書かれる(したがって、Officeインスタンスはそこにファイル書き込み権限を持っていなければなりません)ことにご注意ください、あなたがその動作を変更しない限り。

Objector 33B
ああ。

Hypothesizer 7
次に、ファイルコンバージョンを以下のようにして呼び出せます、例えば。

@bash or cmd ソースコード
/usr/lib/libreoffice/program/soffice "vnd.sun.star.script:theBiasPlanet_filesConverter.programs.FilesConverterMacroProgram_main?language=Basic&location=application"

ト書き
既にオープンされているターミナルで、Hypothesizer 7は、上記コマンドを実行し、コマンドは即座に終了する。

Objector 33B
...成功したの?

Hypothesizer 7
ログファイル(カレントディレクトリ内の'Basic.log')をチェックする必要があります。

ト書き
既にオープンされているターミナルで、Hypothesizer 7は、ログファイルの内容を表示させる。

Objector 33B
「the indices of the failed conversion orders are ''」?それ、成功ってこと?

Hypothesizer 7
はい。「''」はどの行も失敗しなかったことを意味します。そうでなければ、失敗した行群のインデックス群がそこに示されます

Objector 33B
ああ。

Hypothesizer 7
ご注意頂きたいのですが、'soffice'コマンドはBasicサブルーチンを非同期に呼び出すので、サブルーチンの完了はログファイルにてチェックしなければなりません。


3: サンプルプログラムを理解する



3-1: ライブラリ群構造


Hypothesizer 7
お気づきになったとおり、3つのライブラリ、'theBiasPlanet_coreUtilities'、'theBiasPlanet_unoUtilities'、'theBiasPlanet_filesConverter'があります。'theBiasPlanet_coreUtilities'には、あらゆる種類のライブラリ群で共用されるように想定されているユーティリティコードが含まれています。'theBiasPlanet_unoUtilities'には、UNOプログラムのライブラリ群で共用されるように想定されているユーティリティコードが含まれています。'theBiasPlanet_filesConverterが、サンプルライブラリです。

ファイルコンバージョン機能は、'theBiasPlanet_unoUtilities'ライブラリの'filesConverting.FilesConverter'疑似クラスにあって、'theBiasPlanet_filesConverter'ライブラリはその疑似クラスを使用しているだけです。

Objector 33B
「疑似クラス」?

Hypothesizer 7
はい。

Objector 33B
...

Hypothesizer 7
...説明をご要求なのは知っております。実は、それは、この記事で説明されています。

Objector 33B
...そんなものを私に読めと言ってるの?

Hypothesizer 7
お嫌であれば、'FilesConverter_convertFile'ファンクションがコンバージョンファンクションであり、その第1引数は、'FilesConverter_FilesConverter'ファンクションによって戻された'FilesConverter' インスタンスを取ることをご理解ください。

Objector 33B
そう言うのであれば...


3-2: コンバート元ファイルをオープンする


Hypothesizer 7
コンバート元ファイルをオープンするには、まず、'com.sun.star.util.URL'オブジェクトを用意しなければなりません。

それは、'theBiasPlanet_unoUtilities.connectionsHandling.UnoObjectsContext'疑似クラスの'createUrlInURL (a_url As String)'メソッドの中で行なわれます。

Objector 33B
...

Hypothesizer 7
申し上げたことがご理解できないのであれば、'UnoObjectsContext_createUrlInURL (a_this As UnoObjectsContext, a_url As String)'ファンクションについて話しているものとご理解ください。

Objector 33B
...オーケー。

Hypothesizer 7
その中で、'com.sun.star.util.URLTransformer'グローバルUNOサービスのインスタンスが生成され(まだ生成されていなければ)、そのインスタンスに実装されている'com.sun.star.util.XURLTransformer'UNOインターフェイスの'parseStrict'メソッドが、'com.sun.star.util.URL'のインスタンスを引数として呼ばれます。

'createUrlInURL (a_url As String)'メソッドがそこに定義されている理由は、UNOオブジェクト群コンテキスト毎に、単一'com.sun.star.util.URLTransformer'グローバルUNOサービスインスタンスしか必要ないことです(URLオブジェクトを用意しなければならない度に毎回新たなUNOサービスインスタンスを取得すると非効率なことになります)。

今や'com.sun.star.util.URL'オブジェクトが用意されたので、コンバート元ファイルが、あるUNOディスパッチコマンド(ディスパッチコマンドURLにファイルURLをセットし、いくつかのファイルオープンプロパティ群を指定する)でオープンされます。

任意のUNOディスパッチコマンドを呼ぶ方法が以前の記事に記述されていますが、ここでは、少し違う方法で行なわれています。ディスパッチャーを取得しなければなりませんが、それは、'theBiasPlanet_unoUtilities.connectionsHandling.UnoObjectsContext'疑似クラスの'getFileOpeningUnoDispatcher ()'メソッドで行なわれています(UNOオブジェクト群コンテキスト当たり、そうした単一のディスパッチャーだけが必要だから)。そのディスパッチャーは、UNOデスクトップUNOオブジェクトに実装されている'com.sun.star.frame.XDispatchProvider' UNOインターフェイスの'queryDispatch'メソッドを、URLに'file:///'をセットし、特殊フレーム名に'_blank'('UnoSpecialFrameNamesConstantsGroup_c_new'の値、新たなフレームが作成されることを意味する)をセットして呼ぶことで取得できます。

次に、そのディスパッチャーに実装されている'com.sun.star.frame.XSynchronousDispatch'UNOインターフェイスの'dispatchWithReturnValue'メソッドを、URLにコンバート元ファイルURLをセットし、いくつかのファイルオープンプロパティを指定して呼びます。

Objector 33A
ふーむ、「UnoPropertiesHandler_buildPropertiesArray」。...それは、プロパティ名群の配列とプロパティ値群の配列から'PropertyValue'群の配列をリターンするのか...

Hypothesizer 7
はい。要は、私たちは、ファイルを、読み取り専用、非表示、新規ビューでオープン、サイレントモードでオープンします。

Objector 33A
ふーむ...

Hypothesizer 7
読み取り専用であるというのは、オープンされたドキュメントが変更できないことを意味するのではなく、そのドキュメントが元のファイルへ格納できないことを意味することにご注意ください。

Objector 33A
分かった。

Hypothesizer 7
とにかく、私たちは、そのUNOディスパッチコマンド実行のリターンとして、ドキュメントUNOオブジェクトを取得します。

Objector 33A
ふーむ。

Hypothesizer 7
実際には、ファイルは、そのUNOディスパッチコマンドによる方法でオープンする必要はありませんが、'soffice --convert-to'が内部的に用いている方法に私は従いました。


3-3: オープンされたドキュメントに手を加える、もしも、あなたがそう望むのであれば


Hypothesizer 7
もしも、オープンされたドキュメントに手を加えたければ、そうできます、ドキュメントUNOオブジェクトをつかんでいるのですから。

例えば、スプレッドシートドキュメントにおいて、特定のスプレッドシートを先頭位置に移動することができます、以下のようにして('a_unoDocument'および'a_tailoringArguments (0)'は、それぞれ、ドキュメントUNOオブジェクトおよびその特定スプレッドシートのインデックスです)。

@Office Basic ソースコード
		Dim l_targetSpreadSheetIndex As Integer
		l_targetSpreadSheetIndex = a_tailoringArguments (0)
		If Not HasUnoInterfaces (a_unoDocument, "com.sun.star.sheet.XSpreadsheetDocument") Then
			MsgBox ("The document is not any spread sheet.")
			Exit Function
		Else
			Dim l_spreadSheetsDocument As Object
			l_spreadSheetsDocument = a_unoDocument
			Dim l_spreadSheets  As Object
			l_spreadSheets = l_spreadSheetsDocument.getSheets ()
			On Error GoTo Catch1
				Dim l_spreadSheet As Object
				l_spreadSheet = l_spreadSheets.getByIndex (l_targetSpreadSheetIndex)
				l_spreadSheets.moveByName (l_spreadSheet.getName (), GeneralConstantsConstantsGroup_c_iterationStartingNumber)
				Exit Function
			Catch1:
				MsgBox ("Error: line number -> " + Erl + ", " + Error)
				Exit Function
		End If

シートを名前によって指定したければ、方法は、上記コードから容易に推測できるでしょう。


3-4: オープンされたドキュメントを指定のフォーマットで格納する


Hypothesizer 7
オープンされたドキュメントを指定のフォーマットで格納するのは、対応するフィルターを通してそのドキュメントを格納することで行なえます。

フィルターは、あるドキュメント格納プロパティとして指定できます。

ドキュメント格納プロパティ群配列は、'theBiasPlanet_filesConverter.programs.FilesConverterConsoleProgram'疑似クラスの'main'メソッド('FilesConverterMacroProgram_main'サブルーチン)内の'l_documentStoringPropertiesArray'という変数にセットされています。

ご覧のとおり、フィルター名は'FilterName'('UnoDocumentStoringEnumerablePropertyNamesSet_c_filterName_string'の値)プロパティにセットされます。

そこに'Password'('UnoDocumentStoringEnumerablePropertyNamesSet_c_password_string'の値)プロパティがありますが、それは、PDFファイル、Microsoft Word Open XML('docx')ファイル、Microsoft Excel Open XML('xlsx')ファイル等には有効ではありません、OpenDocument Text('odt')ファイル、OpenDocument Spreadsheet('ods')ファイル、Microsoft Word('.doc')、Microsoft Excel('.xls')ファイル等には有効ですが。

PDFファイル等のパスワードはあるフィルター固有プロパティにセットできます、そうしたフィルター固有の詳細には、ここでは立ち入りませんが(それらは、将来のいくつかの記事(Office Open XMLファイル用はこちら)でご覧ください)。

とにかく、オープンされたドキュメントは、そのドキュメントUNOオブジェクトに実装されている'com.sun.star.frame.XStorable2' UNOインターフェイスの'storeToURL'メソッドを呼ぶことによって格納できます、ファイルURLとプロパティ群配列を指定して。


3-5: オープンされたドキュメントをクローズする


Hypothesizer 7
オープンされたドキュメントは、そのドキュメントUNOオブジェクトに実装されている'com.sun.star.util.XCloseable' UNOインターフェイスの'close'メソッドを呼ぶことによってクローズできます、'false'を指定して('false'の意味を説明する必要はここではないでしょう)。


3-6: このファイルコンバーター疑似クラスの使用方法


Hypothesizer 7
ファイルコンバーター疑似クラス('theBiasPlanet_unoUtilities.filesConverting.FilesConverter')は、UNOオブジェクト群コンテキスト毎に単一のインスタンスだけが存在するように意図されています、ファイルコンバージョン毎にインスタンスを作成しても何も問題はありませんが(効率面を除けば)。

'convertFile'メソッドはドキュメントテーラー名およびそのドキュメントテーラーへの引数群を受け付けるので、オープンされたドキュメントには、格納する前に手を加えることができます。...別のプログラミング言語のサンプルでは、'convertFile'メソッドは、テーラリングロジックを、ドキュメントテーラーサブクラスインスタンスを受け取ることで受け取りますが、そのメカニズムは本Basicサンプルでは通用しません、なぜなら、Basicはサブクラス化をサポートしないからです(というか、実際には、クラス化そのものをサポートしない)。...したがって、'UnoDocumentTailor'疑似クラスの'tailor (a_unoDocument As Object, a_tailorName As String, a_tailoringArguments () As Variant)'メソッドを直接に変更して特定のニーズ用のロジックを追加し、'a_tailorName'引数によってそのロジックが選択されるようにする必要があります。

実際、サンプルプログラム内で指定されている'UnoSpreadSheetsDocumentMoveSpecifiedSheetTo1stPositionTailor'というテーラー名が、指定されたスプレッドシートを先頭位置に移動するロジックに対応しています。


4: 結びとその先


Hypothesizer 7
これで、私たちは、Office BasicでUNO APIを直接使用してファイルをコンバートする方法を理解しました。

ドキュメントUNOオブジェクトへのアクセスを得たので、ドキュメントを望みのフォーマットで格納する前に、ドキュメントに何らかの手を加えることもできます、そういうドキュメントを操作する方法(任意のワードプロセッサードキュメントの任意のページのサイズをセットする任意のスプレッドシートドキュメントの任意のページのサイズをセットするOfficeドキュメントファイルに編集パスワードをセットする(Office Open XMLフォーマット群用)、等)を知ってさえいれば。

もしも、ファイルをコンバートするのではなくファイルに手を加えたいというのであれば、手を加えたドキュメントを元のファイルに元のファイルフォーマットで上書き格納すればよい(勿論、1つのファイルオープンプロパティを読み取り専用でなくなるように変更する必要があります)だけです。

それはとても容易なので、不便を忍びながらサードパーティ製ツールや'soffice --convert-to'を使う必要はありません。UNO APIを直接使用するのが、最も効率的で、最も制約の少ない方法です。


参考資料


<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>