PHPでPDFファイルを出力する
TCPDFとFPDIを利用してPHPでPDFを出力する方法の備忘録。
TCPDFのインストール
自分で配置する場合
GitHubからソースをダウンロードして、TCPDFを使用できるようにします。
- TCPDFのGitHubにアクセス
- Clone or download>Download ZIP
- ダウンロードしたファイルをPHPのinclude_pathに解凍し、フォルダ名をtcpdfにする
XAMPPの場合、PHPのinclude_pathは\xampp\php\php.iniに記述されています。
Laravelの場合
Laravelでcomposerを使ってインストールする方法です。
\{Laravelプロジェクト}\composer.json
のrequire
に"tecnickcom/tcpdf": "6.2.*"
を追記する
"require": {
"tecnickcom/tcpdf": "6.2.*"
},
{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のダウンロードになります。
$tcpdf->Output('sample.pdf', 'D');
FPDIのインストール
既存のPDFをテンプレートとして使用する場合は、FPDIを利用します。
自分で配置する場合
- FPDIからFPDIとFPDF_TPLダウンロード
- ダウンロードしたFPDIファイルを解凍し、srcフォルダをfpdi2にリネームする
- fpdiフォルダをPHPのinclude_pathに配置する
- ダウンロードしたFPDF_TPLファイルを解凍し、
fpdf_tpl.php
をfpdi2に配置する
Laravelの場合
Laravelでcomposerを使ってインストールする方法です。
\{Laravelプロジェクト}\composer.json
のrequire
に"setasign/fpdi-fpdf": "^2.2"
を追記する
"require": {
"setasign/fpdi-fpdf": "^2.2"
},
{Laravelプロジェクト}
直下で以下のコマンドを実行する
composer update
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が出力されます。
文字列描画について
次の2つは同じ表示になります。
$pdf->SetXY(60, 66);
$pdf->Write(0, 'pdf write sample.');
$pdf->Text(60, 66, 'pdf write sample.');
[…] 導入参考ページ […]