今回は TCPDF に備わっている トランザクション処理 について説明したいと思います。
トランザクション処理と言えばデータベースでの更新処理には付きものの処理で PHP でプログラムした方であれば使用したことがあると思います。
TCPDF に備わっているトランザクション処理も、データベース処理でのものとよく似ています。
トランザクションを開始し処理がOKであればコミットを行い、何か問題があればロールバックすることになります。
TCPDF のトランザクション処理メソッドは以下の通りです。
- startTransaction() : トランザクション開始
- commitTransaction() : トランザクションコミット
- rollbackTransaction() : トランザクションロールバック
それでは簡単な例として以下のソースを見て下さい。
<?php
require_once('../tcpdf/tcpdf.php');
// クラス生成
$pdf = new TCPDF();
// デフォルトで用意されている日本語フォント[小塚ゴシックPro M]
$strFont = "kozgopromedium";
// ヘッダ・フッタ出力設定(特にいらないが)
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// 本文の日本語フォント[小塚ゴシックPro M]
$pdf->SetFont($strFont, "", 10);
// 新しいpdfページを追加
$pdf->AddPage();
// valign テスト
$pdf->Write(0, "transaction テスト\n");
// transaction開始
$pdf->startTransaction();
// 2行書込み
$pdf->Write(0, "transaction - 1\n");
$pdf->Write(0, "transaction - 2\n");
// transactionリスタート
$pdf->startTransaction();
// 1行書込み
$pdf->Write(0, "transaction - 3\n");
// 最後のtransactionに戻る
$pdf = $pdf->rollbackTransaction(); // 戻り値を元の「$pdf」にコピーに注意!!
// transaction無し・2行書込み
$pdf->Write(0, "transaction - 4\n");
$pdf->Write(0, "transaction - 5\n");
// transaction開始
$pdf->startTransaction();
// 1行書込み
$pdf->Write(0, "transaction - 6\n");
// transactionコミット
$pdf->commitTransaction();
// pdf表示設定
$pdf->Output('pdftrans-1.pdf', 'I'); // 'I':ブラウザに出力する(既定)
?>
これの実行結果は以下の通りです。
この例で注意する点が startTransaction メソッドでトランザクションを開始し、PDF出力処理を行った後に再度トランザクションを開始しています。
そうしますと結果として再度のトランザクションはそれまでのトランザクションをコミットし、再度トランザクションを開始する様です。 その後 Write メソッドで「transaction - 3」の文字列の出力を行いますが、rollbackTransaction メソッドでロールバックを行うと、 「transaction - 3」の文字列が表示されなくなります。
rollbackTransaction メソッドの戻り値は TCPDF オブジェクトを返すのですが、 そのオブジェクトはトランザクションで貯めていたPDF出力操作がクリアな状態になります。
TCPDF のトランザクション処理はそこまで難しくは無いのですが、私としてはどの様な時に使うのかがいまいちよく分かりません。
■トランザクション処理のページ跨ぎのテスト
上記の例でトランザクション処理のロールバックにより、 startTransaction メソッドから rollbackTransaction メソッドに はさまれたPDF出力の処理が行われないことを説明しました。
ところで以前 MultiCell メソッドにおいて縦方向が伸長される場合があることを記しました。 その時、次のページへの伸長もあることを説明しましたが、これにトランザクション処理を入れた場合 ページの処理はどうなるかが気になりましたので、以下のソースでテストしてみました。
<?php
require_once('../tcpdf/tcpdf.php');
// クラス生成
$pdf = new TCPDF();
// デフォルトで用意されている日本語フォント[小塚ゴシックPro M]
$strFont = "kozgopromedium";
// ヘッダ・フッタ出力設定(特にいらないが)
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// 本文の日本語フォント[小塚ゴシックPro M]
$pdf->SetFont($strFont, "", 10);
// 新しいpdfページを追加
$pdf->AddPage();
// valign テスト
$pdf->Write(0, 'valign テスト', '', false, '', true);
$strAdd = "\r\n0123456789\r\n0123456789";
$strTxt = "\$valign['T']:Top \r\n\$align['L']左揃え" .$strAdd;
// 以下の「MultiCell」の一連の処理をトランザクションで挟む
// transaction開始
$pdf->startTransaction();
// 線のStyleで「破線」指示
$pdf->SetLineStyle(array('dash' => '2'));
// 縦サイズ:20で文字列を表示
$h = 10;
$y = 265;
$pdf->MultiCell(60, $h, $strTxt, 1, 'L', false, 1, 10, $y, true, 0, false, true, 60,'T');
// ロールバック
$pdf = $pdf->rollbackTransaction();
//$pdf->commitTransaction();
// 線のStyleで「破線」指示で、色がRGB指定で「赤」
$pdf->setPage(1);
$pdf->SetLineStyle(array('dash' => '2', 'color' => array(255, 0, 0)));
// 四角い枠線を表示(縦サイズ:20)
$pdf->Rect( 10, $y, 60, $h, 'D');
// pdf表示設定
$pdf->Output('pdftrans-2.pdf', 'I');
?>
これの実行結果は以下の通りです。
MultiCell メソッドの描画が割愛された表示になっているのが分かります。
ロールバックとコミットのコメントを入れ替えると、 ページが伸長され2ページ渡って MultiCell メソッドの描画が行われるはずです。
コメント