Excel, Word, PowerPointによるPDF出力

〜 ExportAsFixedFormatメソッドの利用 〜

2015/05/28

 当サイトは、pdf_out.zipに含まれている pdf_out.txt をWebに掲載したものです。

 2015/05/28時点で最新の exlap.rb, wrdap.rb, pptap.rb が同梱されています。この3つは、Excel, Word, PowerPointを自動操縦するためのruby用ライブラリです。


《目次》


<はじめに>

 ここでは、Excel, Word, PowerPointを自動操縦してPDFファイルを出力する方法を記します。rubyのwin32oleを利用します。

 当然ながら、これら3つのMS-Officeソフトがインストールされていることを前提にします。ExportAsFixedFormatメソッドを利用します。Office2007以降でないと使えない方法なので注意して下さい。

    

 また、拙作 exlap.rb, wrdap.rb, pptap.rb を用います。いずれもrubyライブラリです。zip圧縮ファイルに同梱してあります。

 exlap.rbなどにpdf_outメソッドを設けました。その説明も加えます。

    

 ExportAsFixedFormatは、印刷する代わりにPDFまたはXPSのファイルに書き出すものです。

 印刷範囲を設定してあると、その範囲だけを書き出すことができます。

 といっても、印刷範囲の設定がどうなっているかに関係なく、全部をファイルに書き出すのがデフォルトになっています。

    

 下に掲げるrubyスクリプトを私が試した環境は次のとおり。

    

※ XPS(XML Paper Specification)は、マイクロソフト社が開発した電子文書記述のフォーマットです。XPSの閲覧ソフトが無償配布されており、それを利用すれば、相手のコンピュータの機種や環境によらず、オリジナルのイメージを正確に再生できるようです。

△ 目次に戻る


1. ExcelによるPDFファイルの出力

 ExcelのExportAsFixedFormatメソッドについて記します。

    

(1) サンプルスクリプト

 変数wbにExcelのワークブックオブジェクトが代入されている場合、wb.ExportAsFixedFormat() を用いると、PDFファイルを書き出すことができます。

 まずはサンプルスクリプトを示します。rubyスクリプトです。拙作exlap.rbを用います。

 素材データは日本のGDPの推移です。

 test01.xls, test01.pdfが既に存在していればそれを削除し、その上で test01.xlsを作成して、それをPDFファイルに出力します。

 ExportAsFixedFormatは、PDFファイルを上書きで出力するようなので、予め既存のPDFファイルを削除する必要はないと思いますが、念のため削除しています。

    

−−−− pdf01.rb ここから
# encoding: Windows-31J
require "exlap"
xls_file = "test01.xls"
File.unlink(xls_file)  if test(?e, xls_file)
pdf_file = "test01.pdf"
File.unlink(pdf_file)  if test(?e, pdf_file)
data_ary = Exl::str2ary(DATA.read, ",")
Exlap.new(xls_file) do |wb|  # Excelを起動しtest01.xlsを開く
  ss = wb.fes  # 空のワークシートを選択
  ss.from_a(data_ary)  # 素材データの書き込み
  ss.range_autofit  # セル幅を自動調整
  ss.range_doublebox  # 罫線を引く
  wb.save  # ワークブックの保存
  wb.ExportAsFixedFormat('Type'=>XlTypePDF,
      'Filename'=>Exl::fullpath(pdf_file),
      'Quality'=>XlQualityStandard)
end

__END__
日本のGDP,(単位: 10億円)
年,名目GDP,実質GDP
2010,482384.40,512364.20
2011,471310.80,510044.60
2012,473784.30,517513.60
2013,478075.30,525365.80
2014,488609.54,530047.22
−−−− pdf01.rb ここまで

    

 ExportAsFixedFormatは、ワークブックオブジェクトだけでなく、ワークシート、チャート(Chart)、レンジ(Range)オブジェクトについても適用できます。

 なので、上のpdf01.rbにおいて wb.ExportAsFixedFormat を ss.ExportAsFixedFormat と書き換えても動きます。1枚のワークシートだけをPDF出力したい時にそうします。

 今回、ワークブックには3枚のワークシートがあるわけですが、2枚目と3枚目は空なので、PDFで書き出されるのは1枚目のシートのみです。したがって、ExportAsFixedFormatをワークブックに適用してもワークシートに適用しても、結果は同じです。

