「Webで領収書にテキストを出力するシステムをつくりたい」
「PHPでPDFにテキストを出力したい」
こんな悩みにお答えします。
この記事では、「TCPDFの設置手順」「FPDIの設置手順」「PHPファイルの書き方」を解説しています。
私も実際にこの方法を使って、「領収書テンプレートPDFにテキストを出力する」システムをつくってみました。
記事を読み終えると、領収書にテキストを出力するシステムをつくることができます。
応用次第では、さまざまなカスタマイズも可能です。
- 目次
PDFを出力する手順
以下、デモのような簡単なシステムをつくる手順を解説します。
TCPDFをダウンロード
FPDIをダウンロード
公式サイトからFPDIをダウンロードします。
「Downloads」というボタンではなく、「zip」のところをクリックしてください。
(他の圧縮形式でもかまわないと思いますが)
ダウンロードできたら解凍してください。
- FPDI とは
- FPDIは、既存のPDFドキュメントからページを読み取り、FPDF、TCPDFのテンプレートとして使用できるようにするPHPクラスのコレクションです。
PDFテンプレートを用意
出力のベースとなるテンプレートを用意します。
インターネット上から好きなテンプレートファイルをダウンロードしてもいいですし、自分でイラストレータやエクセルで作成してもいいです。
自作する場合はPDF形式で出力してください。
ひとつのフォルダにまとめる
ダウンロードしたファイルとPDFテンプレートをひとつのフォルダにまとめます。
最低限これだけあれば動きました。
解凍したフォルダ「TCPDF-master」から赤枠内のファイル、フォルダをコピペします。
選ぶのが面倒であればまるごとコピペしてもいいです。
「FPDI-2.2.2」→「src」内のすべてのファイル、フォルダをコピペします。
「tcpdf」というフォルダをつくりまとめたフォルダです。
用意したPDFファイル(receipt.pdf)、PDF出力するPHPファイル(receipt-pdf.php)、フォームをつくったHTMLファイル(index.php)、上でつくったフォルダ「tcpdf」ファルダを「lib」フォルダに入れます。
PDFファイルを出力するためのPHPを作成する
まず、PDF出力するPHPファイルのサンプルコードです。(receipt-pdf.php)
<?php
require_once('lib/tcpdf/tcpdf.php');
require_once('lib/tcpdf/fpdi/autoload.php');
$pdf = new setasign\Fpdi\Tcpdf\Fpdi();
$pdf->setPrintHeader( false );
$pdf->setSourceFile("receipt.pdf");
$pdf->AddPage();
$tpl = $pdf->importPage(1);
$pdf->useTemplate($tpl);
$number = $_POST["number"];
$name = $_POST["name"];
$price = $_POST["price"];
$proviso = $_POST["proviso"];
//$pdf->SetFont('kozminproregular', スタイル, サイズ);
//$pdf->Text(x座標, y座標, テキスト);
//No.
$pdf->SetFont('kozminproregular', '', 11);
$pdf->Text(150, 11, htmlspecialchars( $number ) );
//名前
$pdf->SetFont('kozminproregular', '', 20);
$pdf->Text(15, 35, htmlspecialchars( $name ) );
//金額
$pdf->SetFont('kozminproregular', '', 20);
$price = number_format($price) . "-";
$pdf->Text(70, 70, htmlspecialchars( $price ) );
//但し書き
$pdf->SetFont('kozminproregular', '', 11);
$pdf->Text(70, 85, htmlspecialchars( $proviso ) );
//日付
$pdf->SetFont('kozminproregular', '', 11);
$today = date("Y年m月d日");
$pdf->Text(150, 21, $today);
//$pdf->Output(出力時のファイル名, 出力モード);
$pdf->Output("output.pdf", "I");
ライブラリを読み込みます。(パスは任意で変更してください。)
require_once('lib/tcpdf/tcpdf.php');
require_once('lib/tcpdf/fpdi/autoload.php');
デフォルトだとヘッダー領域が有効になって、上部に罫線ができてしまうので、これを無効にします。
テンプレートファイル読み込みより前に処理しないといけないようです。
$pdf->setPrintHeader( false );
次にPDFのテンプレートファイルを読み込みます。
$pdf->setSourceFile("receipt.pdf");
表示させたいフォントを設定します。
フォントファミリー、フォントスタイル、フォントサイズの順番です。
$pdf->SetFont('kozminproregular', '', 11);
表示させたいテキストと位置を設定します。
PDFファイルの左からの位置、PDFファイルの上からの位置、テキストの順番です。
$pdf->Text(150, 11, htmlspecialchars( $number ) );
出力モード「I」でブラウザに出力されます。
「I = ブラウザ出力」, 「D = ダウンロード」, 「F = ローカルファイルとして保存」です。
$pdf->Output("output.pdf", "I");
(2020.09.16追記)
複雑なフォームから出力する場合には、TCPDFで以下のようなエラーがでることがあります。
// エラーメッセージ TCPDF ERROR: Some data has already been output, can't send PDF file
「$pdf->Output("output.pdf", "I");」の前に「ob_end_clean();」を追加することでエラーが改善されます。
ob_end_clean();
$pdf->Output("output.pdf", "I");
情報を入力するためのフォームを作成する
簡単な入力フォームをつくります。(index.php)
<form method="post" action="receipt-pdf.php" target="_blank">
<table>
<tr>
<th>No.</th>
<td>
<input type="text" name="number" value="0001">
</td>
</tr>
<tr>
<th>名前</th>
<td>
<input type="text" name="name" value="山田太郎">
</td>
</tr>
<tr>
<th>金額</th>
<td>
<input type="text" name="price" value="50000">
</td>
</tr>
<tr>
<th>但し書き</th>
<td>
<input type="text" name="proviso" value="お品代として">
</td>
</tr>
</table>
<button type="submit">PDF</button>
</form>
参考サイト
こちらのサイトを参考にさせていただきました。
まとめ
PDFを出力する手順を紹介しました。
オプションなどたくさん設定できるので、公式サイトや参考の記事などを参考にカスタマイズしてみてください。