スポンサードリンク
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ではロゴがでないんですね。
僕が使ったときはロゴが出てたんですよ。
バージョンが古かったのかもしれません。
貴重な情報ありがとうございます。