PR

CakePHPでPDF出力する(準備編)

インストールとテストをします。様々な解説がありますが、やっぱりハマります。

過去にはphpMyFaqでPDF出力にバグがあった際、それを直せなかった、挫折した経験があるので、同じものを使うとなると、やっぱりアレルギー出ます・・・。そしてしっかりハマりました。

ここではCakePHP 1.2の環境でPDF出力できるようにします。

FPDFの準備

  1. まず、ダウンロード
  2. 解凍したファイルを /vendors/fpdf に転送

FPDIの準備

  1. まず、ダウンロード
  2. 解凍したファイルを /vendors/fpdi に転送

スポンサードリンク

インストールというか、変更

fpdf/japanese.php の変更

変更1

//require('fpdf.php');

App::import('Vendor', 'FPDF', array('file' => 'fpdf/fpdf.php'));
App::import('Vendor', 'FPDI', array('file' => 'fpdi/fpdi.php'));

変更2

//class PDF_Japanese extends FPDF

↓ classの変更と、$SJIS_widths を class の外から内に移動して、var をつける

class PDF_Japanese extends FPDI{
 var $SJIS_widths=array(' '=>278,'!'=>299,'"'=>353,'#'=>614,'$'=>614,'%'=>721,'&'=>735,'\''=>216,

変更3

function AddSJISFont($family='SJIS'){
  //Add SJIS font with proportional Latin
  $name='KozMinPro-Regular-Acro';
  //$cw=$GLOBALS['SJIS_widths'];
  $CMap='90msp-RKSJ-H';
  $registry=array('ordering'=>'Japan1','supplement'=>2);
  //$this->AddCIDFonts($family,$name,$cw,$CMap,$registry);
  $this->AddCIDFonts($family,$name,$this->SJIS_widths,$CMap,$registry);
 }

レイアウトの追加

/views/layouts/pdf.ctp を作成

<?php
 //header('Content-type: text/html');
 header('Content-type: application/pdf');
 header('Content-Disposition: attachment; filename="downloaded.pdf"');
 header('Cache-Control: no-store, no-cache, must-revalidate');
 echo $content_for_layout;
 ?>

ヘルパーの追加

/views/helpers/fpdf.php を作成

以下のサイトから拝借。コピペは常に全角文字の混入などに注意する。

CakePHP1.2RC3でPDFを作成するときのメモ – 忍び歩く男 – SLYWALKER :
http://d.hatena.ne.jp/slywalker/20081030/1225374299

テスト環境の準備

コントローラ controllers/tests_controller.php 、 ビュー views/tests/index.ctp を以下を参考に準備する。

忍び歩く男 – SLYWALKER :
http://d.hatena.ne.jp/slywalker/200810

あとは設置urlにアクセスすれば保存画面が出る。

ハマリどころ

  • CakePHP のバージョンの関係で使えなくなるもの、規約が変更になるものなどがあるので注意。thtmlはもう使わないとか。常にctpなので関係なかったけど。
  • var $SJIS_widths の場所を移動しないと、そんなプロパティーはねぇと怒られる。
  • header(‘Content-Disposition: attachment; filename=”downloaded.pdf”‘); を入れないと保存画面が出なかった。画面上で開ければいいけれどうまく行かなかった。
  • HTTPのヘッダを確認することは重要。何が出てるのか調べると意外なものが出てたりする。キャッシュなどにも関係しているのでしょう。
  • ハマったら、
    • 全角文字の混入などにもう一度注意してみて~
    • tests_controller.php のデバッグレベルを0にしているところを一度コメントアウトし~
    • layout/pdf.ctp のhttpヘッダでPDFを出力しているとろを、一旦テキストにしてみて~
    • httpヘッダを見るツールで見てみて~
    • ブラウザもきちんと更新されているか動作を注意深く見てみて~ とかかな

参考文献

コメント