Top > OOobbs2 > 4

OOobbs2/4 Edit

  • サマリ: PDF エクスポート引数の与え方と PDF エクスポートマクロ
  • 環境: General
  • 状態: 投稿
  • 投稿者: はにゃ??
  • 投稿日: 2006-10-06 (金) 17:39:29

質問 Edit

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

回答 Edit


感想,コメント,メモ Edit

  • Writer ドキュメントでしか試していないので、フィルター名を取得するところで失敗するかもしれません。 -- はにゃ?? 2006-10-06 (金) 17:49:37
  • はにゃさんありがとう! Debianで実行できました。ただし、上記のコマンドラインのままでは、bashがエラーを返したので、シングルクォートで囲むようにし、以下のコマンドラインで実行しました。パッケージにできるとうれしい。(パラグラフ編集機能を使ったら、あやうくページのメイン部分を削除するところでした) -- M.Kamataki 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

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

filePDF_Export.uno.pkg

パッケージの使い方。

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

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)'
  • はにゃ?? 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 から指定できないのはなぜ…?。

  • はにゃ?? 2006-10-07 (土) 13:10:26
  • 素晴らしい! なんと、ワードファイルも変換できました。これに単独で動作するGUIの側をかぶせると受けないかな。 -- catch? 2006-10-07 (土) 16:06:19
  • GUI ですか、始めの目的からずれていきますけど、
soffice -minimized -norestore -invisible "macro:///PDF_Export.Module1.Export_PDF()"

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

  • はにゃ?? 2006-10-07 (土) 16:10:38
  • マクロに引数を与えないときに、ファイルの選択ダイアログを開くようにしたものを作成。エクスポートフィルターに WebDocument を追加したので、HTML ファイルも可。あとGlobalDocument も。画像ファイル PNG などだと、中央に配置された PDF ファイルになってしまう。選択しても PDF エクスポートはうまくいかないらしい。
  1. 開く
  2. 選択
  3. 実際のサイズ
  4. ページのサイズを画像サイズと同じにする
  5. 画像を 0,0 の位置に配置
  6. エクスポート

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

filePDF_Export_2.uno.pkg

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

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

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

fileOOoExpPDF.zip

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

fileDokodemoPDF01.zip



Attach file: filePDF_Export_2.uno.pkg 1084 download [Information] fileOOoExpPDF.zip 1173 download [Information] filePDF_Export.uno.pkg 1432 download [Information] fileDokodemoPDF01.zip 747 download [Information]

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