目次


TCPDF を使ってオンザフライで PDF を作成する

Web ページを完璧なプリントアウトに変身させる

Comments

はじめに

Sourceforge.net でホストされている最も活発なプロジェクトの 1 つである TCPDF は、完全に PHP のみで作成された強力な PDF 生成エンジンを実装しています。完全に PHP で作成されていることから、システム・ディレクトリーにアクセスできないサイトや、独自のコードをコンパイルできないサイトでも、簡単に TCPDF をインストールすることができます。さらに、PHP コードの実行によって生成される結果を、中間ステップなしで即座に確認することができるので、反復型開発が至って簡単になります。

TCPDF は、SVG ベクトル形式や、JPEG、PNG などのラスター形式を始めとする便利な画像形式を広範にサポートします。フォントについては、単純なスタンドアロン・ユーティリティーを使って TrueType、OpenType、PostScript Type 1、および CID-0 といったフォントを処理し、TCPDFで作成した文書に追加できるようになっています。ありとあらゆる 1-D および 2-D バーコード形式を生成するために使用できる TCPDF は、ブックマークや文書のリンク、そして圧縮、注釈、文書の暗号化、デジタル署名などの一般的な PDF の機能をすべてサポートします。

TCPDF と、TCPDF を使用するページは PHP で作成されるため、PDF を生成する Web ページを作成してデプロイするのは簡単です。TCPDF を開発してデプロイするには、サポートされている Web サーバーと皆さんのお好みの PHP 開発環境をどれでも使用することができますが、この記事では以下のものを使用します。

  • Eclipse V3.5.2 — 広範なプログラミング言語および環境をサポートする、私が好んで使用しているオープンソースの開発環境の 1 つです。
  • PHP Development Tools V2.2.0 — Eclipse 用のPHPプラグインです。
  • MAMP Pro V1.9 — Apache、MySQL、および PHP を、有用な GUI フロントエンドを備えた別個の環境に提供する Mac OS X 用の重宝なパッケージです。Mac OS X は Apache と PHP がインストールされた状態で出荷されますが、MAMP Pro は、容易に切り離して使える安定した Web サーバー/データベース/PHP のセットを提供することから、このパッケージを使用することにしました。
  • TCPDF V5.0.006 — 現行の TCPDF 安定バージョンです。

参考文献」セクションに、上記の製品すべてのダウンロード・リンクが記載されています。

それではこれから、皆さん独自の Web サイトで TCPDF をどのように利用できるかを調べていきます (PHP がインストールされていることが前提条件です)。まずは TCPDF のインストール・プロセスをひと通り説明してから、PHP を使って、どんな e-コマース・サイトにも付き物の請求書形式の文書を表示する Web ページを生成します。その後、TCPDF を使用して、印刷可能な PDF バージョンの請求書を同じようなフォーマットで作成します。

TCPDFのインストール

Sourceforge.net から TCPDF をダウンロードすると、必要なものをすべて完備した ZIP アーカイブという形で TCPDF を入手することができます。つまり、任意の ZIP 解凍ツールを使ってアーカイブを解凍すると、作業を開始するために必要なすべてのものが含まれた TCPDF ディレクトリーを手に入れられるというわけです。

この TCPDF ディレクトリーを Web 文書のディレクトリーに追加すれば、doc/index.html をロードして TCPDF マニュアルにアクセスしたり、examples/index.php ファイルをロードしてサンプルを表示したりすることができます。ちなみに、これらのサンプルは、TCPDF Web サイトにも用意されています (「参考文献」を参照)。

ただし、サンプルを表示するには、あらかじめ TCPDF のインストール済み環境を構成しておかなければなりません。

構成 — UNIX ライクなシステムの場合

TCPDF を UNIX® ライクなシステムにインストールする場合は、ファイル・モードを変更して、あらゆるファイルに実行可能ファイルのフラグが立てられてしまうことのないようにする必要があります。実行可能ファイルのフラグが立てられるのは、TCPDF アーカイブが Microsoft® Windows® システム上で作成されることによる副次的な悪影響です。幸いシェルからコマンドを実行するだけで、簡単にファイル・モードを調整することができます (リスト 1 を参照)。さらに、cache ディレクトリーと images ディレクトリーを必ず書き込み可能にする必要があります。TCPDF はこれらのディレクトリーに一時ファイルを保管するからです。