△ 目次に戻る

(2) ExcelのExportAsFixedFormatメソッドの引数

 ExcelのExportAsFixedFormatにおける引数について、要点を記します。

    

a. Type

 保存形式を指定、必須項目。

 使用できる定数は次のとおり。

定数名 数値 説明
XlTypePDF 0 PDF形式で保存
XlTypeXPS 1 XPS形式で保存

    

b. Filename

 保存するPDFファイルの名前。省略可能。

 フルパス名でない場合、私が試したかぎりでは、カレントディレクトリではなくユーザーのドキュメントフォルダに書き出されるようです。

 省略した場合は、ワークブックの名前の拡張子を .pdf に変更したファイル名で、ユーザーのドキュメントフォルダに出力されます。XPS形式を選んだ時は、拡張子 .xps になります。

 ユーザーのドキュメントフォルダは、ユーザー名が taro の場合、「C:\Users\taro\Documents」です。

    

c. Quality

 PDFの質を指定。省略可能。

 次の値を指定可能。

定数名 数値 説明
XlQualityStandard 0 標準の品質
XlQualityMinimum 1 最小限の品質

    

d. IncludeDocProperties

 trueまたはfalseを指定。省略可能。

 ドキュメントプロパティが含まれていることを示す場合はtrueに設定し、省略されていることを示す場合はfalseに設定します。

    

e. IgnorePrintAreas

 trueまたはfalseを指定。省略可能。

 trueに設定すると、出力する場合に印刷範囲が無視されます。falseに設定すると、出力する場合に印刷範囲が使用されます。

    

f. From

 省略可能。

 出力を開始するページのページ番号を指定します。この引数を省略すると、先頭のページから出力が開始されます。

    

g. To

 省略可能。

 出力を終了するページの番号を指定します。この引数を省略すると、最後のページまで出力します。

    

h. OpenAfterPublish

 trueまたはfalseを指定。省略可能。

 trueに設定すると、ファイルが閲覧ソフトで表示されます。falseに設定すると、ファイルは書き出されますが表示はされません。

    

i. FixedFormatExtClassPtr

 省略可能。

 FixedFormatExtクラスへのポインター。

△ 目次に戻る

(3) 印刷範囲を指定して一部のみ出力

 Excelで印刷範囲を指定する時は、ワークシートの PageSetup.PrintArea を用います。

 これにより、印刷範囲をA1:C3にしておくと、その部分だけをPDFに書き出すことができます。

 その場合、ExportAsFixedFormatの IgnorePrintAreas という引数をfalseにします。

 pdf01.rbを少し書き換えて、A1:C3の部分だけをPDFに出力するスクリプトを示します。該当箇所のみ掲げます。

    

−−−− pdf02.rb ここから
  (前略)
  wb.save  # ワークブックの保存
  ss.PageSetup.PrintArea = ss.Range("A1:C3").Address  # 印刷範囲設定
  ss.ExportAsFixedFormat('Type'=>XlTypePDF,
      'Filename'=>Exl::fullpath(pdf_file),
      'Quality'=>XlQualityStandard,
      'IgnorePrintAreas'=>false)
  ss.PageSetup.PrintArea = ""  # 印刷範囲を解除
  (後略)
−−−− pdf02.rb ここまで

    

 引数 IgnorePrintAreas が特に指定されなかった時は、おそらくtrueとみなされるのだと思います。つまり、印刷範囲が設定してあっても、それを無視してPDFを書き出します。

 ちなみに、上の pdf02.rb では、ワークシートにExportAsFixedFormatを適用しましたが、ワークブックに適用しても、やはり印刷範囲だけがPDFに出力されます。

△ 目次に戻る


