ScriptomとBullzip PDF Printerで、ExcelやWordをPDF化したり結合したりしてみた

毒を喰らわば皿まで。というわけで、ググってみたら、こんな素晴らしいエントリがあったので、当然のように拝借させていただきました。ホント、ありがとうございます。
http://d.hatena.ne.jp/morningmist7/20080623/1214216982


ここで紹介されているBullzip PDF PrinterってPDFライター、なにがスゴイってCOMのAPIを持ってるのよね。あと何気に、こいつ単体でPDFの結合もできるそうな。
PDF Writer - Guide


まずはPDF化。とあるフォルダ(c:\temp)にあるExcelとWordのファイルを片っ端からPDFにしていきます。Excelはブック丸ごとPDFにするよ。
どういうわけか、Scriptom経由ではActivePrinterの切替えができなかったんで、スクリプト動かす前に「通常使うプリンタ」に「Bullzip PDF Printer」を設定しておいてください(一応、そうなってないと動かないようにはしといた)。もう一つのポイントは、印刷時の待時間を十分に取っておくこと。下記の例では20秒待たせてる。「印刷終るまで待つ」のが理想なんだけど、どう書いていいかわからんかった。><


次は、書き出したPDFをひとまとめにするスクリプト。これはBullzip PDF Printerが、そうゆう機能を持っていたので、ちゃっかり利用さしてもらっただけ。よっぽど大量じゃなければ、類似のツールは結構あるよ(あたしはConcatPDFを良く使ってます)。


PDFライターで結合処理をするんで、何か印刷物が要る。先頭のPDFファイルをネタにしようかと思ったけど、Adobe ReaderのCOMインターフェイス調べるのが面倒だったので「title.xlsかtitle.docで表紙を作っておく」という逃げ手を使ってる(細けぇ事はどうでもいいんだ)。

import org.codehaus.groovy.scriptom.*

def waitTime = 15000
Scriptom.inApartment {
  def dir = new File("c:/temp")
  def wdApp = new ActiveXObject('Word.Application')
  def xlApp = new ActiveXObject('Excel.Application')
  def pdfApp = new ActiveXObject('Bullzip.PDFPrinterSettings')
  if (!(wdApp.ActivePrinter ==~ /Bullzip PDF Printer.*/)) return

  def mergeList = dir.listFiles().findAll { it.path ==~ /.*\.pdf$/ }

//  def title = wdApp.documents.open("${dir.path}/title.doc")
  def title = xlApp.workbooks.open("${dir.path}/title.xls")
  pdfApp.with {
    setValue("output", "${dir.path}\\all.pdf")
    setValue("confirmoverwrite", "no")
    setValue("showpdf", "no")
    setValue("mergefile", mergeList.join("|"))
    setValue("mergeposition", "top")
    setValue("showsettings", "never")
    writeSettings(true)
  }
  title.printOut()
  sleep(waitTime)
  title.close()

  wdApp.quit()
  xlApp.quit()
}


Excel方眼なドキュメントを良く作っている人たちには共感持ってもらえると思うんだけど。1ページ1シートだったり、中途半端にExcel/Word混在だったり、でも複数のファイルをまとめて1冊のドキュメントだったり(章ごとにファイルが分れてるとか)で、納品するときは全部印刷してキングファイルにまとめなきゃいけない。そうじゃなくても、ファイルが分散しているので閲覧性がすこぶる悪い。
#シート分けしているExcelブックのドキュメントが読みやすいって人が居たら、会ってみたい。


そんなわけで、それなりに需要がありそう。


ps.
作ってみたらあっという間にできるもんだけど、あえて用意してなかったのは、いろいろ大人の事情があるのだろうなと邪推してみた。:-P