バッチ処理でWebページをPDFに変換する

WebページをPDFにバッチ処理で変換するなんてことができたらいいなぁと思っていて、いろいろ調べました。最初はAirを使ってなにかできないかなとか。


でも、調べていくと、LivePDFプリンタAPIなんていうものがあるのを発見しました。ということはOLEを使えば自動印刷ができる!?

ということでやってみました

#!ruby -Ks
require 'win32ole'

Printer = WIN32OLE.new('LivePDF.Printer')
shell = WIN32OLE.new('Shell.Application')
OLECMDEXECOPT_PROMPTUSER = 1    #印刷ダイアログ表示
OLECMDEXECOPT_DONTPROMPTUSER = 2 #印刷ダイアログ非表示
OLECMDID_PRINT = 6              #印刷
OLECMDID_PRINTPREVIEW = 7       #印刷プレビュー

def url2PDF(ie, url, savePath)
  Printer.SetFilePath(savePath)

  # トップページ
  ie.Navigate url
  while ie.Busy
    puts "Connecting #{url}"
    sleep 1
  end

  # デフォルトのプリンターでいきなり印刷されちゃうので
  # とりあえずコメントアウトしておきます。
  # ちゃんと理解して下の行のコメントをはずしてください
  #ie.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0)
  
  # ファイルができるまでまつ
  while !File.exist?(savePath)
    puts "Printing #{url}"
    sleep 1
  end
end

ie = WIN32OLE.new("InternetExplorer.Application")
url2PDF(ie, "http://www.yahoo.co.jp", "c:\\yahoo.pdf")
url2PDF(ie, "http://www.google.com", "c:\\google.pdf")
ie.Quit()

デフォルトのプリンタで印刷するようにコーディングされています。間違って実際の紙を出力してしまわないように、ie.ExecWBの所をコメントアウトしてます。ここのコメントアウトを外せば印刷してくれます。


この機能を使えば、WikiにかかれたものをPDFにまとめて出力したり、いろいろできることが増えます。明日会社でPDF出力してみよう。