gengokumura.com

CakePHP2でPDF出力

既存で動いてるCakePHP2のシステムで表示したページをPDF出力した時の話。

PHPでのPDF出力ならwkhtmltopdfが良いのですがレンタルサーバだとそのままだと動かないことがあります。
インストールする方法ありますが、今回は別のライブラリを選択することにしました。(CakePHP3もそのままでは動きませんし。。) 試したのはライブラリは下記。

TCPDFはちょっとレンダリングに辛さあったので。。
検証した結果、mPDFはposition周りが非サポートで要素を重ねた表現が難しかったのと 既存のcssがほぼそのまま利用可能だった Dompdf 0.7を採用しました。 (バッジつけたかったのです)

インストール

app/Venderフォルダでドキュメントのままインストール php-font-libなどの必要なモジュールもそのままインストール。

cd app/Vender

git clone https://github.com/dompdf/dompdf.git
cd dompdf

git clone https://github.com/PhenX/php-font-lib.git lib/php-font-lib
cd lib/php-font-lib
git checkout 0.4
cd ..

git clone https://github.com/PhenX/php-svg-lib.git php-svg-lib
cd php-svg-lib

日本語フォントもインストールもしたいのでload_font.phpも格納。 フォントはIPAフォントから取得。

下記のコマンドで、dompdf/libs/にttfファイルとutfファイルが格納されます。

php dompdf/load_font.php ipagothic /path/to/ipag.ttf

CakePHP2

下記ざっくりと。

app/Controller/PagesController.php

App::uses('AppController', 'Controller');
class PagesController extends AppController {
  public $layout = 'dompdf';
  public function pdf(){
  }
}

ページを分割させたい場合は高さで調整させるしかなさそうです。。

app/View/Pages/pdf.ctp

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<style>
body {
	font-family: ipagothic , sans-serif; /* インストールしたフォント名で指定 */
}
</style>
</head>
<body >
<header>ヘッダー</header>
<article>ほげほげ</article>
</body>

app/View/Layouts/dompdf.ctp

<?php
require_once(APP . 'Vendor' . DS . 'dompdf' . DS . 'autoload.inc.php');
use Dompdf\Dompdf;

$dompdf = new Dompdf();
$dompdf->set_option( 'enable_font_subsetting' , true ); //フォントまるごと入れるとファイルがでかいので
$dompdf->set_option('isHtml5ParserEnabled', true); //HTML5タグを含む場合
$dompdf->loadHtml($content_for_layout);
$dompdf->setPaper('A4');

$this->response->type('pdf'); // PDFとして表示用
echo $dompdf->output(); //今回はブラウザで表示させました。

下記アドレスにアクセスするとpdf表示されるはず。

http://ドメイン/pages/pdf