次に必要な作業は、ファイルをユーザーに割り当て、Web サーバーをグループ化することです。通常、ユーザーは www、グループも www となりますが、お使いのシステムによって異なります。個人の Web サイトの中 (大抵はホーム・ディレクトリーの public_html) から TCPDF を実行している場合は、このステップを省略して構いません。

リスト 1. ファイル・モードと所有権の調整
$ cd tcpdf
$ find . -type f | xargs chmod -x
$ chmod +w cache images
$ chown -R www:www .

注意する点として、システムによってはユーザーとグループの区切りとして、コマンドで「: (コロン)」の代わりに「. (ピリオド)」を使用する場合があります。エラーが出たとしたら、システムのマニュアルで詳細を確認してください。

一般的な構成

お好みのテキスト・エディターで、config/tcpdf_config.php ファイルを開いてください。この、TCPDF の構成設定ファイルでは、ライブラリーのデフォルト値を制御できるとともに、サポートするファイルの検出方法を指定することができます。

tcpdf_config.php ファイルでは、以下の設定を変更する必要があるかもしれません。

  • PDF_PAGE_FORMAT — メートル法を基準にしたページ・フォーマットを使用しない場合は、letter に設定します。非常に特殊なものを使っているのでない限り、TCPDF は皆さんが使っているプリンターよりもサポートしているページ・サイズの種類は多いはずです。
  • PDF_UNIT — PDF 文書のレイアウトにミリメートル単位ではなくポイント単位を使用する場合は、pt に設定します。
  • PDF_CREATORPDF_AUTHOR — 作成ツールと作成者のデフォルト値です (PDF 生成コードで作成ツールと作成者を設定し忘れた場合)。

上記の設定は PHP コードでも調整することができるので、設定に自信が持てなくても安心してください (例えば、ここで縦置きの文書レイアウトを設定したとしても、それによって横置きの文書が作成できなくなるわけではありません)。

ファイルとディレクトリーがインストール時の場所から移動されていない限り、デフォルトの構成設定を使用すれば、TCPDF が付属のサンプルをどれも問題なくレンダリングするはずです。

この時点で、サンプル・ファイルをロードすることによって TCPDF システムが正常に機能していることを確認することができます。これで、TCPDF を使用して請求書の印刷可能バージョンを作成する作業に取り掛かれます。

請求書の作成

優れた e-コマース Web サイトを作成すると、その Web サイトを通じて顧客は商品を注文し、代金を支払います。それはそれで素晴らしいことですが、注文に誤りがあった場合、あるいはクレジット・カード会社のせいで支払いに手違いが生じた場合に備え、顧客には何らかの請求書が必要です。

そこでこれから、適度に見栄えの良い請求書 Web ページを作成し、顧客が注文内容とその代金を確認できるようにします。

最初のバージョン — Web ページ

私はお気に入りの PHP 開発環境を使って、Invoice フォルダーを新しく作成しておきました。このフォルダーには以下のファイルが保管されています。

  • Invoice.php — 請求書を生成するための PHP ファイル
  • Invoice.css — 請求書の CSS スタイル設定ファイル
  • Azuresol_OnyxTree-S.png — Azuresol 提供の「OnyxTree S」。このアイコンは、会社のロゴとして使用します (iconfinder.com Web サイトから無料で入手できるアイコンです。「参考文献」を参照)。
  • gentleface_print.png — gentleface 提供の「Print」。このアイコンを使用して、PDF 生成をトリガーします (このアイコンも、iconfinder.com から無料で入手することができます)。

Invoice.php 内部では、ページの呼び出しに PDF 引数が使われているのかどうかを確認します (リスト 2 を参照)。PDF 引数が使われていない場合、ユーザーは通常の Web ページを要求していることになるので、generateHTML 関数を使用して Web ページを表示します (リスト 3 を参照)。generatePDF 関数については後で説明しますが、これは請求書のデータからなる PDF を生成する場合に使用する関数だと考えて間違いありません。

