
CakePHPで作っているものに
PDFファイルで出力することになったので
色々探しましたところ
HTMLで作れて、CSSでレイアウト(※使えないものも有り)ができる
TCPDFがいいと思い実装してみました。
TCPDFをダウンロードしてフォルダに入れる
ます、TCPDFのサイトへ行きファイルをダウンロードします。
TCPDF(←ここから)

サイトに行ったら赤枠のところのダウンロードページへ行きます。

赤枠で囲った所のファイルをダウンロードします。
ダウンロードしたファイルを解凍して
CakePHPのフォルダの
app→Venderフォルダに解凍したフォルダごといれます。
ControllerにTCPDFを使えるように記述
使うコントローラーのメソッド内に以下のように記述します。
例:PdfsControllerの場合
<?php
class PdfsController extends AppController {
public $components = array('RequestHandler');
public function pdf() {
// Content-Type
$this->RequestHandler->respondAs('application/pdf');
// レイアウトは使わない
$this->layout = '';
}
}
ビューを作成する
App::import('Vendor','tcpdf/tcpdf');
// PDF オブジェクトを作成
/*
PDF_PAGE_ORIENTATION:用紙の向き[P=縦方向、L=横方向] デフォルトはP
PDF_UNIT:処理単位[pt=ポイント、mm=ミリメートル、cm=センチメートル、in=インチ] デフォルトはmm
PDF_PAGE_FORMAT :ページフォーマット ( デフォルトは A4 )
※上記は /tcpdf/config/tcpdf_config.php ファイルで定義されています。
*/
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8');
// ヘッダーフッターの設定
// 文字が小さく線が出るので削除します
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
//改行位置を設定
$pdf->SetAutoPageBreak(true, 5);
※第1引数は改ページするかどうか
第2引数はページ下部からどの位置で改ページするか、既定値は2cm。
// 1ページ目を準備
$pdf->AddPage();
$pdf_file = <<< EOF
<style>
.center{
text-align: center;
}
</style>
<table>
<tr>
<td style="width:80%;"></td>
<td style="font-size:12px; width:10%; height: 18px; line-height: 2px;" class="center">月</td>
<td style="font-size:12px; width:10%; height: 18px; line-height: 2px;" class="center">日</td>
</tr>
<tr>
<td></td>
<td style="font-size:12px; width:10%; height: 18px; line-height: 2px;" class="center"></td>
<td style="font-size:12px; width:10%; height: 18px; line-height: 2px;" class="center"></td>
</tr>
</table>
EOF;
// 作った HTML を書きだします。
$pdf->writeHTML($pdf_file, false, false, false, false, 'L');
// PDF を出力 ( I = ブラウザ出力, D = ダウンロード, F = ローカルファイルとして保存, S = 文字列として出力 )
$pdf->Output("test.pdf", "D");
レイアウトはmarginやpadding、floatが効かなかったので
テーブルレイアウトを使った方がいいかと思います。
(参考)
CakePHPでPDF出力
日本語のファイル名で保存する
TCPDFは日本語でファイル名で保存できないみたいです。
こちらのサイトを参考にさせて頂きました。
(参考)
TCPDFのOutputで日本語ファイル名が消える
方法として、
最後のPDFで出力するところで
$filename = mb_convert_encoding(("日本語ファイル名", "SJIS", "UTF-8"); $pdf->Output($file_name.".pdf","D");
とします。
このままではまだ日本語で保存できないので
tcpdfフォルダ直下のtcpdfファイルを調整します。
7503行目にあるOutputメソッド内の
if ($dest{0} != 'F') {
$name = preg_replace('/[\s]+/', '_', $name);
$name = preg_replace('/[^a-zA-Z0-9_\.-]/', '', $name);
}
のpreg_replaceの部分をコメントアウトします。
//$name = preg_replace('/[^a-zA-Z0-9_\.-]/', '', $name);
これだけで日本語ファイルとして出力されました。
ただ、参考にさせて頂いたサイトより
変更箇所が極端に少なかったけど・・・?
まあ、これで目的は達成できました。
TCPDFのメソッド調べるのはこちらを使うと便利です。
TCPDF Manual – 日本語版 ( Ver.4.6.021 )
その他
今回はTCPDFを使ったのですが、
他にもmPDFというものがありまして、
こちらの方がCSSのレイアウトがしやすいとか
書いてあったんですが、
PDFファイルを作ると
ロゴが自動的にできるらしく断念しました。
mPDF

通りすがりの者です。
mpdfについて
「PDFファイルを作るとロゴが自動的にできるらしく断念しました。」
とありますが、mpdf60をつかって実際に出力していますが、ロゴは出ませんよ。
>スギヤマさん
コメントありがとうございます。
mpdf60ではロゴがでないんですね。
僕が使ったときはロゴが出てたんですよ。
バージョンが古かったのかもしれません。
貴重な情報ありがとうございます。