OOobbs2/4
質問
PDF ファイルなどのエクスポートフィルターに与える引数がごちゃごちゃしていてわかりにくいので。 フィルター名 FilterName など以外に、フィルター専用のオプションは FilterData にプロパティ値として与えます。 aArg1(0).Name = "InitialView" aArg1(0).Value = 2 aArg1(1).Name = "PageLayout" aArg1(1).Value = 3 aArgs(0).Name = "FilterName" aArgs(0).Value = sFilterName aArgs(2).Name = "FilterData" aArgs(2).Value = aArg1() フィルターに与えるオプションの種類と値、および説明は次のファイルを参照。 OpenOffice.org 2.0\share\registry\schema\org\openoffice\Office\Common.xcs 以下のマクロを OpenOffice.org のアプリケーションライブラリの Standard.Module1 などに入れておく。 Sub Export_PDF( sIn As String, sOut As String ) Dim aArgs(2) As New com.sun.star.beans.PropertyValue Dim aArg1(1) As New com.sun.star.beans.PropertyValue Dim aInArg(0) As New com.sun.star.beans.PropertyValue Dim oSource As Object sInURL = ConvertToURL(sIn) sOutURL = ConvertToURL(sOut) aInArg(0).Name = "Hidden" aInArg(0).Value = true oSource = StarDesktop.loadComponentFromURL( _ sInURL, "_blank", 0, aInArg() ) sFilterName = GetPDFFilterName(oSource) If NOT (sFilterName = "") Then aArg1(0).Name = "InitialView" aArg1(0).Value = 0 aArg1(1).Name = "PageLayout" aArg1(1).Value = 0 aArgs(0).Name = "FilterName" aArgs(0).Value = sFilterName aArgs(1).Name = "Overwrite" aArgs(1).Value = true aArgs(2).Name = "FilterData" aArgs(2).Value = aArg1() oSource.storeToURL(sOutURL, aArgs()) End If oSource.close(true) End Sub Function GetPDFFilterName( oDoc As Object ) As String sDocType = oDoc.SupportedServiceNames Select Case true Case oDoc.supportsService("com.sun.star.text.TextDocument") GetPDFFilterName = "writer_pdf_Export" Case oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") GetPDFFilterName = "calc_pdf_Export" Case oDoc.supportsService("com.sun.star.presentation.PresentationDocument") GetPDFFilterName = "impress_pdf_Export" Case oDoc.supportsService("com.sun.star.drawing.DrawingDocument") GetPDFFilterName = "draw_pdf_Export" Case oDoc.supportsService("com.sun.star.formula.FormulaPropertyies") GetPDFFilterName = "math_pdf_Export" End Select End Function コマンドラインからこのマクロを呼び出すには、マクロが OpenOffice.org のアプリケーションライブラリにあるときには次のようにする。 soffice macro:///Standard.Module1.Export_PDF(C:/usr/ss.odt,C:/usr/ss.pdf) ファイル名はフルパスで指定しないといけない。 CurDir でディレクトリ名を取得すればいいのかもしれないが、判定に環境の違いを含めるのは面倒。 上記のようにして呼び出すと、OpenOffice.org の起動絵が出るが、オプションで抑制できる。 -minimized -norestore -invisible など。絵が出ないようにするには、-minimized だけで十分。 マクロの引数がないときには、ファイル選択ダイアログを表示するように変更 soffice -nologo "macro:///PDF_Export.Module1.Export_PDF()" のように、引数が入っていないときに選択ダイアログを表示する。 Sub Export_PDF( Optional sIn As String,Optional sOut As String ) Dim aArgs(2) As New com.sun.star.beans.PropertyValue Dim aArg1(0) As New com.sun.star.beans.PropertyValue Dim aInArg(0) As New com.sun.star.beans.PropertyValue Dim oSource As Object On Error Goto ErrorHandler If IsMissing(sIn) Then sInURL = GetFileURL(0) Else sInURL = ConvertToURL(sIn) End If If IsMissing(sOut) Then sOutURL = GetFileURL(1) Else sOutURL = ConvertToURL(sOut) End If If NOT (sInURL = "" OR sOutURL = "") Then aInArg(0).Name = "Hidden" aInArg(0).Value = true oSource = StarDesktop.loadComponentFromURL( _ sInURL, "_blank", 0, aInArg() ) sFilterName = GetPDFFilterName(oSource) If NOT (sFilterName = "") Then aArg1(0).Name = "InitialView" aArg1(0).Value = 0 aArgs(0).Name = "FilterName" aArgs(0).Value = sFilterName aArgs(1).Name = "Overwrite" aArgs(1).Value = true aArgs(2).Name = "FilterData" aArgs(2).Value = aArg1() oSource.storeToURL(sOutURL, aArgs()) oSource.close() Else oSource.close() Exit Sub End If Else Exit Sub End If Exit Sub ErrorHandler: If NOT IsNull(oSource) Then oSource.close(true) End If End Sub Function GetPDFFilterName( oDoc As Object ) As String sDocType = oDoc.SupportedServiceNames Select Case true Case oDoc.supportsService("com.sun.star.text.GlobalDocument") GetPDFFilterName = "writer_globaldocument_pdf_Export" Case oDoc.supportsService("com.sun.star.text.WebDocument") GetPDFFilterName = "writer_web_pdf_Export" Case oDoc.supportsService("com.sun.star.text.TextDocument") GetPDFFilterName = "writer_pdf_Export" Case oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") GetPDFFilterName = "calc_pdf_Export" Case oDoc.supportsService("com.sun.star.presentation.PresentationDocument") GetPDFFilterName = "impress_pdf_Export" Case oDoc.supportsService("com.sun.star.drawing.DrawingDocument") GetPDFFilterName = "draw_pdf_Export" Case oDoc.supportsService("com.sun.star.formula.FormulaPropertyies") GetPDFFilterName = "math_pdf_Export" End Select End Function 'nType 0: OpenMode, 1: SaveMode Function GetFileURL( nType As Integer ) As String Dim oFilePicker As Object oFilePicker = createUnoService( _ "com.sun.star.ui.dialogs.FilePicker" ) If nType = 0 Then With oFilePicker .appendFilter( "All Files (*.*)", "*.*" ) .appendFilter( "OOo Files (odt, ods, odp, odg, odf)", _ "*.odt;*.ods;*.odp;*.odg;*.odf;*.sxw;*.sxc;*.sxi;*.sxd;*.sxm" ) .appendFilter( "MS Files (doc, xls, ppt)", _ "*.doc;*.xls;*.ppt" ) .appendFilter( "Text Type (txt, rtf, html)", _ "*.txt;*.rtf;*.html;*.htm" ) .setCurrentFilter( "All Files (*.*)" ) .setTitle("PDF に変換するファイルを選択してください") End With Elseif nType = 1 Then Dim nAny(0) nAny(0) = _ com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_AUTOEXTENSION oFilePicker.Initialize( nAny() ) Dim nContentID As Integer nContentID = _ com.sun.star.ui.dialogs.ExtendedFilePickerElementIds.CHECKBOX_AUTOEXTENSION oFilePicker.setValue( nContentID, 0, True ) With oFilePicker .appendFilter( "All Files (*.*)", "*.*" ) .appendFilter( "PDF Files (*.pdf)", "*.pdf" ) .setCurrentFilter( "PDF Files (*.pdf)" ) .setTitle("PDF ファイルの保存先を選択してください") End With End If Dim nAccept As Integer nAccept = oFilePicker.execute() If nAccept = 1 Then sFiles() = oFilePicker.getFiles() sFileURL = sFiles(0) GetFileURL () = sFileURL Else GetFileURL () = "" End If End Function 回答
感想,コメント,メモ
ライブラリ名やモジュール名が長いと思う人は適当に変更してください。 パッケージの使い方。
Windows だと soffice -minimized -norestore -invisible macro:///PDF_Export.Module1.Export_PDF(C:/usr/ss.odt,C:/usr/ss.pdf) Windows だとこのままで通りますが、ファイルのパス名にスペースなどが含まれるときには、" ダブルクォートでくくります。 soffice -minimized -norestore -invisible "macro:///PDF_Export.Module1.Export_PDF(C:/usr/ss.odt,C:/usr/ss.pdf)" bash shell だと、こちらでは ' シングルクォートでくくる (らしい) $ soffice -minimized -norestore -invisible \ 'macro:///PDF_Export.Module1.Export_PDF(/home/user/test.odt,/home/user/test.pdf)'
上記の方法でインストールするとインストールしたユーザーしか使用できないことに注意。 unopkg add --shared PDF_Export.uno.pkg とすれば share ライブラリに入る。Gui からはできない?。削除は unopkg remove --shared PDF_Export.uno.pkg 誰もこんなことしないはずだけど、unopkg の使い方だけ。上書きのオプションが Gui から指定できないのはなぜ…?。
soffice -minimized -norestore -invisible "macro:///PDF_Export.Module1.Export_PDF()" だけで起動して、読み込むファイルの選択ダイアログと保存先の選択ダイアログを表示するとかなら、簡単でいいですね。
とすればうまくいくかも。でも、draw ドキュメントとして認識されるから、オブジェクト数が 1 のときだけ上記の動作をとればいいのか…?開いたときのフィルター名で判断するのは面倒。
ダイアログ付きマクロは、ドキュメント変換ウィザードの機能拡張版(doc-odfだけじゃなく、PDFやHTMLにも対応)にしたら、使い手があるかも知れませんね。言ってるばっかりでスミマセン。
|