リスト 2. ページの生成を制御するコード
if( array_key_exists( 'PDF', $_REQUEST ) ) {
    generatePDF( $invoiceData );
} else {
    generateHTML( $invoiceData );
}

$invoiceData 配列は、請求書のデータをすべて保持します。この例では Invoice.php でデータ配列を直接作成しますが、データベースや Web サービス、あるいは何らかのオンライン・ショッピング・カート・システムからデータを取得するという方法も考えられます。

リスト 3. HTML の生成
function generateHTML( $data ) {
?>
... HTML code was here ...
<?php
    foreach( $data['items'] as $item ) {
        echo '<tr class="invoiceRow">' . "\n";
        echo '    <td class="itemCol">' . $item[0] . "</td>\n";
        echo '    <td class="quantityCol">' . $item[1] . "</td>\n";
        echo '    <td class="priceCol">' . $item[2] . "</td>\n";
        echo '    <td class="costCol">' . $item[3]. "</td>\n";
        echo "</tr>\n";
    }
?>
... HTML code was here ...
<?php
    echo '<td class="totalCol">' . $data['total'] . "</td>\n";
?>
... HTML code was here ...
<?php
    echo 'Invoice prepared for ' . $data['user'] . ' on ' . $data['date'] . "\n";
?>
... HTML code was here ...
<?php
    
}

簡潔にするため、HTML マークアップ・コードは上記のリストではすべて省略しています。HTML マークアップ・コードを確認するには、CreatingPDFs-Invoice.zip アーカイブに含まれる Invoice.php を見てください。このアーカイブは「ダウンロード」セクションからダウンロードすることができます。

上記の関数は、$data として渡された請求書情報を使用して、商品ごとの行にその商品の数量、単価、合計金額を記載する表を作成します。表の最後には、注文の合計金額を記載する行を追加します。ページ・フッターに記載するのは、ユーザーのユーザー ID と請求書が作成された日時です

もちろんこれはかなり単純な関数ですが、この関数を実際のサイトに実装する際には、データ・ソースとのやりとり、そして CSS スタイルを正しく設定する方法が主な課題となります。

図 1. 見事な Web ページの請求書
魅力的で印刷可能な請求書の例を示すスクリーン・ショット。Sumatra Special の注文数は 24 個もありますが、他の商品については 1 個から 5 個までです。
魅力的で印刷可能な請求書の例を示すスクリーン・ショット。Sumatra Special の注文数は 24 個もありますが、他の商品については 1 個から 5 個までです。

この完全に架空の会社、South Seas Pacifica 社では、上質なコーヒーと紅茶を販売しています。上記の請求書を見ると、私がスマトラ産のコーヒー、紅茶にかなり入れ込んでいることは明らかです。少なくとも、価格はお手頃です!

ページの右下には、気を引かれるプリンターのアイコンがあります。皆さんは、このアイコンをクリックすれば請求書がプリントアウトされるだろうと期待することでしょう。そこで登場するのが TCPDF です。大切なお客様には、ただ Web ページを印刷して渡すのではなく、必要に応じて印刷できる、しゃれた PDF バージョンを提供してあげてください。

2 番目のバージョン — PDF

見栄えのする Web ページの請求書が用意できたところで、次に必要な作業は、印刷可能な PDF バージョンを作成することです。

