LoginSignup
24
22

More than 5 years have passed since last update.

FuelPHP の fuel-pdf パッケージを利用し日本語の PDF を生成する

Last updated at Posted at 2014-12-04

まず前回までの環境を利用していますが、こちらはそれほど環境依存は無いと思います。
今回は、fuel-pdf パッケージを利用して日本語の PDF を出力するところまで試してみました。少しでも参考になれば幸いです。

※ vagrant 内でのコマンドは、全て[vagrant]として表現しています。

はじめに

環境

  • OSX 10.9.5
  • Vagrant
  • CentOS 6.5
  • FuelPHP 1.7.2
  • fuel-pdf

github

参考記事

[fuelPHP]TCPDFでPDFを出力する

※ PDF 出力部分はほとんど利用させていただきました。ありがとうございます。

利用フォント置き場

PHP+TCPDFの日本語フリーフォントを一覧比較

※ フリーフォントを利用させていただきました。ありがとうございます。

fuel-pdf パッケージの追加と設定

fuel-pdf パッケージ追加

ご自身のプロジェクト配下にある package ディレクトリへ移動し、github よりパッケージを追加します。

[vagrant]cd fuelphp/fuel/packages
[vagrant]git clone git://github.com/TJS-Technology/fuel-pdf.git pdf

pdf config ファイルの設置と設定

追加された fuelphp/fuel/packages/pdf/config/pdf.php を fuelphp/fuel/app/config 配下にコピーしてください。そしてコピーした config 内の driver を tcpdf に変更しておきます。

fuelphp/fuel/app/config/pdf.php
return array(
    'default_driver'    => 'tcpdf',
    ...
    ...

config.php の設定

例のごとく、fuelphp/fuel/packages/pdf/config/config.php ファイルの設定を追加します。

fuelphp/fuel/packages/pdf/config/config.php
'packages'  => array(
    'orm',
    'auth',
    'opauth',
    'pdf',
),

日本語フォントを準備

フォントのダウンロードと解凍

コチラ から利用したいフォントをダウンロードしてください。
自分は ystegakib というフォントで試してみました。

フォントファイルの設置

ダウンロードし解凍したフォントファイルを、fuelphp/fuel/packages/pdf/lib/tcpdf/fonts/ 配下にコピーしておいてください。

FuelPHP でコントローラ準備

下記ファイルを準備していきます。

  • Controller
    • app/classes/controller/pdf.php
app/classes/controller/pdf.php
<?php

class Controller_Pdf extends \Fuel\Core\Controller
{
    public function action_index()
    {

        // テストデータ
        $data = array(
            array(
                'hoge'  => 'fugafuga - 1',
            ),
            array(
                'hoge'  => 'fugafuga - 2',
            ),
            array(
                'hoge'  => 'fugafuga - 3',
            ),
            array(
                'hoge'  => 'fugafuga - 4',
            ),
            array(
                'hoge'  => 'fugafuga - 5',
            ),
        );

        // PDF オブジェクト準備
        $pdf = \Pdf\Pdf::forge('tcpdf')->init('P', 'mm', 'A4', true, 'UTF-8', false);

        //PDF付加情報
        $pdf->SetCreator('制作');
        $pdf->SetAuthor('作者');
        $pdf->SetTitle('タイトル');
        $pdf->SetSubject('タイトル2');

        //ヘッダーフッター情報
        $pdf->setHeaderFont(Array('ystegakib', '', 14));
        $pdf->setFooterFont(Array('ystegakib', '', 9));
        $pdf->SetHeaderData('', '','大見出し', 'サブ見出し');

        // マージンを設定する
        $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
        $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
        $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

        // 自動ページ切り替えを設定する
        $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

        // カラム幅 180
        $w = array(50, 80, 50);

        // 塗りつぶし色
        $pdf->SetFillColor(224, 235, 255);
        $pdf->SetTextColor(0, 0, 0);

        // フォントセット
        $pdf->SetFont('ystegakib', '', '12');

        // 固定長フォント設定
        $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

        // 1ページ目を準備
        $pdf->AddPage();

        $pdf->Cell($w[0], 7, '項目1', 'LRTB', 0, 'L', 1);
        $pdf->Cell($w[1], 7, '項目2', 'LRTB', 0, 'L', 1);
        $pdf->Cell($w[2], 7, '項目3', 'LRTB', 0, 'L', 1);
        $pdf->Ln();

        // テーブルコンテンツ部分
        $fill = 0;
        foreach($data as $row) {
            $pdf->Cell($w[0], 6, $row['hoge'], 'LR', 0, 'L', $fill);
            $pdf->Cell($w[1], 6, $row['hoge'], 'LR', 0, 'L', $fill);
            $pdf->Cell($w[2], 6, $row['hoge'], 'LR', 0, 'L', $fill);
            $pdf->Ln();
            $fill=!$fill;
        }

        // 区切り
        $pdf->Cell($w[0], 6, '', 'LRB', 0, 'L', $fill);
        $pdf->Cell($w[1], 6, '', 'LRB', 0, 'L', $fill);
        $pdf->Cell($w[2], 6, '', 'LRB', 0, 'L', $fill);
        $pdf->Ln();

        // トータル
        $pdf->Cell($w[0], 6, '', 'LRT', 0, 'L', 1);
        $pdf->Cell($w[1], 6, '単価', 'LRT', 0, 'R', 1);
        $pdf->Cell($w[2], 6, '***円', 'LRT', 0, 'C', 1);
        $pdf->Ln();

        // 数
        $pdf->Cell($w[0], 6, '', 'LR', 0, 'L', 1);
        $pdf->Cell($w[1], 6, '件数', 'LR', 0, 'R', 1);
        $pdf->Cell($w[2], 6, '***件', 'LR', 0, 'C', 1);
        $pdf->Ln();//改行

        // 合計
        $pdf->Cell($w[0], 6, '', 'LR', 0, 'L', 1);
        $pdf->Cell($w[1], 6, '合計', 'LR', 0, 'R', 1);
        $pdf->Cell($w[2], 6, '***円 (税抜)', 'LR', 0, 'C', 1);
        $pdf->Ln();//改行

        // 合計
        $pdf->Cell($w[0], 6, '', 'LRB', 0, 'L', 1);
        $pdf->Cell($w[1], 6, '合計', 'LRB', 0, 'R', 1);
        $pdf->Cell($w[2], 6, '***円 (税込)', 'LRB', 0, 'C', 1);

        // 出力
        $pdf->Output("output.pdf", "I");

        return ;
    }
}

以上で準備は完了です。

PDF出力

それでは、アクセスしてみましょう。
http://192.168.33.01/pdf (IPはvagrantの各自設定に従ってください。)

PDF の生成が終れば無事、ブラウザに表示されるはずです。
kobito.1417655866.122985.png

まとめ

今回は、コントローラにアクセスし、ブラウザにPDFを表示する形式でした。基本的なことはこちらで十分だと思いますので、サービスの仕様に合わせてPDFを生成し保管したり、メールで送付したりできると思います。

電子署名やデジタル署名についてはまだ調べていませんが、tcpdf や他の pdf ドライバーでそのノウハウがあれば知りたいところですね。

24
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
22