スポンサードリンク

cake-logo
cake-logo

CakePHPで作っているものに

PDFファイルで出力することになったので

色々探しましたところ

HTMLで作れて、CSSでレイアウト(※使えないものも有り)ができる

TCPDFがいいと思い実装してみました。

スポンサードリンク

TCPDFをダウンロードしてフォルダに入れる

ます、TCPDFのサイトへ行きファイルをダウンロードします。

TCPDF(←ここから)

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

スポンサードリンク