2. MS-WordによるPDFファイルの出力

 MS-WordのExportAsFixedFormatメソッドについて記します。

    

(1) サンプルスクリプト

 変数docにMS-Wordのドキュメントオブジェクトが代入されている場合、doc.ExportAsFixedFormat() を用いると、PDFファイルを書き出すことができます。

 まずはサンプルスクリプトを示します。rubyスクリプトです。拙作wrdap.rbを用います。

 素材データは、芥川龍之介の「杜子春」(とししゅん)の冒頭部分です。

    

−−−− pdf03.rb ここから
# encoding: Windows-31J
require "wrdap"
lines = DATA.read.split(/\n/)  # 素材データ
doc_file = "test03.doc"
File.unlink(doc_file)  if test(?e, doc_file)
pdf_file = "test03.pdf"
File.unlink(pdf_file)  if test(?e, pdf_file)
Wrdap.new(doc_file) do |doc|  # ワードを起動しtest03.docを開く
  slc = doc.Application.Selection
  lines.each do |line|
    slc.TypeText line  # 1行入力
    slc.TypeParagraph()  # エンターキーを押すことに相当
  end
  doc.save  # ワード文書の保存
  doc.ExportAsFixedFormat('OutputFileName'=>Wrd::fullpath(pdf_file),
      'ExportFormat'=>WdExportFormatPDF,
      'OptimizeFor'=>WdExportOptimizeForPrint,
      'Range'=>WdExportAllDocument)
end

__END__
杜子春
芥川龍之介
 或春の日暮です。
 唐の都洛陽の西の門の下に、ぼんやり空を仰いでいる、一人の若者がありました。
 若者は名を杜子春といって、元は金持の息子でしたが、今は財産を費い尽して、その日の暮しにも困る位、憐な身分になっているのです。
−−−− pdf03.rb ここまで

    

 ExportAsFixedFormatにわたす引数は、最初の2つだけでもいいと思いますが、参考まで記してみました。

△ 目次に戻る

(2) MS-WordのExportAsFixedFormatメソッドの引数

 WordのExportAsFixedFormatにおける引数について、要点を記します。

    

a. OutputFileName

 出力ファイル名。

 これがフルパス名でない場合、カレントディレクトリではなくユーザーのドキュメントフォルダに書き出されるようです。

    

b. ExportFormat

 保存形式を指定。

 次の値のどれかを指定。

定数名 数値 説明
WdExportFormatPDF 17 PDF形式で保存
WdExportFormatXPS 18 XPS形式で保存

    

c. OpenAfterExport

 trueまたはfalseを指定。省略可能。

 出力したファイルを閲覧ソフトで自動的に開く場合はtrue。それ以外の場合はfalse。

    

d. OptimizeFor

 印刷用に最適化するか、画面用に最適化するかのいずれかを指定。省略可能。

 省略時は「印刷用」(数値0)。

 次の値を指定可能。

定数名 数値 説明
WdExportOptimizeForPrint 0 印刷用。質が高くファイルサイズが大。
WdExportOptimizeForOnScreen 1 画面用。質は落ちるがファイルサイズが小。

    

e. Range

 PDFとして書き出す範囲。省略可能。

 PDFとして書き出す範囲が、文書全体、現在の選択箇所、現在のページ、またはテキストの範囲のいずれであるかを指定。

 省略時は文書全体(数値0)。

 次の値を指定可能。

定数名 数値 説明
WdExportAllDocument 0 文書全体
WdExportSelection 1 現在の選択箇所
WdExportCurrentPage 2 現在のページ
WdExportFromTo 3 テキストの範囲。始点と終点を別途指定。

    

f. From

 開始ページ番号。省略可能。

 引数RangeがWdExportFromTo(テキストの範囲)に設定されている場合、開始ページ番号を指定。

 省略時は数値1。

    

g. To

 終了ページ番号。省略可能。

 引数RangeがWdExportFromTo(テキストの範囲)に設定されている場合、終了ページ番号を指定。

 省略時は数値1。

    

