目次↑

.. Perlドライバ2

..1. 概要

Perl用ドライバは、Perlスクリプトによる出力をPDFに変換できることが特徴です。 CGI等として作成された他のPerlプログラムの出力を、もとのプログラムを変えないまま変換することができます。 また、PDFのもととなるテンプレートをTemplateToolkit等、Perlベースのテンプレートエンジンにより作成することができます。

..2. ドライバの準備

Perl用ドライバはCopper PDF本体とは別に配布されています。 https://osdn.net/projects/copper/releases/p8741 から cti-perl-2.x.x ダウンロードしてください。 アプリケーションは、codeディレクトリをライブラリパスに含め、 use CTI::DriverManager; でモジュールをインポートしてください。

Copper PDF 3.0.0, Perlドライババージョン2.1.0ではTLS通信に対応しています。 TLS通信には IO::Socket::SSL モジュールが必要です。

# ドライバモジュールのインポート
use CTI::DriverManager;

# サーバーへの接続
my $uri = 'ctip://localhost:8099/';
my $session = CTI::DriverManager::get_session($uri,
	user => 'user', password => 'kappa');
# 各種操作
...

..3. APIの概要

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

サーバーへの接続・認証

サーバー情報の取得

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

出力先の設定

プロパティの設定

ソースリゾルバの設定

リソースの送信

本体の送信・変換

複数の結果の結合

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

..4. サンプル

以下は、プログラムによる出力を変換するサンプルです。 start_main, end_main関数の間の標準出力への出力をキャプチャして変換します。

#!/usr/bin/perl
use strict;
use lib '../code';
use CTI::DriverManager;

# Copper PDFに接続
my $uri = 'ctip://localhost:8099/';
my $session = CTI::DriverManager::get_session($uri,
	user => 'user', password => 'kappa');

# ファイル出力
$session->set_output_as_file('test.pdf');

# リソースの送信
$session->start_resource(*STDOUT, 'style.css',
	mime_type => 'text/css');
print "p {color: Red;}";
$session->end_resource(*STDOUT);

# 出力の変換を開始
$session->start_main(*STDOUT, '.',
	mime_type => 'text/html');
print "<html>";
print "<head>";
print "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>";
print "<link rel='StyleSheet' type='text/css' href='style.css'>";
print "<title>サンプル</title>";
print "</head>";
print "<body>";
print "<p>Hello World!</p>";
print "</body>";
print "</html>";
# 出力の変換を終了
$session->end_main(*STDOUT);

# 接続を閉じる
$session->close();

次の例は、サーバー側からネットワーク上のウェブページアクセスしてPDFに変換します。

#!/usr/bin/perl
use strict;
use lib '../code';
use CTI::DriverManager;

# セッションの開始
my $uri = 'ctip://localhost:8099/';
my $session = CTI::DriverManager::get_session($uri,
	user => 'user', password => 'kappa');

# ファイル出力
$session->set_output_as_file('test.pdf');

# リソースのアクセス許可
$session->property('input.include', 'https://copper-pdf.com/**');
	
# 文書の送信
$session->transcode('https://copper-pdf.com/');

# セッションの終了
$session->close();

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

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

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

ウェブアプリケーションでは、Content-Type, Content-Lengthヘッダを出力しないと、 ブラウザ上でPDFが正常に表示されないことがあります。 以下のようにset_output_as_handle関数の2番目の引数に1を設定してください。 これらのヘッダが自動的に出力されます。

...
$session->set_output_as_handle(*STDOUT, 1);
...

他のプログラムを呼び出して変換する

他のプログラムによる出力を変換するには、start_main, end_mainの間でrequireしてください。 CGIプログラム等は、ヘッダを出力することがありますが、 start_mainに ignore_headers => 1 オプションを加えて呼び出すと、これを除去します。 以下の例では、bbs.cgiというプログラムの出力を変換します。

...
$session->start_main(*STDOUT, '.',
	mime_type => 'text/html',
	ignore_headers => 1);
require "bbs.cgi";
$session->end_main(*STDOUT);
...

start_resource, end_resourceについても、同じことができます。

繰り返し処理

出力先を変え、start_main/end_main または transcodeを繰り返し呼び出すことで、 同じセッションで何度もドキュメントを変換することができます。 送信済みのリソース、設定済みのプロパティは同じセッションで維持されます。 同じセッションのまま初期状態に戻すには $session->reset() を呼び出してください。

出力先の設定

set_output_as_handle, 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");
...

サーバーから要求されたリソースの送信

サーバーから要求されたリソースを送る場合、set_resolver_funcに関数を設定してください。 関数には、要求されたファイルのURIと、サーバーへのファイルハンドルを得るための関数への参照が渡されます。 以下の例では、URIが相対パスであるという前提で、ローカルのファイルがあればサーバーに送信します。

...
$session->set_resolver_func(sub {
	my ($uri, $open) = @_;
	if (-e $uri) {
	  my $fp = $open->();
	  open(my $rfp, "<$uri");
	  while (<$rfp>) {print $fp $_};
	  close($rfp);
	}
	return undef;
});
...

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

複数の結果の結合

複数の結果を結合したものを得るためには、 $session->set_continuous(1) を呼び出した後、transcodeを複数回呼び出し、最後に $session->join() を呼び出してください。

...
$session->set_continuous(1);

# 文書の送信
$session->start_main(*STDOUT, '.');
open($rfp, '<data/test.html');
while (<$rfp>) {print};
close($rfp);
$session->end_main(*STDOUT);

# 文書の送信
$session->start_main(*STDOUT, '.');
open($rfp, '<data/test.html');
while (<$rfp>) {print};
close($rfp);
$session->end_main(*STDOUT);

$session->join();
...

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

..6. ソースコード

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

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


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