PHPでPDFファイルを出力する

TCPDFFPDIを利用してPHPでPDFを出力する方法の備忘録。

TCPDFのインストール

自分で配置する場合

GitHubからソースをダウンロードして、TCPDFを使用できるようにします。

  1. TCPDFのGitHubにアクセス
  2. Clone or download>Download ZIP
  3. ダウンロードしたファイルをPHPのinclude_pathに解凍し、フォルダ名をtcpdfにする
XAMPPの場合、PHPのinclude_pathは\xampp\php\php.iniに記述されています。

Laravelの場合

Laravelcomposerを使ってインストールする方法です。

  1. \{Laravelプロジェクト}\composer.jsonrequire"tecnickcom/tcpdf": "6.2.*"を追記する
"require": {
    "tecnickcom/tcpdf": "6.2.*"
},
  1. {Laravelプロジェクト}直下で以下のコマンドを実行する
composer update

PDFの出力

HTMLで記述した内容をPDFファイルとして出力します。

自分で配置した場合

require_once('tcpdf/tcpdf.php');
use TCPDF;

class PdfController extends Controller
{
    public function viewPdf() {
        $tcpdf = new TCPDF();
        $tcpdf->AddPage();

        $tcpdf->SetFont("kozgopromedium", "", 10);
$html = <<< EOF
<style>
body {
    color: #212121;
}
</style>
<h1>見出し1</h1>
<p>
pdf sample.
</p>
<p>
コンテンツ.
</p>
EOF;

        $tcpdf->writeHTML($html);
        $tcpdf->Output('sample.pdf', 'I');
    }
}

use無しの場合は、namespaceを含めたパスを指定します。

$tcpdf = new \TCPDF();

Laravel で composer を使ってインストールした場合

use TCPDF;

class PdfController extends Controller
{
    public function viewPdf() {
        $tcpdf = new TCPDF();
        $tcpdf->AddPage();

        $tcpdf->SetFont("kozgopromedium", "", 10);

$html = <<< EOF
<style>
body {
    color: #212121;
}
</style>
<h1>見出し1</h1>
<p>
pdf sample.
</p>
<p>
コンテンツ.
</p>
EOF;

        $tcpdf->writeHTML($html);
        $tcpdf->Output('sample.pdf', 'I');
    }
}

出力でOutput()の第2引数を'D'にするとPDFのダウンロードになります。

$pdf->Output('sample.pdf', 'D');

FPDIのインストール

既存のPDFをテンプレートとして使用する場合は、FPDIを利用します。

自分で配置する場合

  1. FPDIからFPDIFPDF_TPLダウンロード
  2. ダウンロードしたFPDIファイルを解凍し、srcフォルダをfpdi2にリネームする
  3. fpdiフォルダをPHPのinclude_pathに配置する
  4. ダウンロードしたFPDF_TPLファイルを解凍し、fpdf_tpl.phpをfpdi2に配置する

Laravelの場合

Laravelcomposerを使ってインストールする方法です。

  1. \{Laravelプロジェクト}\composer.jsonrequire"setasign/fpdi-fpdf": "^2.2"を追記する
"require": {
    "setasign/fpdi-fpdf": "^2.2"
},
  1. {Laravelプロジェクト}直下で以下のコマンドを実行する
composer update

PDFへの上書き

下記サンプルのtemplate.pdfは以下のようなものです。

template-pdf

自分で配置した場合

require_once('tcpdf/tcpdf.php');
require_once('fpdi2/autoload.php');

use setasign\Fpdi\TcpdfFpdi;
use TCPDF;

class PdfController extends Controller
{
    public function viewPdf() {
        $pdf = new TcpdfFpdi();

        // ヘッダーの出力.
        $pdf->setPrintHeader(false);

        // フッターの出力.
        $pdf->setPrintFooter(false);

        $pdf->addPage();

        $pdf->setSourceFile('template.pdf');

        // テンプレートの1ページ目を取得.
        $templateId = $pdf->importPage(1);
        // 取得したページ使用し、ページサイズを調整.
        $pdf->useTemplate($templateId, ['adjustPageSize' => true]);

        $pdf->SetTextColor(0, 0, 0);

        $pdf->SetFont("kozgopromedium", "", 30);

        $pdf->SetXY(60, 36);
        $pdf->Write(0, 'PDFのサンプル');

        $pdf->SetFont("kozgopromedium", "", 10);
        $pdf->SetXY(60, 66);
        $pdf->Write(0, 'pdf write sample.');

        // 出力.
        $pdf->Output('sample.pdf', 'I');
    }
}

Laravelの場合、上記template.pdfはpublicに置いたものを参照します。

Laravel で composer を使ってインストールした場合

ここではテンプレートファイルを/resources/pdfに配置しました。

use setasign\Fpdi\TcpdfFpdi;

class PdfController extends Controller
{
    public function viewPdf() {
        $pdf = new TcpdfFpdi();

        // ヘッダーの出力.
        $pdf->setPrintHeader(false);

        // フッターの出力.
        $pdf->setPrintFooter(false);

        $pdf->addPage();

        // /resources/pdf にテンプレートを置いた場合.
        $template_path = resource_path('pdf/template.pdf');
        $pdf->setSourceFile($template_path);

        // テンプレートの1ページ目を取得.
        $templateId = $pdf->importPage(1);
        // 取得したページ使用し、ページサイズを調整.
        $pdf->useTemplate($templateId, ['adjustPageSize' => true]);

        $pdf->SetTextColor(0, 0, 0);

        $pdf->SetFont("kozgopromedium", "", 30);

        $pdf->SetXY(60, 36);
        $pdf->Write(0, 'PDFのサンプル');

        $pdf->SetFont("kozgopromedium", "", 10);
        $pdf->SetXY(60, 66);
        $pdf->Write(0, 'pdf write sample.');

        // 出力.
        $pdf->Output('sample.pdf', 'I');
    }
}

実行結果

どちらの場合も実行すると以下のようなPDFが出力されます。

PHPでPDFを出力

文字列描画について

$pdf->SetXY(60, 66);
$pdf->Write(0, 'pdf write sample.');

と以下は同じ表示になります。

$pdf->Text(60, 66, 'pdf write sample.');
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

関連コンテンツ

スポンサードリンク

Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です