edo1z blog

プログラミングなどに関するブログです

cakePHP2.3 mPDFを使ってPDFを出力する(レイアウト・ビューを使ってPDFを作成しサーバに保存する)

mPDFのcakePHP用コンポーネントを作ってくれている人がいるのでそれを使った。

コンポーネントの説明も分かりやすいし、操作も簡単なので有り難い。 このコンポーネントを使って出力すると下記のようになる。

public $components = array('Mpdf');

public function make_bill($filename){
    $this->layout = 'pdf';
    $info = array('name' => '太郎');
    $this->set(compact($info));
    $this->Mpdf->init(array('mode'=>'ja'));
    $this->Mpdf->setFilename($filename);
    $this->Mpdf->setOutput('F');
}

これだけで、普通にHTMLを表示する場合と同じように、レイアウト・ビューが使える。 ただ、このコンポーネントは、cakePHPがブラウザに出力する直前にmpdfのoutputを行っている。PDFを一つ作成するだけなら問題ないかもしれないが、複数のPDFファイルを作成し、サーバに保存したい場合などは、このコンポーネントだと問題がある。 複数のファイルを作成・保存する場合は、コンポーネントを改造するか、直接mPDF本体を使う必用がある。

mPDF本体を使う場合は下記のようになる。

private function make_bill2($filename,$info){
    Configure::write('debug', 0);
    App::import('Vendor', 'Mpdf/mpdf');

    //PDF作成用HTMLの取得
    $View = new View();
    $View->viewPath = 'jobs'; // Viewの下のフォルダ名
    $View->viewVars = $info; //パラメータ
    $html = $View->render('make_bill','pdf');

    //PDF作成
    $mpdf = new mPDF('ja', 'A4');
    $mpdf->writeHTML($html);
    $mpdf->Output($filename,'F');
}

これで、コンポーネント使用時と同じレイアウト・ビューも使える。

参考: http://npucc.com/index.php?mPDF 【cakePHP】コントローラからViewファイルを使う

追記:2013年6月18日

Shell経由で上記を使うとうまくスタイルシートが読み込めなかった。pdfレイアウトにHTMLヘルパーで読み込んでるんだけど、絶対パスにしてもダメなので、下記のようにスタイルシートファイルを直接mPDFに渡した。

$css = file_get_contents(CSS . 'pdf.css');
$mpdf = new mPDF('ja', 'A4');
$mpdf->writeHTML($css,1);
$mpdf->writeHTML($html);
$mpdf->Output($full_path,'F');

スタイルシートを渡すときは、writeHTMLの第二引数を1にする。またHTMLよりも先に読み込ませる。