リスト 2 に示されていたように、PDF 引数を指定して Invoice.php ページをロードすると (http://.../Invoice.php?PDF)、同じデータで generatePDF 関数が呼び出されます (リスト 4 を参照)。

リスト 4. PDF バージョンの請求書の生成
function generatePDF( $data ) {
    # Create a new PDF document.
    $pdf = new InvoicePdf( $data, 'P', 'pt', 'LETTER' );

    # Generate the invoice.
    $pdf->CreateInvoice();
    
    # Output the PDF document.
    $pdf->Output( 'Your_Invoice.pdf', 'D' );
}

generatePDF 関数は InvoicePdf オブジェクトを作成し、その CreateInvoice メソッドを呼び出した後、PDF 文書を Your_Invoice.pdf という名前のダウンロードとしてユーザーのブラウザーに送信します。極めて簡単なように見えますが、ここに表立っていない事実として、私はデフォルトで用意されている Invoice スタイル設定を複製して自分で InvoicePdf クラスを作成しなければなりませんでした。その方法をこれから説明します。

InvoicePdf クラスが継承する TCPDF の TCPDF クラスは、メインの PDF 生成エンジンです。コンストラクター (リスト 5 を参照) では、渡された $orientation (ページの向き)、$unit (単位)、$format (ページ・サイズ) を使って親クラスを初期化します。TCPDF コンストラクターの最後の3 つの引数は、入力が Unicode であること (デフォルトとして true を設定)、生成される PDF の文字エンコード方式が UTF-8 であること、そしてディスク・キャッシングを使用しないこと (false) を指定しています。ディスク・キャッシングを使用すれば、PDF 作成中のメモリー内のフットプリントを減らすことはできますが、速度は落ちてしまいます。この文書は大きくもなければ複雑でもないので、このトレードオフに甘んじる意味はありません。

親クラスを初期化した後、請求書データへの参照を保管して後で使用できるようにします。続いて SetMargins メソッドを使用して、ページの余白を左側と右側は 72 ポイントに、上部は 36 ポイントに設定します。SetMargins の最後の引数は、デフォルトのページ余白を新たに設定した値で上書きすることを指定しています。次の SetAutoPageBreaks メソッドで TCPDF に指示しているのは、ページの下端から 36 ポイントの位置に来たら自動的に新規ページを作成するという内容です。

リスト 5. InvoicePdf クラスのコンストラクター
function __construct( $data, $orientation, $unit, $format ) {
    parent::__construct( $orientation, $unit, $format, true, 'UTF-8', false );

    $this->invoiceData = $data;

    # Set the page margins: 72pt on each side, 36pt on top/bottom.
    $this->SetMargins( 72, 36, 72, true );
    $this->SetAutoPageBreak( true, 36 );
    
    # Set document meta-information
    $this->SetCreator( PDF_CREATOR );
    $this->SetAuthor( 'Chris Herborth (chrish@pobox.com)' );
    $this->SetTitle( 'Invoice for ' . $this->invoiceData['user'] );
    $this->SetSubject( "A simple invoice example for 'Creating PDFs on 
the fly with TCPDF' on IBM's developerWorks" );
    $this->SetKeywords( 'PHP, sample, invoice, PDF, TCPDF' );

    //set image scale factor
    $this->setImageScale(PDF_IMAGE_SCALE_RATIO); 
    
    //set some language-dependent strings
    global $l;
    $this->setLanguageArray($l);
}

余白の設定に続き、PDF 文書のメタ情報を設定します。この情報は、PDF ビューアー内の文書プロパティー・ウィンドウに表示されることになります。これは単なる文字列なので、アプリケーションに意味のある情報であれば、何を設定しても構いません。

setImageScale メソッドでは、TCPDF の構成ファイルに設定されているデフォルトの画像拡大率を使用しています。この拡大率を使用して、ラスター形式の画像のサイズをピクセル・サイズからページに適した単位のサイズに調整します。

最後に setLanguageArray を使用して、言語に依存する文字列を PDF ファイルに設定します。これらの文字列は、TCPDF のメイン構成がロードする言語固有の構成ファイルに定義されています。

リスト 6 では、各ページのヘッダーの内容を生成するために呼び出される Header メソッドを変更しています。ここでは、まず始めに変数を定義します。最初に bigFont サイズを 14 ポイントに設定し、それからこの bigFont サイズに対するロゴ画像の相対サイズと標準テキストの相対サイズを割り出します。その後、TCPDF の呼び出しに取り掛かります。

ImagePngAlpha メソッドは、画像の左上隅をページの左端から 72 ポイント内側で上端から 36 ポイント下の位置に合わせてロゴ画像を挿入します。これは、前に設定した余白の設定と一致します。ロゴ画像は正方形なので、幅と高さには同じ値 (計算された $imageScale) を指定することができます。続いて、このメソッドの呼び出しでは PNG 画像と JPEG 画像のどちらでも挿入できるため、これが PNG 画像であることを明示します (PHP セットアップに GD ライブラリーがインストールされている場合には、GD でサポートされている画像もロードすることができます)。次に、null を指定している理由は、この画像の PDF リンク (AddLink メソッドで作成) のターゲットを追加しているわけではないためです。続いて T を使用して、次の PDF オブジェクトを画像域の右上隅に描画することを指定します。そして最後に TCPDF に対し、画像のサイズを変更しないこと、オリジナルの画像が 72 dpi (一般的な画像解像度) であること、画像をページで左寄せすることを指定しています。

以上のとおり、ImagePngAlpha メソッドでは、PDF 文書のページに画像を追加する方法を詳細に制御することができます (リスト 6 を参照)。

リスト 6. ページ・ヘッダーの生成
public function Header() {
    global $webcolor;

    # The image is this much larger than the company name text.
    $bigFont = 14;
    $imageScale = ( 128.0 / 26.0 ) * $bigFont;
    $smallFont = ( 16.0 / 26.0 ) * $bigFont;

    $this->ImagePngAlpha('Azuresol_OnyxTree-S.png', 72, 36, $imageScale, 
$imageScale, 'PNG', null, 'T', false, 72, 'L' );
    $this->SetFont('times', 'b', $bigFont );
    $this->Cell( 0, 0, 'South Seas Pacifica', 0, 1 );
    $this->SetFont('times', 'i', $smallFont );
    $this->Cell( $imageScale );
    $this->Cell( 0, 0, '', 0, 1 );
    $this->Cell( $imageScale );
    $this->Cell( 0, 0, '31337 Docks Avenue,', 0, 1 );
    $this->Cell( $imageScale );
    $this->Cell( 0, 0, 'Toronto, Ontario', 0, 1 );

    $this->SetY( 1.5 * 72, true );
    $this->SetLineStyle( array( 'width' => 2, 'color' => 
array( $webcolor['black'] ) ) );
    $this->Line( 72, 36 + $imageScale, $this->getPageWidth() - 72, 36 
+ $imageScale );
}

ロゴ画像をヘッダーに配置した後は、フォントを設定し (Times の太字。サイズは bigFont の設定と同じ)、会社名および住所の情報を保持する一連のセルを作成します。これらのセルにはテキストが含まれるため、その役割は HTML の表のセルと多少似ています。Cell メソッドは以下の引数を取ります (実際には他にも引数があります。引数の完全なリストについては、TCPDF のマニュアルを参照してくだい)。

  • Width — セルの幅。0 に設定すると、セルの幅は右側の余白まで (右から左の方向で表記する言語を使っている場合は、左側の余白まで) 広がります。
  • Height — セルの高さ。0 に設定すると、セルの高さはそのコンテンツが収まる高さまで伸びます。
  • Text — セル内に描画するテキスト。テキストには現行のフォントおよび色の設定が適用されます。
  • Border — セルを枠線で囲むかどうかを指定します。この例の場合、枠線は必要ないので 0 に設定します。セルを完全に枠線で囲む場合には1 を設定し、セルの特定の辺にのみ枠線を付ける場合は文字列を渡して指定します。
  • Position — 次のセルを作成する場所を指定します。1 は、次のセルを次の行の先頭に作成するように指定します。一方、0 を指定して次のセルを現行のセルの隣に追加することも、2 を指定して現行の X 位置を維持したまま次の行に移動することもできます。

最後に、Header メソッドでヘッダーの下端に、ページのコンテンツ域全幅にわたって 2 ポイントの黒い直線を描画します。図 2 に、この描画がページでどのように表示されるかを示します。これは、Mac OS X の Preview アプリケーションでレンダリングしたページです。

図 2. Web ページのヘッダーとまったく同じような印刷ヘッダー
ヘッダーのスクリーン・ショット。住所の左側にはグラフィック・ロゴが表示され、会社名は大きい太字のフォントで、その下にある住所は斜体で表示されています。
ヘッダーのスクリーン・ショット。住所の左側にはグラフィック・ロゴが表示され、会社名は大きい太字のフォントで、その下にある住所は斜体で表示されています。

これで、Web ページのヘッダーと同様のヘッダーを作成できましたが、フッターも必要です。それには、Footer メソッドを変更して、フッターを生成できるようにしてください。フッターを作成するのはヘッダーよりも遥かに簡単です。フッターにはユーザーの ID と請求書の日付を記載し、ヘッダーと同様の 2 ポイントの黒い直線でページの他の部分と区別すればよいのです。

このメソッドでまだ目にしたことのない部分は唯一、負の値を使用して SetY メソッドを呼び出すところだけです。こうすると、現行の Y が、ページ下端に相対して設定されます。この例では、ページ・フッターにかなり多めのスペースを残して、フッターが下部の余白に接近しすぎないようにしています (リスト 7 を参照)。

リスト 7. ページ・フッターの生成
public function Footer() {
    global $webcolor;

    $this->SetLineStyle( array( 'width' => 2, 'color' => 
array( $webcolor['black'] ) ) );
    $this->Line( 72, $this->getPageHeight() - 1.5 * 72 - 2, 
$this->getPageWidth() - 72, $this->getPageHeight() - 1.5 * 72 - 2 );
    $this->SetFont( 'times', '', 8 );
    $this->SetY( -1.5 * 72, true );
    $this->Cell( 72, 0, 'Invoice prepared for ' . 
$this->invoiceData['user'] . ' on ' . $this->invoiceData['date'] );
}

ページを作成すると、プリンター・アイコンを省略した Web バージョンの請求書のように見える結果となります。プリンター・アイコンを省略している理由は、これが印刷版だからです (印刷版では、プリンター・アイコンは冗長です)。結果を、図 3 に示します。

図 3. 印刷されたフッター
フッターのスクリーン・ショット。太い横線の下に、受取人、時刻と日付に関する詳細が示されています。
フッターのスクリーン・ショット。太い横線の下に、受取人、時刻と日付に関する詳細が示されています。

この時点で、ページにはヘッダーとフッターがあるだけで、後は空白です。このページを使えるものにするには、実際の請求書の内容を追加しなければなりません。

AddPage メソッドで新たなページ (この例では唯一のページ) を開始した後、フォントを 11 ポイントの Helvetica に設定し、挿入ポイントをページ上端から 144 ポイントのところに移します。これで、ヘッダーから表の上端までの間に多少のスペースができます。

次に、表を中央に配置するために必要なインデントの量を、ページの幅、左右の 72 ポイントの余白、1 つの幅広の列と 3 つの通常の列を基に計算します。

その後、列の見出しをレンダリングするための一連のセルを作成します。これらのセルには前に計算した値を使用し、各セルは完全に枠線で囲みます。また、数値の列のヘッダーを右揃えにして、ヘッダーが数値に揃うようにします。すべてのヘッダー・セルを作成し終わったら、最後に Ln メソッドを呼び出して、次の行の先頭に移動します。

foreach ループで請求書の項目を繰り返し処理することによって、このようなレイアウトをコンテンツ行のそれぞれで繰り返します (リスト 8 を参照)。

リスト 8. ページ・コンテンツの生成
public function CreateInvoice() {
    $this->AddPage();
    $this->SetFont( 'helvetica', '', 11 );
    $this->SetY( 144, true );

    # Table parameters
    #
    # Column size, wide (description) column, table indent, row height.
    $col = 72;
    $wideCol = 3 * $col;
    $indent = ( $this->getPageWidth() - 2 * 72 - $wideCol - 3 * $col ) / 2;
    $line = 18;

    # Table header
    $this->SetFont( '', 'b' );
    $this->Cell( $indent );
    $this->Cell( $wideCol, $line, 'Item', 1, 0, 'L' );
    $this->Cell( $col, $line, 'Quantity', 1, 0, 'R' );
    $this->Cell( $col, $line, 'Price', 1, 0, 'R' );
    $this->Cell( $col, $line, 'Cost', 1, 0, 'R' );
    $this->Ln();

    # Table content rows
    $this->SetFont( '', '' );
    foreach( $this->invoiceData['items'] as $item ) {
        $this->Cell( $indent );
        $this->Cell( $wideCol, $line, $item[0], 1, 0, 'L' );
        $this->Cell( $col, $line, $item[1], 1, 0, 'R' );
        $this->Cell( $col, $line, $item[2], 1, 0, 'R' );
        $this->Cell( $col, $line, $item[3], 1, 0, 'R' );
        $this->Ln();
    }

    # Table Total row
    $this->SetFont( '', 'b' );
    $this->Cell( $indent );
    $this->Cell( $wideCol + $col * 2, $line, 'Total:', 1, 0, 'R' );
    $this->SetFont( '', '' );
    $this->Cell( $col, $line, $this->invoiceData['total'], 1, 0, 'R' );
}

コードの最後の部分では、合計の行をレンダリングしています。この部分を見れば、どのようにしてセルの間で簡単にフォントのスタイルを変更しているかがわかるはずです (SetFont メソッドを呼び出して太字を有効/無効にすればよいのです)。請求書の合計は最後の列の終わりに表示するため、最初のテキスト・セルの幅は表の最初の 3 つの列にまたがるように設定されています。

以上の作業が完了すると、請求書の項目表はなかなかの見栄えになります (図 4 を参照)。

図 4. 請求書の項目
フォーマット設定された項目リストのスクリーン・ショット。このリストには、数量、価格、合計が示されています。
フォーマット設定された項目リストのスクリーン・ショット。このリストには、数量、価格、合計が示されています。

以上のように論理的にテキスト・セルをレイアウトすることによって、最初に作成した Web 請求書を印刷に最適な形で再現しました。Web ページ自体にも、基になるデータにも何の変更も加えることなく、既存の PHP Web ページに PDF を作成するためのサポートを追加できるのは、TCPDF のおかげです。

まとめ

この記事では、PDF 文書を生成するためによく使われている PHP ライブラリー、TCPDF を紹介しました。TCPDF では、ライブラリーを追加することなく PDF 文書を作成できるので、既存の PHP Web サイトの一部として簡単にインストールすることができます。記事では TCPDF を UNIX ライクなシステムにインストールして構成する方法について概説した後、外国産のホット・ドリンクを専門に扱う e-コマース・サイトで目にするような単純な Web ベースの請求書を作成しました。

本格的な請求書のように見える Web ページが完成した後は、TCPDF クラスを継承して請求書の PDF バージョンを生成しました。この PDF バージョンは、顧客がダウンロードすることも、後で印刷することもできます。Header および Footer メソッドを変更することによってページを見慣れた形にセットアップしてから、請求書の項目を表としてレイアウトするための追加のメソッドを作成しました。


ダウンロード可能なリソース


関連トピック

  • TCPDF.org にアクセスしてください。
  • Java アプリから動的に PDF ファイルを生成する」では、iText を紹介し、Java 技術アプリケーションから iText を使って PDF 文書を生成する方法を手順に沿って説明しています。
  • この記事のために、Iconfinder を使用して、会社のロゴおよびプリンター・アイコンとして無料で使用できるアイコンを探しました。Iconfinder では簡単に多数の高品質のアイコンをブラウズし、商業目的で使用できるかどうかとサイズを基準にフィルタリングすることができます。
  • Eclipse Platform入門」では Eclipse の歴史と概要を説明するなかで、Eclipse およびプラグインのインストール方法について詳しく説明しています。
  • developerWorks podcasts ではソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。
  • Twitter で developerWorks をフォローしてください。
  • オープンソース技術を使用して開発し、IBM の製品と併用するときに役立つ広範囲のハウツー情報、ツール、およびプロジェクト・アップデートについては、developerWorks Open source ゾーンを参照してください。
  • My developerWorks コミュニティーは、多種多様なトピックを網羅した全般的コミュニティーの成功例です。
  • Sourceforge.net から TCPDF プロジェクトをダウンロードしてください。
  • この記事では、Eclipse IDE を使用してコードを作成しました。
  • Eclipse 対応 PHP Development Tools を入手してください。
  • MAMP Pro (Mac OS X 用の Apache、MySQL、PHP パッケージ) を入手してください。
  • Lotus Connections documentation に、サポートされる Lotus Connections バージョンの製品マニュアルおよびその他のリソースがリストされています。
  • IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=521179
ArticleTitle=TCPDF を使ってオンザフライで PDF を作成する
publish-date=08102010