ラボ > PHP:ファイル関連

PHP PDF出力したい(TCPDF、FPDI)

PDFファイルをブラウザに出力 or ダウンロードをしたい。雛形のPDFに追記して出力・ダウンロードしたい

作成日:2022-11-11, 更新日:2022-11-11

基本

オープンソースソフトウェア(ライブラリ)を利用するのが手っ取り早い

  • 出力内容を用意してPDF出力(「TCPDF」を使う)
  • 雛形になるPDFを利用してPDF出力(「TCPDF」+「FPDI」を使う)

出力内容を用意してPDF出力(「TCPDF」を使う)

「TCPDF」ってオープンソースソフトウェア(ライブラリ)を利用すれば良いらしい

  1. github.com/tecnickcom/tcpdf」からソースをDL
  2. フォルダごとマルっとサーバに置いて「require_once('tcpdf.php')」をしてあげる
  3. プログラムする

サーバに置いたファイル

ひとまず下記。一部無くても動いたけど一応。

  • configフォルダ
  • fontsフォルダ
  • includeフォルダ
  • toolsフォルダ
  • tcpdf.php
  • tcpdf_xxx.php

サンプル

require_once('tcpdf.php');

// =====================================================
// インスタンス作成+空ページの下準備
$orientation = 'P'; // 用紙の向き。P:縦(初期値) / L:横
$unit        = 'mm'; // 測定単位。pt(ポイント) / mm(初期値) / cm / in(インチ)
$format      = 'A4'; // 用紙サイズ。初期値:A4
$unicode     = true; // ユニコードか否か
$encoding    = 'UTF-8'; // 文字セットエンコーディング。初期値:UTF-8
$diskcache   = false; // 非奨励機能。初期値:false。基本使わないのでfalseのまま
$pdfa        = false; // Aモードに設定するか? 初期値:false。基本使わないのでfalseのまま
$pdf = new TCPDF($orientation,$unit,$format,$unicode,$encoding,$diskcache,$pdfa);

// ヘッダ・フッタを出力するか?
// $pdf->setPrintHeader(false);
// $pdf->setPrintFooter(false);

// =====================================================
// 空ページの作成
$pdf->addPage();

// =====================================================
// 書体の設定
$font_family = 'kozgopromedium'; // 日本語を使うならこのまま or fontsフォルダの中にフォントがあるので何かすれば良さげ
$font_style  = 'B'; // 指定なし / U:underline / D:line-through (deleted)。打消し線 / O:overline / B:bold / I:oblique(イタリック)
$font_size   = 10;
$pdf->setFont($font_family, $font_style, $font_size);

// =====================================================
// HTMLの用意
$html = 'あめんぼ'; // styleも埋め込む必要アリ。htmlはbody内だけで良さげ。
$pdf->writeHTML($html); // HTMLをPDFに書き込み

// =====================================================
// PDF出力
$filename = 'doc_'.date('Ymd_His').'.pdf'; // 出力ファイル名
$dest     = 'I'; // 出力形式。基本「I or D」のどっちか。初期値:I。I:ブラウザ出力 / D:ブラウザでダウンロード / F:ローカルファイルとして保存 / S:文字列で出力
$pdf->Output($filename, $dest);

exit;

メモ

cssファイルを読み込んで…じゃなくstyleを指定する必要があるので面倒
単純な書式で出力なら良いけどあまり凝ったデザインは面倒な気がする。それなら専用のHTMLを用意してユーザー自身でPDF出力してもらうのが無難かな?

雛形になるPDFを利用してPDF出力(「TCPDF」+「FPDI」を使う)

PDFの雛形を用意して好きな場所に文字を追加したい → 帳票や請求書とか

「TCPDF」と「FPDI」の両方を使う感じらしい
FPDI: www.setasign.com/products/fpdi/downloads/

処理の流れ

流れ的には下記のような流れっぽい

  1. 雛形になるPDFを読込み
  2. 座標を指定して文字を記載
  3. 出力

出力したい箇所が多いと座標指定が面倒な感じ

サンプル

現状、使う予定が無いので後学のためにメモ
※「後学」って「ごがく」と読むと思ってたら「こうがく」なんだね、知らなかった

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

$pdf = new TCPDF(xxxx);

// ==============================
// 雛形を読み込んで空ページ作成
$path_tmpPDF = 'xxx.pdf';
$pdf->setSourceFile($path_tmpPDF);

$pdf->AddPage();

$tpl = $pdf->importPage(1);
$pdf->useTemplate($tpl);

// ==============================
// ▼「記載したい場所・文字を指定」を繰り返す
// $pdf->SetFont(xxx);
// $pdf->Text(x座標, y座標, テキスト);

// ==============================
ob_end_clean(); // 状況によってはエラーが出るらしく、その対策が必要らしい
$pdf->Output(xxxx);