h. Item

 マークアップを含めるか否か。省略可能。

 PDFを出力する際、テキストのみを含めるか、テキストをマークアップ付きで含めるかを指定。

 省略時はマークアップを含めない(数値0)。

 次の値を指定可能。

定数名 数値 説明
WdExportDocumentContent 0 マークアップなし
WdExportDocumentWithMarkup 7 マークアップ付き

    

i. IncludeDocProps

 文書のプロパティを含めるか否か。省略可能。

 PDFファイルに文書のプロパティを含める場合はtrue。それ以外の場合はfalse。

    

j. KeepIRM

 trueまたはfalse。省略可能。

 ソース文書がIRM(Information Rights Management)によって保護されている場合、IRMアクセス許可を XPS文書にコピーする場合はtrue。それ以外の場合はfalse。

 省略時はtrue。

    

k. CreateBookmarks

 ブックマークの含め方。省略可能。

 ブックマークをPDFファイルに書き出すかどうか、および出力する場合のブックマークの型を指定。

 省略時はブックマークを出力しない(数値0)。

 次の値を指定可能。

    

    

l. DocStructureTags

 trueまたはfalse。省略可能。

 スクリーンリーダーにとって有用な追加データ(コンテンツのフローや論理構成など)を含める場合はtrue。それ以外の場合はfalse。

 省略時はtrue。

    

m. BitmapMissingFonts

 ビットマップを含めるか否か。省略可能。

 テキストのビットマップを含める場合はtrue。テキストフォントを参照する場合はfalse。

 フォントのライセンスでPDFファイルへのフォントの埋め込みを許可しない場合は、この引数をtrueに設定します。

 この引数をfalseに設定した場合、指定されたフォントが表示先のコンピューターで使用できない時は、適切なフォントに置き換えられます。

 省略時はtrue。

    

n. UseISO19005_1

 trueまたはfalse。省略可能。

 PDFの使用をISO19005-1として標準化されているPDFのサブセットに限定する場合はtrue。それ以外の場合はfalse。

 この引数をtrueに設定すると、結果ファイルの独立性は高まりますが、形式の制限が原因で、サイズが大きくなったり、ビジュアル アイテムの表示が増加したりする場合があります。

 省略時はfalse。

    

o. FixedFormatExtClassPtr

 文書を別の固定形式で保存できるようにするIMsoDocExporter インターフェイスの実装へのポインター。

△ 目次に戻る

(3) 範囲指定して文書の一部を出力

 文書の一部のみを出力するには、出力したい範囲をRangeとして予め設定した上で、ExportAsFixedFormatの引数RangeをWdExportSelection(現在の選択箇所:数値1)にします。

 そのサンプルを下に掲げます。第1〜第3パラグラフのみをPDFに出力します。pdf03.rbを少し書き換えたものです。該当箇所のみ示します。

    

−−−− pdf04.rb ここから
  (前略)
  doc.save  # ワード文書の保存
  rs = doc.Paragraphs(1).Range.Start
  re = doc.Paragraphs(3).Range.End
  doc.Range('Start'=>rs, 'End'=>re).Select
  doc.ExportAsFixedFormat('OutputFileName'=>Wrd::fullpath(pdf_file),
      'ExportFormat'=>WdExportFormatPDF,
      'OptimizeFor'=>WdExportOptimizeForPrint,
      'Range'=>WdExportSelection)
  (後略)
−−−− pdf04.rb ここまで

△ 目次に戻る


3. PowerPointによるPDFファイルの出力

 PowerPointのExportAsFixedFormatメソッドについて記します。

    

(1) サンプルスクリプト

 変数presenにPowerPointのプレゼンテーションオブジェクトが代入されている場合、presen.ExportAsFixedFormat() を用いると、PDFファイルを書き出すことができます。

 まずはサンプルスクリプトを示します。rubyスクリプトです。拙作pptap.rbを用います。

 人口の多いの都道府県4つについて、その人口、面積、人口密度を表で示します。

    

