PHPでPDFファイルを編集する

はじめに

今回、ご紹介するのは、PHPでPDFファイルを編集する方法です。
PHPでPDFを取り扱うことのできるフリーのライブラリTCPDFFPDIを使って、
文字を書き込んで、ファイルをダウンロードしてみましょう。

簡単にご紹介。

  • TCPDF:PDFを生成する
  • FPDI:既存のPDFを読み込む

ただし、PDF1.5以上の場合、FPDIのフリー版では読み込むことができないのでご注意ください。

やりたいこと

下記のようなPDFのテンプレートファイルに日付と氏名を書き込んでファイルをダウンロードしたいと思います。
日付はダウンロードする日、氏名は入力フォームから入力した値を使います。

template

環境情報

# 項目 バージョン
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のダウンロード

https://tcpdf.org/

公式サイトからGitHubへ移動し、ZIPでダウンロードします。
ZIP解凍したら、TCPDFというフォルダ名に変更します。

2.FPDIのダウンロード

https://www.setasign.com/products/fpdi/downloads/

公式サイトから、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修正に直接関係はないので、お好きなように実装してください。
今回は、下記のように実装しました。

create.phpの実装

ここからが本番です。

FPDITCPDFを継承しているので、
FPDIのインスタンスを生成することで、TCPDFのメソッドを使用できます。

詳細なメソッドはこの辺を参考に。

1.FPDIクラスのインスタンスとページの設定

ファイルパスは各自の環境に合わせて修正してください。

2.テンプレートのPDFファイルを読み込む

読み込むとPDFのページ数が取得できるので、変数にいれておきましょう。

3.最初のページを取得し、文字を書き込む

SetXYメソッドで文字を入力したい座標位置を設定します。
座標位置は書き込みたい位置に合わせて、調整してください。

フォントは、下記が使用できます。
必要な場合は自身でフォントを追加してください。

  • TCPDFの日本語・標準フォント
      1. 小塚ゴシックPro M (kozgopromedium)
      1. 小塚明朝Pro M (kozminproregular)
      1. HYSMyeongJoStd-Medium (hysmyeongjostdmedium)
      1. MSungStd-Light (msungstdlight)
      1. STSongStd-Light (stsongstdlight)

4.2ページ目以降も取得する

ページ数分、ループしてファイル全体を取得しましょう。

5.作成したPDFを表示、またはダウンロードする

実際に動かしてみる

1.フォームから名前を入力してダウンロードをクリック

index.htmlにアクセスし、フォームからダウンロードボタンをクリックします。
PDF-2

2.画面表示にしていた場合は、下記画面が表示される

※ダウンロードを指定した場合は、Submitボタンを押したタイミングでファイルがダウンロードされます。
PDF-3

表示されたPDFをダウンロードしたい場合は、右上のダウンロードアイコンからダウンロードできます。
PDF-4

おわりに

結構簡単に書き込むことができましたね。
ただ、最初にも書いたようにPDF1.5以上だと、下記のエラーが出てテンプレートファイルが読み込めないはずです。

PDFを1.4に変換できるのであれば、変換してテンプレートとして使いましょう。
または、FPDIの有償版を使えば、1.5以上でも読み込めるようになります。
次回の記事で、有償版(トライアル)を使った方法もご紹介します。

では、また。