CacooPoint : Cacooの図をPowerPointに落とし込む

http://img.f.hatena.ne.jp/images/fotolife/y/yuroyoro/20101006/20101006140123.png

「(PowerPointが入っていないが)そんなPCで大丈夫か?」
「大丈夫だ、問題ない」

流行り物*1に流されやすいikikkoです、こんにちは。

今日は、Cacooで作った図(プレゼン資料)をPowerPointに落としこむスクリプト「CacooPoint」をGroovyで作ってみました。パワポを表示するだけならMicrosoftからPowerPoint Viewerなるものが提供されていますので、これでPCにパワポがなくともプレゼン資料が作れますね。

OpenOffice?なにそれ、おいしいの・・・><


スクリプトの概要

大まかな処理フローは、このような感じです。

  1. Cacoo API経由で、Cacoo Diagramに含まれるシート情報を抽出する
  2. 抽出したシート情報から、図一覧をぶっこぬいてローカルに画像ファイルとして保存する
  3. 保存されたファイルをPowerPointに貼っていく
事前情報の設定

Cacoo API経由で図を取得するので、スクリプト中で大元になるdiagramのIDを指定します。非公開の図形ならばAPIキーも必要になるので、発行して指定しておくこと。

// Cacooの図形IDと(必要ならば)APIキーを指定
def diagramId = 'IZczfsbRj5yEbYEG'
def apiKey = '' // 公開されている図形ならば不要

なお、デフォルトのdiagramはid:tksmdCacoo - 大阪ガベージコレクション2010秋を使用させていただいてます。

Cacooから画像を抽出

上記で設定した情報をもとに

  1. XmlParserで図の情報をXML形式で取得・パースして
  2. HTTPBuilderで各シートの図をGetして保存

してます。

XMLParsar+GPathでXMLをスマートにハンドリングできるのが嬉しいですね。

// Cacooの図一覧を取得
def sheetIndex = 1;
def url = "https://cacoo.com/api/v1/diagrams/${diagramId}.xml?apiKey=${apiKey}"
def diagrams = new XmlParser().parse(url)
def title = diagrams.title.text()
diagrams.sheets.sheet.each {
  def name = it.name.text()
  def imageUrl = it.imageUrlForApi.text() + "?apiKey=${apiKey}"
  
  def http = new HTTPBuilder( imageUrl )
  http.request(GET, BINARY) {req ->
    response.success = { resp, reader ->
      def fileName = String.sprintf('%03d_%s.png', sheetIndex, name)
      def sanitizedFileName = fileName.replaceAll(/[\/:*?"<>|]/, ' ')
      new File("image/${sanitizedFileName}") << reader
      sheetIndex++;
      
      println "created image file : ${sanitizedFileName}"
    }
  }
}
PowerPointに画像を張り付け

PowerPointを扱う部分は、GroovyDSLsで紹介されていたPowerPoint DSLを使用しています。PowerPoint DSLの内部的にはScriptomじゃなくてApache POIを使用してますが。

Groovyのbuilderを使うと、これだけ単純な表記でパワポを扱うことができちゃいます。

// 取得した図をPowerPointに貼りつけ
def builder = new PowerPointBuilder()
builder.slideshow(filename: "${title}.ppt") {
  imageDir.eachFile {
    imageslide(src: it.path)
  }
}

完成

コードの完成形は、Githubに置いています。

ただ、実際やってみると分かるのですが、微妙にうまく貼り付けられていません。Cacooで描いた図のサイズが大きすぎるとはみ出すとか、背景が白いと引っ張ってくる画像に変な模様が入るとか。

多分、PowerPoint DSLの方のコードを修正すればうまくいきそうな気もしなくもないですが、そこまでする気力もないのでとりあえず放置。まぁいい勉強になったということで。。。もしこれを使いたいという奇特な方がいたらもう少し頑張って修正するかもしれませんので、そんな人がいたらコメントなりリプライなりくださいませ。

ちなみに、スクリプトの処理途中でCacooの図を一括で抽出しているので、この部分だけ抜き出しても使えるかもですね。


前からGroovyを勉強はしているんですが、写経じゃなくて何か作ったのは実は初めて。まだ途中だしここから面白くなりそうなので、早くGroovy in Actionも読まんと。

Groovyイン・アクション

Groovyイン・アクション

*1:ニコニコ界隈で話題沸騰中のエルシャダイですね。id:yuroyoroさんの図をお借りしました。