−−−− pdf05.rb ここから
# encoding: Windows-31J
require "pptap"
data_ary = eval(DATA.read)  # 素材データの取込み
ppt_file = "test05.ppt"
File.unlink(ppt_file)  if test(?e, ppt_file)
pdf_file = "test05.pdf"
File.unlink(pdf_file)  if test(?e, pdf_file)
Pptap.new(ppt_file) do |presen|  # PowerPointを起動しtest05.pptを開く
  new_slide = presen.Slides.Add('Index'=>presen.Slides.Count+1,
      'Layout'=>PpLayoutTitleOnly)
  new_slide.Shapes.Title.TextFrame.TextRange.Text = "H24年人口等"
  shp = new_slide.Shapes.AddTable('NumRows'=>data_ary.size,
      'NumColumns'=>data_ary[0].size)
  for i in 1..data_ary.size
    row = data_ary[i-1]
    for j in 1..row.size
      shp.Table.Cell(i,j).Shape.TextFrame.TextRange.Text = row[j-1]
    end
  end
  presen.save  # test05.pptを保存
  presen.PrintOptions.Ranges.ClearAll  # 印刷範囲をクリア
  prng = presen.PrintOptions.Ranges.Add(1,1)  # 印刷範囲の設定
  presen.ExportAsFixedFormat('Path'=>Pptm::fullpath(pdf_file),
      'FixedFormatType'=>PpFixedFormatTypePDF,
      'PrintRange'=>prng)
end

__END__
[["都道府県", "人口", "面積", "人口密度"],
    ["東京", 13216221, 2188.67, 6038.47],
    ["神奈川", 9072133, 2415.86, 3755.24],
    ["大阪", 8863324, 1901.42, 4661.42],
    ["愛知", 7425952, 5165.14, 1437.71],
    ["全国", 127532028, 372923.77, 341.98]]
−−−− pdf05.rb ここまで

    

 ExportAsFixedFormatの引数PrintRangeについて、少し補足します。

 この引数は、Webのいろいろな解説では省略可能となっているようです。しかし、省略するとエラーが発生してしまいます。

 そこで、印刷範囲を設定し、それを変数prngに代入します。その上で、引数PrintRangeにそのprngを指定します。

 ExportAsFixedFormatは、PrintRangeに何が指定されていても、全部のスライドを出力するのがデフォルトになっています。

 なので、ここでわざわざ印刷範囲を設定しても意味はありませんが、こうしないとエラーになるので、やむなくそうします。

 印刷範囲だけをPDFに出力する方法については後述。

△ 目次に戻る

(2) PowerPointのExportAsFixedFormatメソッドの引数

 PowerPointのExportAsFixedFormatにおける引数について、要点を記します。

    

a. Path

 出力先のパス名。必須。

 test.pptのようなファイル名だけだとエラーになるようです。「D:\work\test.pdf」のようにディレクトリ名を含めたものにします。

    

b. FixedFormatType

 出力形式。必須。

 次の値を指定可能。

定数名 数値 説明
PpFixedFormatTypeXPS 1 XPS形式
PpFixedFormatTypePDF 2 PDF形式

    

c. Intent

 印刷用か画面用かの指定。省略可能。

 印刷用に最適化するか、画面用に最適化するかのいずれかを指定。

 省略時は画面用(数値0)。

 次の値を指定可能。

定数名 数値 説明
PpFixedFormatIntentScreen 1 画面用
PpFixedFormatIntentPrint 2 印刷用

    

d. FrameSlides

 フレームで縁取るかどうかの指定。省略可能。

 出力するスライドをフレームで縁取るかどうかを指定します。

 省略時はフレームで縁取らない(数値0)。

 次の値を指定可能。

定数名 数値 説明
MsoFalse 0 スライドをフレームで縁取らない
MsoTrue -1 スライドをフレームで縁取る

    

e. HandoutOrder

 印刷の順序を指定。省略可能。

 印刷する順序を指定します。

 省略時は垂直方向優先の順序(数値1)。

 次の値を指定可能。

    

    

