Top > OOobbs2 > 4
** [[OOobbs2/4]] [#ha03a4db]
-''サマリ'': PDF エクスポート引数の与え方と PDF エクスポートマクロ
-''環境'': General
-''状態'': 投稿
-''投稿者'': [[はにゃ?]]
-''投稿日'': 2006-10-06 (金) 17:39:29
*** 質問 [#l9220d6a]

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
*** 回答 [#b0f6858e]

#comment


*** 感想,コメント,メモ [#r50994ad]
- Writer ドキュメントでしか試していないので、フィルター名を取得するところで失敗するかもしれません。 -- [[はにゃ?]] &new{2006-10-06 (金) 17:49:37};
- はにゃさんありがとう! Debianで実行できました。ただし、上記のコマンドラインのままでは、bashがエラーを返したので、シングルクォートで囲むようにし、以下のコマンドラインで実行しました。パッケージにできるとうれしい。(パラグラフ編集機能を使ったら、あやうくページのメイン部分を削除するところでした) -- M.Kamataki &new{2006-10-07 (土) 11:24:47};
 $ soffice -minimized -norestore -invisible \
 'macro:///Standard.Module1.Export_PDF(/home/user/test.odt,/home/user/test.pdf)'
- パッケージを作りました。ライブラリが Standard のままで unopkg を使うと、モジュールが存在するときはエラーなしでインストールが終わったのに、パッケージの中身が無視されたのでライブラリ名を変更しました。ライブラリ名 PDF_Export

ライブラリ名やモジュール名が長いと思う人は適当に変更してください。

&ref(PDF_Export.uno.pkg);

パッケージの使い方。
+パッケージをダウンロード
+OpenOffice.org を起動する
+ツールメニュー - パッケージマネージャ - マイパッケージを選択した状態で、追加ボタン
+ダウンロードしたパッケージファイルを選択

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

-- [[はにゃ?]] &new{2006-10-07 (土) 12:58:29};
- OpenOffice.org がインストールされているディレクトリにパスが通っているなら
 unopkg add PDF_Export.uno.pkg
でインストールできる。

上記の方法でインストールするとインストールしたユーザーしか使用できないことに注意。

 unopkg add --shared PDF_Export.uno.pkg

とすれば share ライブラリに入る。Gui からはできない?。削除は
 unopkg remove --shared PDF_Export.uno.pkg

誰もこんなことしないはずだけど、unopkg の使い方だけ。上書きのオプションが Gui から指定できないのはなぜ…?。

-- [[はにゃ?]] &new{2006-10-07 (土) 13:10:26};
- 素晴らしい! なんと、ワードファイルも変換できました。これに単独で動作するGUIの側をかぶせると受けないかな。 -- [[catch]] &new{2006-10-07 (土) 16:06:19};
- GUI ですか、始めの目的からずれていきますけど、

 soffice -minimized -norestore -invisible "macro:///PDF_Export.Module1.Export_PDF()"

だけで起動して、読み込むファイルの選択ダイアログと保存先の選択ダイアログを表示するとかなら、簡単でいいですね。

-- [[はにゃ?]] &new{2006-10-07 (土) 16:10:38};
- マクロに引数を与えないときに、ファイルの選択ダイアログを開くようにしたものを作成。エクスポートフィルターに WebDocument を追加したので、HTML ファイルも可。あとGlobalDocument も。画像ファイル PNG などだと、中央に配置された PDF ファイルになってしまう。選択しても PDF エクスポートはうまくいかないらしい。

+開く
+選択
+実際のサイズ
+ページのサイズを画像サイズと同じにする
+画像を 0,0 の位置に配置
+エクスポート

とすればうまくいくかも。でも、draw ドキュメントとして認識されるから、オブジェクト数が 1 のときだけ上記の動作をとればいいのか…?開いたときのフィルター名で判断するのは面倒。

&ref(PDF_Export_2.uno.pkg);

-- [[はにゃ?]] &new{2006-10-08 (日) 14:15:49};

- ダイアログ付きマクロありがとうございます。 でも、少し想像していたのとは、ちがってたりするんです。スミマセン。私の想像していたのは、OOoとは独立したユーティリティで、たとえばdocファイルをドラッグ&ドロップしたら、背後でこっそりOOoが立ち上がって、PDFに変換するようなツールです。Microsoft Officeを使っている人たちに、PDF変換機能だけ利用するためだけに、OOoをインストールしてもらえたら面白いかなと。

ダイアログ付きマクロは、ドキュメント変換ウィザードの機能拡張版(doc-odfだけじゃなく、PDFやHTMLにも対応)にしたら、使い手があるかも知れませんね。言ってるばっかりでスミマセン。

-- [[catch]] &new{2006-10-08 (日) 15:11:26};
- GUI ・・・。ruby + exerb + VisualuRuby OOo にパスが通っていないと使えない・・・。設定のダイアログ作るらないといけないのか・・・。ということで、パスが通っていないと使えないものを作成。上書きは試してません。

&ref(OOoExpPDF.zip);


-- [[はにゃ?]] &new{2006-10-08 (日) 20:45:47};
- OOoExpPDF動きました! これは、すごいぞ。上書きもOK! ありがとうございます。  -- [[catch]] &new{2006-10-09 (月) 10:52:09};
- お世話になります。[[OOobbs2/32]]で紹介したセミナー資料ですが、こちらのBasicをもとにした「どこでもPDF」というものを紹介しています。こちらもいずれ、公開を考えています。もちろんはにゃ?さんのコードも含まれています。公開時にはライセンスをLGPLとしたいのですが、よろしいでしょうか。 -- M.Kamataki &new{2007-07-13 (金) 10:11:52};
- 自由に使ってもらってかまいません。 -- [[はにゃ?]] &new{2007-07-13 (金) 11:15:16};
- 正式公開ではありませんが、Basicで質問もしたいので、こちらにいったんアップします。上記のセミナー資料で紹介した「どこでもPDF」です。 -- M.Kamataki &new{2007-07-14 (土) 11:39:11};

&ref(DokodemoPDF01.zip);
- どこでもPDFがMOONGIFTで紹介されていました。早っ! http://www.moongift.jp/2007/07/dokodemopdf/ -- M.Kamataki &new{2007-07-19 (木) 10:49:04};

#comment

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes