Skip to main content.

Thursday, October 25, 2007

Ethnaで販売管理システムを部分的に開発してみる(その6)PDFファイルの出力

「Ethnaで販売管理システムを部分的に開発してみる」の続きです。今回は、PDFファイルの出力についてです。PDF出力には、mbfpdf(fpdf)を使用しています。mbfpdfについては、以前書いた記事を参照してください。ここでは、今回の出力内容とEthnaでmbfpdfを使ってみてポイントと思われた項目についてです。

PDF出力処理概要
受注一覧のチェックシートボタンでPDFファイルを出力しています。出力内容は、受注内容のヘッダ部分(受注テーブル)と明細部分(受注明細テーブル)の情報の一部分です。処理としては、受注テーブルと受注明細テーブルのそれぞれから、受注番号をキーにして関連するマスタの情報も含めてデータを取得しています。その情報をPDFに出力しています。

受注一覧画面


受注チェックシート


PDF出力処理実装
実装としては、appディレクトリ配下にfpdf.php、mbfpdf.phpとfontディレクトリを配置しています。それから、Salesmgr_OrderManager.php(アプリケーションマネージャ)で受注チェックシートをmbfpdfを使ってPDFファイルで出力しています。アクションでこのアプリケーションマネージャを呼び出しています。
Salesmgr_OrderManager.php(アプリケーションマネージャ)の表示

以下は、Ethnaからのmbfpdfの呼び出しのポイントと思われた項目についてです。

グローバル編集の取得エラー
今回、単純にEthnaからmbfpdfを使ってみたのですが、まず、mbfpdfのAddMBFontのメソッドでグローバル変数が取得出来ませんでした。その部分を新規にメソッドを追加して対応しました。

修正後のAddMBFontメソッド
function AddMBFont($family='',$enc='')
{
    //これは取得出来ないので修正
    //global $MBTTFDEF,$MBCMAP;

    //$gt=$MBTTFDEF;
    //$gc=$MBCMAP;

    $gt=$this->setMBTTFDEF();
    $gc=$this->setMBCMAP();

    if ($enc == '' || isset($gc[$enc]) == false) {
        die("AddMBFont: ERROR Encoding [$enc] Undefine.");
    }
    if (isset($gt[$family])) {
        $ut=$gt[$family]['ut'];
        $up=$gt[$family]['up'];
        $cw=$gt[$family]['cw'];
        $cm=$gc[$enc]['CMap'];
        $od=$gc[$enc]['Ordering'];
        $sp=$gc[$enc]['Supplement'];
        $registry=array('ordering'=>$od,'supplement'=>$sp);
        $this->AddCIDFont($family,''  ,"$family"           ,$cw,$cm,$registry,$ut,$up);
        $this->AddCIDFont($family,'B' ,"$family,Bold"      ,$cw,$cm,$registry,$ut,$up);
        $this->AddCIDFont($family,'I' ,"$family,Italic"    ,$cw,$cm,$registry,$ut,$up);
        $this->AddCIDFont($family,'BI',"$family,BoldItalic",$cw,$cm,$registry,$ut,$up);
    } else {
        die("AddMBFont: ERROR FontName [$family] Undefine.");
    }
}

追加したメソッド
//
//追加したメソッド
//
function setMBTTFDEF(){
   require('font/mbttfdef.php');   // Multi-Byte TrueType Font Define
   return $MBTTFDEF;
}

function setMBCMAP(){
   // Encoding & CMap List (CMap information from Acrobat Reader Resource/CMap folder)
   $MBCMAP['BIG5']   = array ('CMap'=>'ETenms-B5-H'   ,'Ordering'=>'CNS1'  ,'Supplement'=>0);
   $MBCMAP['GB']     = array ('CMap'=>'GBKp-EUC-H'    ,'Ordering'=>'GB1'   ,'Supplement'=>2);
   $MBCMAP['SJIS']   = array ('CMap'=>'90msp-RKSJ-H'  ,'Ordering'=>'Japan1','Supplement'=>2);
   $MBCMAP['UNIJIS'] = array ('CMap'=>'UniJIS-UTF16-H','Ordering'=>'Japan1','Supplement'=>5);
   $MBCMAP['EUC-JP'] = array ('CMap'=>'EUC-H'         ,'Ordering'=>'Japan1','Supplement'=>1);
   return  $MBCMAP;
}
この問題については、以下のページを参考にさせていただきました。参考にというかそのまま利用させていただきました。ありがとうございました。
"PDFファイルをPHPで即、生成" フォーラム - CakePHP Users in Japan

PDFファイルの出力先
上記の内容を修正後、PDFファイルを画面に出力しようとしたのですが出力出来ませんでした。それで、以下のように、一旦ファイルに出力した後に、リダイレクトでファイルのURLを指定して出力させると出力出来ました。なぜ直接画面に出力出来ないのかは今のところ分かりません。ファイルに出力出来るのでいいといえばいいのですが、ファイルが残るのでその点が問題です。

Salesmgr_OrderManager.phpのfunction checksheet($orderId)の最後の部分

//ファイルへ出力してリダイレクト
$pdf->Output('../pdf/orderchecksheet.pdf','f');
header('location: ../pdf/orderchecksheet.pdf');

以上が、「Ethnaで販売管理システムを部分的に開発してみる」でのPDFファイル出力についてです。

今回作成したプロジェクト一式は以下からダウンロードしてご覧いただけます。
「Ethnaで販売管理システムを部分的に開発してみる」のプロジェクト一式

今回で、「Ethnaで販売管理システムを部分的に開発してみる」は、とりあえず終了です。また時間が取れれば続きを書きたいと思っています。

当サイトでのEthna関連記事一覧


参考書籍
Ethna×PHP [LLフレームワークBooks] (LLフレームワークBOOKS # 2)
Ethna×PHP [LLフレームワークBooks] (LLフレームワークBOOKS # 2)
藤本 真樹一井 崇鶴岡 直也新井 啓太
技術評論社

¥ 1,980 (定価)
¥ 1,980 (Amazon価格)
19pt (Amazonポイント)
 (Amazonおすすめ度)
単行本(ソフトカバー)
通常24時間以内に発送
(価格・在庫状況は1月6日 17:39現在)


グラス片手にデータベース設計~販売管理システム編 (DBMagazine SELECTION)
グラス片手にデータベース設計~販売管理システム編 (DBMagazine SELECTION)
梅田 弘之
翔泳社

¥ 2,520 (定価)
¥ 2,520 (Amazon価格)
25pt (Amazonポイント)
★★★★☆ (Amazonおすすめ度)
単行本
通常24時間以内に発送
(価格・在庫状況は1月6日 17:39現在)