ハシウェブ

Web制作、プログラミングに関する情報を発信するブログ

アフィリエイト広告を利用しています

【TCPDF+FPDI】PHPで領収書PDFに文字を出力する方法

この記事は、最初の投稿から4年以上が経過しています。

最終更新から1311日が経過しています。

【TCPDF+FPDI】PHPで領収書PDFに文字を出力する方法

「Webで領収書にテキストを出力するシステムをつくりたい」
「PHPでPDFにテキストを出力したい」

悩み

こんな悩みにお答えします。

この記事では、「TCPDFの設置手順」「FPDIの設置手順」「PHPファイルの書き方」を解説しています。

私も実際にこの方法を使って、「領収書テンプレートPDFにテキストを出力する」システムをつくってみました。

記事を読み終えると、領収書にテキストを出力するシステムをつくることができます。
応用次第では、さまざまなカスタマイズも可能です。

目次
  1. PDFを出力する手順
    1. TCPDFをダウンロード
    2. FPDIをダウンロード
    3. PDFテンプレートを用意
    4. ひとつのフォルダにまとめる
    5. PDFファイルを出力するためのPHPを作成する
    6. 情報を入力するためのフォームを作成する
  2. 参考サイト
  3. まとめ

PDFを出力する手順

以下、デモのような簡単なシステムをつくる手順を解説します。

TCPDFとFPDIで領収書をPDFに出力するデモ

TCPDFをダウンロード

GitHubからTCPDFをダウンロードします。

GitHub TCPDF 画面

ダウンロードできたら解凍してください。

TCPDF とは
TCPDFは、簡単にPDPドキュメントが生成できるPHPライブラリです。

FPDIをダウンロード

公式サイトからFPDIをダウンロードします。

「Downloads」というボタンではなく、「zip」のところをクリックしてください。
(他の圧縮形式でもかまわないと思いますが)

FPDI 公式サイト 画面

ダウンロードできたら解凍してください。

FPDI とは
FPDIは、既存のPDFドキュメントからページを読み取り、FPDF、TCPDFのテンプレートとして使用できるようにするPHPクラスのコレクションです。

PDFテンプレートを用意

出力のベースとなるテンプレートを用意します。

インターネット上から好きなテンプレートファイルをダウンロードしてもいいですし、自分でイラストレータやエクセルで作成してもいいです。
自作する場合はPDF形式で出力してください。

ひとつのフォルダにまとめる

ダウンロードしたファイルとPDFテンプレートをひとつのフォルダにまとめます。
最低限これだけあれば動きました。

解凍したフォルダ「TCPDF-master」から赤枠内のファイル、フォルダをコピペします。
選ぶのが面倒であればまるごとコピペしてもいいです。

TCPDF

「FPDI-2.2.2」→「src」内のすべてのファイル、フォルダをコピペします。

FPDI

「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>

TCPDFとFPDIで領収書をPDFに出力するデモ

参考サイト

こちらのサイトを参考にさせていただきました。

まとめ

PDFを出力する手順を紹介しました。

オプションなどたくさん設定できるので、公式サイトや参考の記事などを参考にカスタマイズしてみてください。