f. OutputType

 出力の種類を指定。省略可能。

 省略時は全部のスライドを印刷(数値1)。

 次の値を指定可能。

定数名 数値 説明
PpPrintOutputSlides 1 すべてのスライドを印刷
PpPrintOutputTwoSlideHandouts 2 1ページあたり2枚のスライドを印刷
PpPrintOutputThreeSlideHandouts 3 1ページあたり3枚のスライドを印刷
PpPrintOutputSixSlideHandouts 4 ページごと6つのスライドを印刷
PpPrintOutputNotesPages 5 ノートを印刷
PpPrintOutputOutline 6 アウトライン表示を印刷
PpPrintOutputBuildSlides 7 ???
PpPrintOutputFourSlideHandouts 8 ページあたり4つのスライドを印刷
PpPrintOutputNineSlideHandouts 9 1ページあたり9枚のスライドを印刷
PpPrintOutputOneSlideHandouts 10 1ページあたり1枚のスライドを印刷

    

g. PrintHiddenSlides

 非表示のスライドを印刷するかどうかの指定。省略可能。

 省略時は非表示のスライドを印刷しない(数値0)。

 次の値が指定可能。rubyでは下の定数名を使えないので注意。

定数名 数値 説明
MsoFalse 0 非表示のスライドを印刷しない
MsoTrue -1 非表示のスライドを印刷する

    

h. PrintRange

 出力する印刷の範囲(スライドの選択)。

 ActivePresentation.PrintOptions.Rangesオブジェクトを指定。

    

i. RangeType

 印刷範囲の扱い方を指定。省略可能。

 省略時は全部のスライドを出力(数値1)。つまり印刷範囲の値に左右されない。

 次の値を指定可能。

    

定数名 数値 説明
PpPrintAll 1 すべてのスライドを出力
PpPrintSelection 2 選択されたスライドを出力
PpPrintCurrent 3 現在のスライドのみを出力
PpPrintSlideRange 4 指定された印刷範囲を出力
PpPrintNamedSlideShow 5 SlideShowNameで指定されたスライドショーを出力

    

j. SlideShowName

 文字列。省略可能。

 スライドショーの名前を指定します。

    

k. IncludeDocProperties

 trueまたはfalseを指定。省略可能。

 ドキュメントのプロパティも出力するかどうかを指定します。

 省略時はfalse。

    

l. KeepIRMSettings

 trueまたはfalseを指定。省略可能。

 IRM設定も出力するかどうかを指定します。

 省略時はtrue。

    

m. DocStructureTags

 trueまたはfalseを指定。省略可能。

 図面へのアクセスを改善するため、図面構造タグを含めるかどうかを指定します。

 省略時はtrue。

    

n. BitmapMissingFonts

 trueまたはfalseを指定。省略可能。

 テキストのビットマップを含めるかどうかを指定します。

 省略時はtrue。

 フォントのライセンスで、フォントを PDFファイルに埋め込むことが許可されていない場合、この引数をtrueに設定します。

 この引数をfalseに設定すると、フォントが参照されます。閲覧者のコンピューターで作成されたフォントを使用できない場合、適切なフォントで代用されます。

    

o. UseISO19005_1

 trueまたはfalseを指定。省略可能。

 生成される図面が ISO 19005-1(PDF/A) に準拠しているかどうかを示します。

 省略時はfalse。

    

p. ExternalExporter

 Officeアドインへのポインタ。省略可能。

 COMのIMsoDocExporterインターフェイスを実装しコードの代替実装の呼び出しを可能にする、Officeアドインへのポインタです。

 省略時はNullポインタ。

△ 目次に戻る

(3) 印刷範囲を指定して一部のみ出力

 PowerPointで印刷範囲を指定するには、ActivePresentation.PrintOptions.Rangesオブジェクトを用います。

 前掲のpdf05.rbにその例が出てきます。変数presenにActivePresentationが代入されている場合、次のようにします。

    

