Pages

2011年6月19日日曜日

コンテキストメニューの「印刷」

最近は簡単な業務アプリをrailsで作成しているが、その時にいつも課題となるのが印刷。
印刷は、おおむねpdfで実現している(逃げている)が、自動で印刷したいとニーズも多い。

調べてみたが、どうもすっきりした手がない。恐らく、正解はsambaでプリンターサーバを立てることではないかと推定しているが、大掛かりすぎるな。

結局、Webアプリケーションを稼働させているサーバ(windows)にアクロバットリーダをインストールし、oleで操作することにした。pdfファイルを右クリックし、コンテクストメニューの「印刷」を選んで印刷する。この操作をOLEで実現することだ。
掲示版で記載されていたアイディアの拝借です。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40924

Linuxサーバでは使えないが、Net::ssh/sftpライブラリを使って、リモートのwindowsプリンタサーバにpdfファイルを送信して、このプログラムをキックさせれば良いだろう。

事前作業は2つ。
  • アクロバットリーダインストール
  • Active Script Ruby
OLEを実現するため、ASRに含まれるwin32oleライブラリを利用することにした。

#!ruby -Ks
=begin
filename : print.rb
必ず ファイルをShiftJISにて保管すること
実行 : $ ruby print.rb 
=end
require 'win32ole' # oleを操作するライブラリ

class WIN32OLE
  include Enumerable # oleのコレクション操作にeachを使うため(かな?)
end

parent, name = File.split(File.expand_path(ARGV.shift))
parent.gsub!("/", "¥¥") # フルパス指定するときに問題にならないように

shell = WIN32OLE.new('Shell.Application')  # シェルを起動
verbs = shell.NameSpace(parent).ParseName(name).Verbs # コンテクストコマンドリスト取得

if v = verbs.find {|v| v.Name == "印刷(&P)" }
  v.doIt
  sleep(2) # 起動が遅い場合 (excel とか),少し待ってあげないとだめ(らしい)。
end

0 件のコメント:

コメントを投稿