2012/01/29

パワポとかワードのファイルをコマンドラインからPDFに変換したかったので…

 Evernoteを使っているので、ドキュメントをなんでもかんでも放り込んでおくのですが、doc形式とかppt形式のまま放り込んでも、Evernoteでそのまま表示されないのです。もちろん、本文を検索することもできません。
 それではあんまりにも不便なので、PDFにして放り込んでいます。
 しかしまぁ、自分のいる会社ではあらゆる書類がOffice文書でとびかっているので、日々手作業でPowerPointを開いてはPDFで保存、保存、保存……とやっていたのです。

 で、いいかげんバカらしくなってきて、オフィスで「パワポをコマンドラインから呼び出す方法はないもんかなぁ」とかぼやいていたら、@_8bit_さんが「C#でコントロールすればいいんじゃないですか?」とか教えてくれた。

「そうか!COMで操作すればいんじゃね?なるほど、その手があったか!」

 やっぱりWindowsのことは@_8bit_さんに聞いとけば間違いないなぁ、などと思いつつやってみた。


 参考にしたのはこのへん↓

 VisualStudioでコンソールアプリケーションのプロジェクトを作成して、参照設定で「Microsoft.Office.Interop.PowerPoint」を追加すれば、COMでPowerPointにアクセスできるようになる。
 基本的なパターンはこんなかんじ:

// PowerPointプロセスへのハンドルを作成
PowerPoint.Application ppt = new PowerPoint.Application();

// PowerPointファイルを開く
//(後ろの引数でRead-Onlyで開くとかウィンドウを表示するとか設定できるけど、細かいことはリファレンスを参照)
PowerPoint.Presentation p = ppt.Presentations.Open(@"C:\somewhere\パワポファイル名.ppt", MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);

// PDF形式でファイルに保存する
//(最後の引数は、フォントを埋め込むかの指定)
p.SaveCopyAs(@"C:\somewhere\出力先ファイル名.pdf", PowerPoint.PpSaveAsFileType.ppSaveAsPDF, MsoTriState.msoTrue);

// ファイルを閉じる
//(これをやらないとファイルが開いたままになっちゃう)
p.Close();

 簡単ですね><!
 ハマりどころは、ファイルを開く時と保存するときに絶対パスで指定しないといけないってとこくらい。

 同じ要領で、Wordを使ってdocファイルをPDF化することもできます。
 ただし、こちらはExportAsFixedFormatというメソッドを使う。
Wordのリファレンスは↓を参照。

 こんなかんじで、あとは細かいところをチョコチョコ作ってコマンドを実装した。
 一応、GitHubに置いてあるので、使いたい人は勝手に使ってね。(自分の環境でしかテストしていないので、動かなければ自分でリビルドするなりしてお使いください)

 コマンドラインツールといってもただ引数にファイル名を渡せば良いので、実行ファイルへのショートカットをデスクトップあたりに置いておけば、そこにPDFにしたいファイルをドロップするだけで変換可能!

 これで日常的な作業にかかる時間をかなり削減できるよ。