presen.PrintOptions.Ranges.ClearAll  # 印刷範囲をクリア
prng = presen.PrintOptions.Ranges.Add(1,1)

    

 上記の「Add(1,1)」は、1番目のスライドのみを選択するという意味になります。

 「Add(2,5)」なら、第2〜第5のスライドを選択します。

 「Add(1, presen.Slides.Count)」だと、全部のスライドを選択することになります。

    

 一方、ExportAsFixedFormatの引数RangeTypeが、デフォルトのPpPrintAll(全スライドを選択:数値1)のままだと、いくら印刷範囲を設定してあっても、全スライドが出力されてしまいます。

 そこで、引数RangeTypeをPpPrintSlideRange(指定された印刷範囲を出力:数値4)にします。こうすれば、設定した印刷範囲だけがPDFに出力されます。

    

 圧縮ファイルに含まれているpdf06.rbは、印刷範囲だけをPDFに出力するサンプルです。

 2つのスライドからなる test06.ppt を作成し、その中の第2のスライドだけをPDFに出力します。

 第1のスライドはpdf05.rbと同じです。第2のスライドにはTextboxを設けています。アイデア発想法の「オズボーンのチェックリスト」を記しています。

 全部を示すと長くなるので、PowerPointを起動してから終了するところまでを掲げます。素材データの箇所は省略。

    

−−−− pdf06.rb ここから
(前略)
Pptap.new(ppt_file) do |presen|  # PowerPointを起動しtest06.pptを開く
  slide_width  = presen.PageSetup.SlideWidth
  slide_height = presen.PageSetup.SlideHeight
      # 第1のスライドを作成
  new_slide = presen.Slides.Add('Index'=>presen.Slides.Count+1,
      'Layout'=>PpLayoutTitleOnly)
  new_slide.Shapes.Title.TextFrame.TextRange.Text = "H24年人口等"
  shp = new_slide.Shapes.AddTable('NumRows'=>data_ary.size,
      'NumColumns'=>data_ary[0].size)
  for i in 1..data_ary.size
    row = data_ary[i-1]
    for j in 1..row.size
      shp.Table.Cell(i,j).Shape.TextFrame.TextRange.Text = row[j-1]
    end
  end
      # 第2のスライドを作成
  new_slide = presen.Slides.Add('Index'=>presen.Slides.Count+1,
      'Layout'=>PpLayoutTitleOnly)
  new_slide.Shapes.Title.TextFrame.TextRange.Text = "アイデア発想法"
  shp = new_slide.Shapes.AddTextbox('Orientation'=>1, 'Left'=>60,
      'Top'=>60, 'Width'=>slide_width-60, 'Height'=>slide_height-60)
  # ↑ Orientation  1:横書き, 2:縦書き(下から上), 3:縦書き(上から下)
  shp.textFrame.textRange.text = data_str
  presen.save  # test06.pptを保存
      # 印刷範囲を設定してPDF出力
  presen.PrintOptions.Ranges.ClearAll  # 印刷範囲をクリア
  prng = presen.PrintOptions.Ranges.Add(2,2)  # 印刷範囲の設定
  presen.ExportAsFixedFormat('Path'=>Pptm::fullpath(pdf_file),
      'FixedFormatType'=>PpFixedFormatTypePDF,
      'PrintRange'=>prng, 'RangeType'=>PpPrintSlideRange)
end
(後略)
−−−− pdf06.rb ここまで

△ 目次に戻る


4. pdf_outメソッドによるPDF出力

 これまで書いてきたExportAsFixedFormatメソッドには多くの引数があって細かな設定ができますが、使うのが少し面倒です。

 そこで、簡単にPDF出力を行えるよう、pdf_outというメソッドを設けました。拙作 exlap.rb, wrdap.rb, pptap.rbそれぞれでpdf_outを定義しています。

 pdf_outにはpdfという3文字の別名もあるので、pdfとだけ書いても大丈夫です。

    

(1) exlap.rbなどのインストール

 exlap.rbなどの3つのruby用ライブラリは、圧縮ファイルに同梱してあります。libというディレクトリの下にあります。

 同じディレクトリにある setup.rb を実行すると、3つをまとめてインストールできます。

 unset.rbを実行すれば、まとめてアンインストールできます。

    

  ruby.exe setup.rb [enter]

    

 上のように実行すればインストールできます。

