Skip to main content.

Monday, June 25, 2007

FPDFの利用(その2)日本語・CSVファイル出力

前回の続きでFPDFを利用してのPHPからのPDFファイル出力についてです。今回は日本語モジュール(本家作成のSJISのみが利用出来るモジュール)の利用とCSVファイルのデータ(日本語を含むデータ)を帳票形式に出力するサンプルです。

日本語モジュール
日本語モジュールは本家のこちらのページからダウンロード出来るようです。使い方は、FPDF-Jのこちらのページから引用させていただくと以下のようになります。

  • require "fpdf.php" のかわりに require "japanese.php" とします。
  • FPDFクラスを使うかわりに FPDF_japaneseクラスを使います。
  • AddMBFont()メソッドで、利用するマルチバイトフォントを宣言します。
  • 文字列出力前に、SetFont()メソッドで、出力フォントを設定します。

この日本語モジュールには以下のようなサンプルが付属されていました。実際の出力はこちらから見ることが出来ます。
<?php
require('japanese.php');

$pdf=new PDF_Japanese();
$pdf->AddSJISFont();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('SJIS','',18);
$pdf->Write(8,'9ヶ月の公開テストを経てPHP 3.0は1998年6月に公式にリリースされました。');
$pdf->Output();
?>


CSVファイルのデータ出力
次にCSVファイルデータを帳票形式に出力するサンプルです。参考にしたのは、Tutorial 2Tutorial 5あたりです。サンプルで使用したCSVファイルは、街区レベル位置参照情報というデータ(横浜市中区)です。GIS関連のことを調べていて見つけたデータです。日本語データが含まれていて、適当な件数のデータだったので使ってみました。サンプルということで御理解下さい。

街区レベル位置参照情報
サンプルで使用したCSVファイル(このサーバ上)
上記データのPDFファイル出力の実行

CSVファイルのデータ出力のPHPプログラム
以下、実際のプログラムです。
<?php
//
// FPDFでの帳票出力サンプル
// データは国土交通省街区レベル位置参照情報の横浜市中区のデータ
// (国土交通省街区レベル位置参照情報については"http://nlftp.mlit.go.jp/isj/"を参照して下さい)
//

//実行環境
define('FPDF_FONTPATH','font/');

//japanese.phpを使用した場合、日本語はSJISしか使えないようです
require('japanese.php');

//この帳票のクラス(PDF_japaneseを継承)
class PDFReport extends PDF_japanese
{
    //
    //ページごとのヘッダ部分出力
    //
    function Header()
    {
        //ページごとのタイトル
        $this->SetFont('SJIS','B',16);

        //このような固定の文字列をソースで記述する場合もSJISで記述しないと化けます
        $this->write(3,"国土交通省 街区レベル位置参照情報 横浜市中区");
        
        //ページごとの項目ヘッダ
        $this->SetFont('SJIS','',11);
        $header=array('都道府県名','市区町村名','大字・町丁目','街区符号・地番','座標系番号','X座標','Y座標','緯度','経度');

        //文字が重ならないように改行
        $this->Ln(5);
        
        //上の項目名をそれぞれ出力
        foreach($header as $col){
            $this->Cell(30,7,$col,1,0,'C');
        }

        $this->Ln();
    }

    //
    // ページごとのフッタ部分出力
    //
    function Footer()
    {
        //下から1.5センチのところ
        $this->SetY(-15);
        
        //Arial イタリック 
        $this->SetFont('Arial','I',9);

        //ページ番号
        $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
    }

    //
    // CSVファイルからデータを一括で読み込み
    //
    function LoadData($file)
    {
        $handle = fopen($file,"r");
        while (($linedata = fgetcsv($handle, 120, ",")) !== FALSE) {
            $data[] = $linedata;
        }
        fclose($handle);

        return $data;
    }

    //
    // データを出力
    //
    function OutputTable($data)
    {
        $this->SetFont('SJIS','',11);

        // データを1項目ずつ出力
        foreach($data as $row){
            $colCnt = 0;

            foreach($row as $col){
                //住所部分までは左詰め
                if($colCnt<3){
                    $ass = 'L';
                
                //数値データは右詰め
                }else{
                    $ass = 'R';
                }

                $this->Cell(30,6,$col,1,0,$ass);
                $colCnt++;
            }

            $this->Ln();
        }
    }
}

//帳票作成、出力
//オブジェクト生成
$pdf=new PDFReport('L');
$pdf->AliasNbPages();

//データ読み込み
$data=$pdf->LoadData('./14104_2006.csv');

//フォント設定
$pdf->AddSJISFont();

//ページ追加
$pdf->AddPage();

//データ出力
$pdf->OutputTable($data);

//出力
$pdf->Output();
?>


次は、mbfpdfを使ってみます。次へ移動

関連サイト
本家サイト
日本語での情報交換を行うためのサイト
FPDI

FPDF + FPDI でPDF帳票を作成
PHP tools PDF関連情報

以上、作者の方々、いろいろな情報を公開されている皆様には大変感謝致します。ありがとうございます。

Webプログラミング関連記事