PHP用ドライバは、PHPによる出力をPDFに変換できることが特徴です。 他のPHPプログラムの出力を、もとのプログラムを変えないまま変換することができます。 また、PDFのもととなるテンプレートをSmarty等、PHPベースのテンプレートエンジンにより作成することができます。
PHP用ドライバはGitHubの https://github.com/zamasoftnet/cti.php で公開されています。Composerを使ってインストールすることができます(推奨)。
composer require zamasoft/cti-php
またはVCSリポジトリを登録してインストールすることもできます。
composer config repositories.zamasoftnet-cti-php vcs https://github.com/zamasoftnet/cti.php composer require zamasoft/cti-php
手動でインストールする場合は、src/CTI/ ディレクトリをプロジェクトにコピーし、 require_once 'path/to/CTI/DriverManager.php'; でドライバを読み込んでください。
// ドライバの読み込み
require_once ('CTI/DriverManager.php');
// セッションの開始
$session = cti_get_session('ctip://localhost:8099/',
array('user' => 'user',
'password' => 'kappa'));
// 各種操作
...
ここではAPIによるアクセスの概要で説明した各手順に対応する関数を列挙します。 各関数の詳細は オンラインのAPIドキュメントを参照してください。
以下は、プログラムによる出力を変換するサンプルです。 start_main, end_main関数の間の標準出力への出力をキャプチャして変換します。
'user',
'password' => 'kappa'));
// ファイル出力
@mkdir($dir, 0777, 'out');
$session->set_output_as_file('test.pdf');
// リソースの送信
$session->start_resource('style.css',
array('mimeType' => 'text/css'));
?>
p {color: Red;}
end_resource();
// 出力の変換を開始
$session->start_main('.',
array('mimeType' => 'text/html'));
?>
サンプル
Hello World!
end_main();
// セッションの終了
$session->close();
?>]]>
次の例は、サーバー側からネットワーク上のウェブページアクセスしてPDFに変換します。
'user',
'password' => 'kappa'));
//ファイル出力
@mkdir($dir, 0777, 'out');
$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に収められています。
ウェブアプリケーションでは、Content-Type, Content-Lengthヘッダを出力しないと、 ブラウザ上でPDFが正常に表示されないことがあります。 set_resultsやset_output_XXX関数を呼び出さない初期状態では、 出力先は標準出力に設定されています。 このとき、自動的にContent-Lengthヘッダが出力されます。 Content-Typeはheader関数により、アプリケーションで出力してください。
他のプログラムによる出力を変換するには、start_main, end_mainの間でincludeしてください。 以下の例では、bbs.phpというプログラムの出力を変換します。
start_main('.',
array('mimeType' => 'text/html'));
include("bbs.php");
$session->end_main();
...]]>
start_resource, end_resourceについても、同じことができます。
出力先を変え、start_main/end_main または transcodeを繰り返し呼び出すことで、 同じセッションで何度もドキュメントを変換することができます。 送信済みのリソース、設定済みのプロパティは同じセッションで維持されます。 同じセッションのまま初期状態に戻すには $session->reset() を呼び出してください。
set_output_as_resource, set_output_as_fileにより、 単一のファイルハンドルかファイルを出力先として設定することができます。 また、set_output_as_variableに変数の参照を渡すと、変数に結果が出力されます。
複数の結果をファイルとして出力する場合は、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が相対パスであるという前提で、ローカルのファイルがあればサーバーに送信します。
...
function resolver($uri, $r) {
if (file_exists($uri)) {
$r->start();
readfile($uri);
$r->end();
}
}
$func = 'resolver';
$session->set_resolver_func($func);
...
実際に動作するサンプルはドライバの src/test/resolver.php にあります。
複数の結果を結合したものを得るためには、 $session->set_continuous(TRUE) を呼び出した後、transcodeを複数回呼び出し、最後に $session->join() を呼び出してください。
...
$session->set_continuous(TRUE);
//文書の送信
$session->start_main('.');
readfile("data/test.html");
$session->end_main();
//文書の送信
$session->start_main('.');
readfile("data/test.html");
$session->end_main();
$session->join();
...
実際に動作するサンプルはドライバの src/test/continuous.php にあります。
ドライバのソースコードはGitHubで公開しています。 https://github.com/zamasoftnet/cti.php