〜 ExportAsFixedFormatメソッドの利用 〜
当サイトは、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の閲覧ソフトが無償配布されており、それを利用すれば、相手のコンピュータの機種や環境によらず、オリジナルのイメージを正確に再生できるようです。
ExcelのExportAsFixedFormatメソッドについて記します。
変数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をワークブックに適用してもワークシートに適用しても、結果は同じです。
ExcelのExportAsFixedFormatにおける引数について、要点を記します。
保存形式を指定、必須項目。
使用できる定数は次のとおり。
定数名 | 数値 | 説明 |
---|---|---|
XlTypePDF | 0 | PDF形式で保存 |
XlTypeXPS | 1 | XPS形式で保存 |
保存するPDFファイルの名前。省略可能。
フルパス名でない場合、私が試したかぎりでは、カレントディレクトリではなくユーザーのドキュメントフォルダに書き出されるようです。
省略した場合は、ワークブックの名前の拡張子を .pdf に変更したファイル名で、ユーザーのドキュメントフォルダに出力されます。XPS形式を選んだ時は、拡張子 .xps になります。
ユーザーのドキュメントフォルダは、ユーザー名が taro の場合、「C:\Users\taro\Documents」です。
PDFの質を指定。省略可能。
次の値を指定可能。
定数名 | 数値 | 説明 |
---|---|---|
XlQualityStandard | 0 | 標準の品質 |
XlQualityMinimum | 1 | 最小限の品質 |
trueまたはfalseを指定。省略可能。
ドキュメントプロパティが含まれていることを示す場合はtrueに設定し、省略されていることを示す場合はfalseに設定します。
trueまたはfalseを指定。省略可能。
trueに設定すると、出力する場合に印刷範囲が無視されます。falseに設定すると、出力する場合に印刷範囲が使用されます。
省略可能。
出力を開始するページのページ番号を指定します。この引数を省略すると、先頭のページから出力が開始されます。
省略可能。
出力を終了するページの番号を指定します。この引数を省略すると、最後のページまで出力します。
trueまたはfalseを指定。省略可能。
trueに設定すると、ファイルが閲覧ソフトで表示されます。falseに設定すると、ファイルは書き出されますが表示はされません。
省略可能。
FixedFormatExtクラスへのポインター。
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に出力されます。
MS-WordのExportAsFixedFormatメソッドについて記します。
変数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つだけでもいいと思いますが、参考まで記してみました。
WordのExportAsFixedFormatにおける引数について、要点を記します。
出力ファイル名。
これがフルパス名でない場合、カレントディレクトリではなくユーザーのドキュメントフォルダに書き出されるようです。
保存形式を指定。
次の値のどれかを指定。
定数名 | 数値 | 説明 |
---|---|---|
WdExportFormatPDF | 17 | PDF形式で保存 |
WdExportFormatXPS | 18 | XPS形式で保存 |
trueまたはfalseを指定。省略可能。
出力したファイルを閲覧ソフトで自動的に開く場合はtrue。それ以外の場合はfalse。
印刷用に最適化するか、画面用に最適化するかのいずれかを指定。省略可能。
省略時は「印刷用」(数値0)。
次の値を指定可能。
定数名 | 数値 | 説明 |
---|---|---|
WdExportOptimizeForPrint | 0 | 印刷用。質が高くファイルサイズが大。 |
WdExportOptimizeForOnScreen | 1 | 画面用。質は落ちるがファイルサイズが小。 |
PDFとして書き出す範囲。省略可能。
PDFとして書き出す範囲が、文書全体、現在の選択箇所、現在のページ、またはテキストの範囲のいずれであるかを指定。
省略時は文書全体(数値0)。
次の値を指定可能。
定数名 | 数値 | 説明 |
---|---|---|
WdExportAllDocument | 0 | 文書全体 |
WdExportSelection | 1 | 現在の選択箇所 |
WdExportCurrentPage | 2 | 現在のページ |
WdExportFromTo | 3 | テキストの範囲。始点と終点を別途指定。 |
開始ページ番号。省略可能。
引数RangeがWdExportFromTo(テキストの範囲)に設定されている場合、開始ページ番号を指定。
省略時は数値1。
終了ページ番号。省略可能。
引数RangeがWdExportFromTo(テキストの範囲)に設定されている場合、終了ページ番号を指定。
省略時は数値1。
マークアップを含めるか否か。省略可能。
PDFを出力する際、テキストのみを含めるか、テキストをマークアップ付きで含めるかを指定。
省略時はマークアップを含めない(数値0)。
次の値を指定可能。
定数名 | 数値 | 説明 |
---|---|---|
WdExportDocumentContent | 0 | マークアップなし |
WdExportDocumentWithMarkup | 7 | マークアップ付き |
文書のプロパティを含めるか否か。省略可能。
PDFファイルに文書のプロパティを含める場合はtrue。それ以外の場合はfalse。
trueまたはfalse。省略可能。
ソース文書がIRM(Information Rights Management)によって保護されている場合、IRMアクセス許可を XPS文書にコピーする場合はtrue。それ以外の場合はfalse。
省略時はtrue。
ブックマークの含め方。省略可能。
ブックマークをPDFファイルに書き出すかどうか、および出力する場合のブックマークの型を指定。
省略時はブックマークを出力しない(数値0)。
次の値を指定可能。
trueまたはfalse。省略可能。
スクリーンリーダーにとって有用な追加データ(コンテンツのフローや論理構成など)を含める場合はtrue。それ以外の場合はfalse。
省略時はtrue。
ビットマップを含めるか否か。省略可能。
テキストのビットマップを含める場合はtrue。テキストフォントを参照する場合はfalse。
フォントのライセンスでPDFファイルへのフォントの埋め込みを許可しない場合は、この引数をtrueに設定します。
この引数をfalseに設定した場合、指定されたフォントが表示先のコンピューターで使用できない時は、適切なフォントに置き換えられます。
省略時はtrue。
trueまたはfalse。省略可能。
PDFの使用をISO19005-1として標準化されているPDFのサブセットに限定する場合はtrue。それ以外の場合はfalse。
この引数をtrueに設定すると、結果ファイルの独立性は高まりますが、形式の制限が原因で、サイズが大きくなったり、ビジュアル アイテムの表示が増加したりする場合があります。
省略時はfalse。
文書を別の固定形式で保存できるようにするIMsoDocExporter インターフェイスの実装へのポインター。
文書の一部のみを出力するには、出力したい範囲を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 ここまで
PowerPointのExportAsFixedFormatメソッドについて記します。
変数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に出力する方法については後述。
PowerPointのExportAsFixedFormatにおける引数について、要点を記します。
出力先のパス名。必須。
test.pptのようなファイル名だけだとエラーになるようです。「D:\work\test.pdf」のようにディレクトリ名を含めたものにします。
出力形式。必須。
次の値を指定可能。
定数名 | 数値 | 説明 |
---|---|---|
PpFixedFormatTypeXPS | 1 | XPS形式 |
PpFixedFormatTypePDF | 2 | PDF形式 |
印刷用か画面用かの指定。省略可能。
印刷用に最適化するか、画面用に最適化するかのいずれかを指定。
省略時は画面用(数値0)。
次の値を指定可能。
定数名 | 数値 | 説明 |
---|---|---|
PpFixedFormatIntentScreen | 1 | 画面用 |
PpFixedFormatIntentPrint | 2 | 印刷用 |
フレームで縁取るかどうかの指定。省略可能。
出力するスライドをフレームで縁取るかどうかを指定します。
省略時はフレームで縁取らない(数値0)。
次の値を指定可能。
定数名 | 数値 | 説明 |
---|---|---|
MsoFalse | 0 | スライドをフレームで縁取らない |
MsoTrue | -1 | スライドをフレームで縁取る |
印刷の順序を指定。省略可能。
印刷する順序を指定します。
省略時は垂直方向優先の順序(数値1)。
次の値を指定可能。
出力の種類を指定。省略可能。
省略時は全部のスライドを印刷(数値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枚のスライドを印刷 |
非表示のスライドを印刷するかどうかの指定。省略可能。
省略時は非表示のスライドを印刷しない(数値0)。
次の値が指定可能。rubyでは下の定数名を使えないので注意。
定数名 | 数値 | 説明 |
---|---|---|
MsoFalse | 0 | 非表示のスライドを印刷しない |
MsoTrue | -1 | 非表示のスライドを印刷する |
出力する印刷の範囲(スライドの選択)。
ActivePresentation.PrintOptions.Rangesオブジェクトを指定。
印刷範囲の扱い方を指定。省略可能。
省略時は全部のスライドを出力(数値1)。つまり印刷範囲の値に左右されない。
次の値を指定可能。
定数名 | 数値 | 説明 |
---|---|---|
PpPrintAll | 1 | すべてのスライドを出力 |
PpPrintSelection | 2 | 選択されたスライドを出力 |
PpPrintCurrent | 3 | 現在のスライドのみを出力 |
PpPrintSlideRange | 4 | 指定された印刷範囲を出力 |
PpPrintNamedSlideShow | 5 | SlideShowNameで指定されたスライドショーを出力 |
文字列。省略可能。
スライドショーの名前を指定します。
trueまたはfalseを指定。省略可能。
ドキュメントのプロパティも出力するかどうかを指定します。
省略時はfalse。
trueまたはfalseを指定。省略可能。
IRM設定も出力するかどうかを指定します。
省略時はtrue。
trueまたはfalseを指定。省略可能。
図面へのアクセスを改善するため、図面構造タグを含めるかどうかを指定します。
省略時はtrue。
trueまたはfalseを指定。省略可能。
テキストのビットマップを含めるかどうかを指定します。
省略時はtrue。
フォントのライセンスで、フォントを PDFファイルに埋め込むことが許可されていない場合、この引数をtrueに設定します。
この引数をfalseに設定すると、フォントが参照されます。閲覧者のコンピューターで作成されたフォントを使用できない場合、適切なフォントで代用されます。
trueまたはfalseを指定。省略可能。
生成される図面が ISO 19005-1(PDF/A) に準拠しているかどうかを示します。
省略時はfalse。
Officeアドインへのポインタ。省略可能。
COMのIMsoDocExporterインターフェイスを実装しコードの代替実装の呼び出しを可能にする、Officeアドインへのポインタです。
省略時はNullポインタ。
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 ここまで
これまで書いてきたExportAsFixedFormatメソッドには多くの引数があって細かな設定ができますが、使うのが少し面倒です。
そこで、簡単にPDF出力を行えるよう、pdf_outというメソッドを設けました。拙作 exlap.rb, wrdap.rb, pptap.rbそれぞれでpdf_outを定義しています。
pdf_outにはpdfという3文字の別名もあるので、pdfとだけ書いても大丈夫です。
exlap.rbなどの3つのruby用ライブラリは、圧縮ファイルに同梱してあります。libというディレクトリの下にあります。
同じディレクトリにある setup.rb を実行すると、3つをまとめてインストールできます。
unset.rbを実行すれば、まとめてアンインストールできます。
ruby.exe setup.rb [enter]
上のように実行すればインストールできます。
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を起動してしまいます。
そうした難点はありますが、ごく簡単なスクリプトで済みます。
pdf_outメソッドで引数を指定する例をいくつか上げます。
wbにはExcelのワークブック、docにはWordのドキュメント、presenにはPowerPointのプレゼンテーションがそれぞれ代入されているものとします。
pdf_outメソッドにHashで引数をわたす時は、Excel, Word, PowerPointそれぞれで異なるので注意が必要です。各々のExportAsFixedFormatの引数を参考にして下さい。
Hashの引数の中で、出力ファイル名(PDFファイルの名前)を指定した時は、それがフルパス名に変換されて、その上でExportAsFixedFormatに引き渡されます。
カレントディレクトリにある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 ここまで
rubyがインストールされていない環境で exlap.rb, wrdap.rb, pptap.rb を利用できるようにするため、exl18.exe, exl21.exe というコマンドを作りました。
これまで紹介したサンプルスクリプトは、いずれもこれら両コマンド exl18, exl21 の下で動きます。
両コマンドの詳細については、次のサイトを参照して下さい。
〜 以上 〜