Rubyドライバは、ストリーム(IO)への出力をPDFに変換することができます。 例えば、ERBでPDFの元となるHTMLのテンプレートを作ることができます。
Ruby用ドライバはCopper PDF本体とは別に配布されています。 http://sourceforge.jp/projects/copper/releases/?package_id=13670 から cti-ruby-2.x.x ダウンロードしてください。 アプリケーションは、codeディレクトリをライブラリパスに含め、 require 'CTI' でドライバを読み込んでください。
# ドライバの読み込み require 'CTI' include CTI # セッションの開始 get_session('ctip://localhost:8099/', { 'user' => 'user', 'password' => 'kappa' } ) do |session| # 各種操作 ... end
ここではAPIによるアクセスの概要で説明した各手順に対応する関数を列挙します。 各関数の詳細はapidoc内のAPIドキュメントか、 オンラインのAPIドキュメントを参照してください。
以下は、ERBによる出力を変換するサンプルです。$stdoutを途中でCopper PDFへの出力に切り替えています。
require 'CTI' include CTI require 'erb' # セッションの開始 get_session('ctip://localhost:8099/', { 'user' => 'user', 'password' => 'kappa' } ) do |session| # ファイル出力 dir = 'out'; Dir::mkdir(dir, 0777) unless File.exist?(dir) session.set_output_as_file('out/erb.pdf') # テンプレートを変換 session.transcode do |out| begin $stdout = out ERB.new(DATA.read).run ensure $stdout = STDOUT end end end __END__ <html> <head> <title>ERB</title> </head> <body> <p>Hello ERB</p> <p>ただいまの時刻は <%= Time.now %></p> </body> </html>
次の例は、サーバー側からネットワーク上のウェブページアクセスしてPDFに変換します。
require 'CTI' include CTI # セッションの開始 get_session('ctip://localhost:8099/', { 'user' => 'user', 'password' => 'kappa' } ) do |session| # ファイル出力 dir = 'out'; Dir::mkdir(dir, 0777) unless File.exist?(dir) session.set_output_as_file('out/server-resource.pdf') #リソースのアクセス許可 session.property('input.include', 'http://copper-pdf.com/**') #文書の変換 session.transcodeServer('http://copper-pdf.com/'); end
他のサンプルはドライバのsrc/testに収められています。
ウェブアプリケーションでは、Content-Type, Content-Lengthヘッダを出力しないと、 ブラウザ上でPDFが正常に表示されないことがあります。 set_resultsやset_output_XXXメソッドを呼び出さない初期状態では、 出力先は標準出力(STDOUT)に設定されています。 このとき、自動的にContent-Type, Content-Lengthヘッダが出力されます。
これはSingleResultとStreamBuilderのコンストラクタに渡すことができるブロックを利用しています。 同じ状態にするためには、以下のようにSession#set_resultsメソッドを呼び出してください。
session.set_results(SingleResult.new(StreamBuilder.new(STDOUT) do |length| print "Content-Length: #{length}\r\n\r\n" end) do |opts| print "Content-Type: #{opts['mime_type']}\r\n" end)
出力先を変え、transcode または transcodeServerを繰り返し呼び出すことで、 同じセッションで何度もドキュメントを変換することができます。 送信済みのリソース、設定済みのプロパティは同じセッションで維持されます。 同じセッションのまま初期状態に戻すには session.reset を呼び出してください。
set_output_as_stream, set_output_as_fileにより、 単一のファイルハンドルかファイルを出力先として設定することができます。
複数の結果をファイルとして出力する場合は、set_output_as_directory を使用してください。 このクラスは、指定したディレクトリに、1から開始する連番の前後に指定した文字列をくっつけたファイル名で結果を出力します。 次の例では変換結果の各ページを、resultsディレクトリ内に"image[通し番号].jpeg"という名前で別々のJPEG画像として出力します。
session.property("output.type", "image/jpeg") session.set_output_as_directory("results", "image", ".jpeg")
サーバーから要求されたリソースを送る場合、resolverを呼び出してください。 このメソッドには、要求されたファイルのURIと、サーバーへのファイルハンドルを得るためのブロックを渡します 以下の例では、URIが相対パスであるという前提で、ローカルのファイルがあればサーバーに送信します。
session.resolver do |uri, r| if File.exist?(uri) r.found do |out| FileUtils.copy_stream(File.open(uri), out) end end end
実際に動作するサンプルはドライバの src/test/resolver.rb にあります。
複数の結果を結合したものを得るためには、 session.set_continuous(true) を呼び出した後、transcodeを複数回呼び出し、最後に session.join を呼び出してください。
session.set_continuous(true) # 文書の送信 session.transcode do |out| FileUtils.copy_stream(File.open('data/test.html'), out) end #リソースのアクセス許可 session.property('input.include', 'http://copper-pdf.com/**') #文書の変換 session.transcodeServer('http://copper-pdf.com/') # 結合 session.join
実際に動作するサンプルはドライバの src/test/continuous.rb にあります。
ドライバのソースコードはSourceForge.JPに公開しています。 ドライバのソースコードが必要な方は、以下のガイドを参考にSVNから取得してください。 http://sourceforge.jp/projects/copper/cvs/
CTI Rubyのソースコードのターゲットパスは以下の通りです。 http://svn.sourceforge.jp/svnroot/copper/drivers/ruby/trunk/