目次↑

.. Rubyドライバ

..1. 概要

Rubyドライバは、ストリーム(IO)への出力をPDFに変換することができます。 例えば、ERBでPDFの元となるHTMLのテンプレートを作ることができます。

..2. ドライバの準備

Ruby用ドライバはCopper PDF本体とは別に配布されています。 https://osdn.net/projects/copper/releases/p13670 から cti-ruby-2.x.x ダウンロードしてください。 アプリケーションは、codeディレクトリをライブラリパスに含め、 require 'CTI' でドライバを読み込んでください。

# ドライバの読み込み
require 'CTI'
include CTI

# セッションの開始
get_session('ctip://localhost:8099/',
{
  'user' => 'user',
  'password' => 'kappa'
}
) do |session|
	# 各種操作
	...
end

..3. APIの概要

ここではAPIによるアクセスの概要で説明した各手順に対応する関数を列挙します。 各関数の詳細はapidoc内のAPIドキュメントか、 オンラインのAPIドキュメントを参照してください。

サーバーへの接続・認証

ユーティリティ

サーバー情報の取得

メッセージハンドラ・プログレスリスナの設定

出力先の設定

プロパティの設定

ソースリゾルバの設定

リソースの送信

本体の送信・変換

複数の結果の結合

処理の中断・リセット・通信の終了

..4. サンプル

以下は、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', 'https://copper-pdf.com/**')
    
  #文書の変換
  session.transcodeServer('https://copper-pdf.com/');
end

他のサンプルはドライバのsrc/testに収められています。

..5. プログラミングのポイント

Content-Type, Content-Length ヘッダの出力

ウェブアプリケーションでは、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が相対パスであるという前提で、ローカルのファイルがあればサーバーに送信します。 RubyのFileUtils::copy_stream, IO::copy_streamは使用できないため、CTI::copy_streamを使ってください。

session.resolver do |uri, r|
  if File.exist?(uri)
    r.found do |out|
      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|
  copy_stream(File.open('data/test.html'), out)
end

#リソースのアクセス許可
session.property('input.include', 'https://copper-pdf.com/**')
  
#文書の変換
session.transcodeServer('https://copper-pdf.com/')

# 結合
session.join

実際に動作するサンプルはドライバの src/test/continuous.rb にあります。

..6. ソースコード

ドライバのソースコードはSourceForge.JPに公開しています。 ドライバのソースコードが必要な方は、以下のガイドを参考にSVNから取得してください。 https://osdn.net/projects/copper/scm/

CTI Rubyのソースコードのターゲットパスは以下の通りです。 http://svn.osdn.jp/svnroot/copper/drivers/ruby/trunk/


目次↑
Copper PDF ©2012 Zamasoft. All rights reserved.