△ 目次に戻る

(2) pdf_outメソッドの特徴

 pdf_outメソッドは、その内部でExportAsFixedFormatを呼び出していますが、次のような特徴があります。

    

    

 例えば、test.xlsをPDFとして出力したい時は、次の2行のスクリプトで足ります。

    

require "exlap"
Exlap.new("test.xls") {|wb|  wb.pdf_out}

    

 上のスクリプトを実行すると、カレントディレクトリに test.pdf が書き出されます。

 もしカレントディレクトリにある *.xls をすべてPDFとして出力したければ、次のようにします。

    

require "exlap"
Exlap.new(*Dir.glob("*.xls")) {|wb|  wb.pdf_out; wb.close}

    

 上の2行のスクリプトだと、カレントディレクトリにExcelファイルが何もない場合であっても、Excelを起動してしまいます。

 そうした難点はありますが、ごく簡単なスクリプトで済みます。

△ 目次に戻る

(3) pdf_outメソッドで引数を指定する例

 pdf_outメソッドで引数を指定する例をいくつか上げます。

 wbにはExcelのワークブック、docにはWordのドキュメント、presenにはPowerPointのプレゼンテーションがそれぞれ代入されているものとします。

    

    

 pdf_outメソッドにHashで引数をわたす時は、Excel, Word, PowerPointそれぞれで異なるので注意が必要です。各々のExportAsFixedFormatの引数を参考にして下さい。

 Hashの引数の中で、出力ファイル名(PDFファイルの名前)を指定した時は、それがフルパス名に変換されて、その上でExportAsFixedFormatに引き渡されます。

△ 目次に戻る

(4) サンプルスクリプト

 カレントディレクトリにあるExcel, Word, PowerPointのファイルを読み込んで、それぞれPDFファイルとして書き出すサンプルを示します。

 Excelの場合でいうと、*.xls だけでなく *.xlsx なども対象にします。

 カレントディレクトリに test.xls, test.xlsx の両方がある場合、どちらも出力ファイル名が test.pdf になってしまうと困るので、test.xls.pdf, test.xlsx.pdf のような出力ファイル名にします。

    

−−−− pdf07.rb ここから
# encoding: Windows-31J
require "exlap"
require "wrdap"
require "pptap"
xl = wrd = ppt = nil
file_ptn = "*.xls\0*.xls?\0*.doc\0*.doc?\0*.ppt\0*.ppt?"
Dir.glob(file_ptn) do |filename|
  extname = File.extname(filename).downcase  # 拡張子の取得
  pdf_file = filename + ".pdf"  # 出力ファイル名
  case extname  # 拡張子ごとに異なる処理
  when /\.xls.?/
    xl = Exlap.new  unless xl  # まだExcelを起動してなければ起動
    xl.opens(filename) {|wb| wb.pdf_out(pdf_file)}
  when /\.doc.?/
    wrd = Wrdap.new  unless wrd  # まだWordを起動してなければ起動
    wrd.opens(filename) {|doc| doc.pdf_out(pdf_file)}
  when /\.ppt.?/
    ppt = Pptap.new  unless ppt  # まだPowerPointを起動してなければ起動
    ppt.opens(filename) {|presen| presen.pdf_out(pdf_file)}
  end
end
xl.quit  if xl
wrd.quit  if wrd
ppt.quit  if ppt
−−−− pdf07.rb ここまで

△ 目次に戻る


5. その他

 rubyがインストールされていない環境で exlap.rb, wrdap.rb, pptap.rb を利用できるようにするため、exl18.exe, exl21.exe というコマンドを作りました。

 これまで紹介したサンプルスクリプトは、いずれもこれら両コマンド exl18, exl21 の下で動きます。

 両コマンドの詳細については、次のサイトを参照して下さい。

exl18.exeについて

    

〜 以上 〜