PHPを使って複数のPDFファイルを結合する【FPDI+TCPDF】
2024年7月8日
PHPを使って自動で複数のPDFを結合したいなと思いました。
ネットで検索したところ、情報が古いのか正しいやり方が分からなかったため試行錯誤してみました。
使用するライブラリ
FPDFはPDFをテンプレート化するライブラリで、他のPDFドキュメント生成ライブラリと一緒に使用するようです。
今回はFPDF+TCPDFを使用します。
ライブラリの用意
composerを使用します。
composer require tecnickcom/tcpdf
composer require setasign/fpdi
今回はインストールされた
tcpdf v6.7
fpdi v2.6
を使用します。
PHPは8.1でした。
結合するソース
<?php
define('CURRENT_DIR', '※実行ディレクトリを設定してください');
require_once CURRENT_DIR . 'vendor/autoload.php';
use setasign\Fpdi\Tcpdf\Fpdi;
// 結合するPDF
$docs = ['test1.pdf', 'test2.pdf'];
$fpdi = new Fpdi();
// ヘッダー出力無効
$fpdi->setPrintHeader(false);
// フッター出力無効
$fpdi->setPrintFooter(false);
// PDF結合
foreach ($docs as $pdf) {
$cnt = $fpdi->setSourceFile($pdf);
for ($i = 1; $i <= $cnt; $i++) {
$tpl = $fpdi->importPage($i);
$fpdi->AddPage();
$fpdi->useTemplate($tpl, ['adjustPageSize' => true]);
}
}
// 保存する
$fpdi->Output(CURRENT_DIR . 'out.pdf', "F");
解説
使用するPDF生成ライブラリに合わせてFPDIのインスタンスを生成します。
new Fpdi()の部分です。
まず、ここが昔のやり方と違うようです。
現在は
use setasign\Fpdi\Tcpdf\Fpdi;
でライブラリに合わせたクラスを使用するように指定するようです。
後は、
PDF読み込み→1ページずつ追加→1Pをテンプレートとして指定
と順に処理していきます。
その際、ページサイズを自動で合わせる指定がないと、うまくサイズが合わない場合があります。
Outputで'F'を指定して、新たなファイルとして出力します。
まとめ
他のFPDIを使用するソースとあまり変わらない感じで結合できました。
もっと詳しく知りたい場合は公式ドキュメントをどうぞ。