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よりも先に読み込ませる。