はじめに
今回、ご紹介するのは、PHPでPDFファイルを編集する方法です。
PHPでPDFを取り扱うことのできるフリーのライブラリTCPDF
、FPDI
を使って、
文字を書き込んで、ファイルをダウンロードしてみましょう。
簡単にご紹介。
- TCPDF:PDFを生成する
- FPDI:既存のPDFを読み込む
ただし、PDF1.5以上の場合、FPDIのフリー版では読み込むことができないのでご注意ください。
やりたいこと
下記のようなPDFのテンプレートファイルに日付と氏名を書き込んでファイルをダウンロードしたいと思います。
日付はダウンロードする日、氏名は入力フォームから入力した値を使います。
環境情報
# | 項目 | バージョン |
---|---|---|
1 | CentOS | 7.8 |
2 | Apache | 2.4.6 |
3 | PHP | 7.2.29 |
4 | TCPDF | 6.3.5 |
5 | FPDI | 2.3.3 |
事前準備
1.TCPDFのダウンロード
公式サイトからGitHubへ移動し、ZIPでダウンロードします。
ZIP解凍したら、TCPDF
というフォルダ名に変更します。
2.FPDIのダウンロード
公式サイトから、ZIPでダウンロードします。
ZIP解凍したら、フォルダ内にあるsrc
フォルダをFPDI
というフォルダ名に変更します。
3.フォルダ構成
各ZIPファイルを解凍し、下記のように配置します。
※構成やフォルダ名、ファイル名はお好きなように
src/
├ TCPDF/
│ ├ TCPDFの各ファイル
│ ├ FPDI/ ← FPDIのsrcフォルダのみ配置
│ │ ├ autoload.php
│ │ └ FPDIの各ファイル
│ ├ template.pdf ← 書き込みを行いたいPDFファイル
│ └ create.php ← このファイルに書き込み処理を実装していく
└ index.html ← 氏名入力フォーム画面
実装
index.htmlの実装
1.氏名入力フォーム
ここはPDF修正に直接関係はないので、お好きなように実装してください。
今回は、下記のように実装しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<html> <head> <title>PDFダウンロード</title> </head> <body> <form action="/TCPDF/create.php" method="post"> <p> 氏名:<input type="text" name="name"> </p> <p> <input type="submit" value="PDFダウンロード"> <input type="reset" value="リセット"> </p> </form> </body> </html> |
create.phpの実装
ここからが本番です。
FPDI
はTCPDF
を継承しているので、
FPDI
のインスタンスを生成することで、TCPDF
のメソッドを使用できます。
詳細なメソッドはこの辺を参考に。
- TCPDFの部屋
- FPDI Manual
1.FPDIクラスのインスタンスとページの設定
ファイルパスは各自の環境に合わせて修正してください。
1 2 3 4 5 6 7 8 9 |
require_once('tcpdf.php'); require_once('fpdi/autoload.php'); $pdf = new setasign\Fpdi\Tcpdf\Fpdi(); $pdf->SetMargins(0, 0, 0); //マージン無効 $pdf->SetAutoPageBreak(false); //自動改ページ無効 $pdf->setPrintHeader(false); //ヘッダー無効 $pdf->setPrintFooter(false); //フッター無効 |
2.テンプレートのPDFファイルを読み込む
読み込むとPDFのページ数が取得できるので、変数にいれておきましょう。
1 |
$page = $pdf->setSourceFile('template.pdf'); |
3.最初のページを取得し、文字を書き込む
SetXY
メソッドで文字を入力したい座標位置を設定します。
座標位置は書き込みたい位置に合わせて、調整してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//最初の1ページを取得 $pdf->AddPage('P'); //P:縦(既定なので指定しなくてもよい)/L:横 $first = $pdf->importPage(1); $pdf->useTemplate($first); //1ページ目に文字追加 $pdf->SetFont('kozminproregular', '', 10); //フォントの設定 $pdf->SetTextColor(0, 0, 0); //文字色 //日付 $pdf->SetXY(45, 50); $pdf->Write(10, date('Y年n月j日')); //氏名 $pdf->SetXY(120, 50); $pdf->Write(10, $_POST['name']);; |
フォントは、下記が使用できます。
必要な場合は自身でフォントを追加してください。
- TCPDFの日本語・標準フォント
-
- 小塚ゴシックPro M (kozgopromedium)
-
- 小塚明朝Pro M (kozminproregular)
-
- HYSMyeongJoStd-Medium (hysmyeongjostdmedium)
-
- MSungStd-Light (msungstdlight)
-
- STSongStd-Light (stsongstdlight)
-
4.2ページ目以降も取得する
ページ数分、ループしてファイル全体を取得しましょう。
1 2 3 4 5 6 |
//2ページ移行を取得 for ($i = 2; $i <= $page; $i++) { $pdf->AddPage(); $tpl = $pdf->importPage($i); $pdf->useTemplate($tpl); } |
5.作成したPDFを表示、またはダウンロードする
1 2 3 4 5 6 |
//画面に表示させる場合は、こちら $pdf->Output(''); //ダウンロードする場合は、こちら //この例だとdownload.pdfというファイル名でファイルがダウンロードされる $pdf->Output('download', 'd'); |
実際に動かしてみる
1.フォームから名前を入力してダウンロードをクリック
index.htmlにアクセスし、フォームからダウンロードボタンをクリックします。
2.画面表示にしていた場合は、下記画面が表示される
※ダウンロードを指定した場合は、Submitボタンを押したタイミングでファイルがダウンロードされます。
表示されたPDFをダウンロードしたい場合は、右上のダウンロードアイコンからダウンロードできます。
おわりに
結構簡単に書き込むことができましたね。
ただ、最初にも書いたようにPDF1.5以上だと、下記のエラーが出てテンプレートファイルが読み込めないはずです。
1 2 |
This PDF document probably uses a compression technique which is not supported by the free parser shipped with FPDI. (See https://www.setasign.com/fpdi-pdf-parser for more details) |
PDFを1.4に変換できるのであれば、変換してテンプレートとして使いましょう。
または、FPDIの有償版を使えば、1.5以上でも読み込めるようになります。
次回の記事で、有償版(トライアル)を使った方法もご紹介します。
では、また。