PHP:複数のPDFを連結させる(TCPDF・FPDI)
PHPでPDFを結合させるなんてめんどくさそうだなぁ、と思いつつ調べてみたらライブラリ使えば意外と簡単にできることがわかったのでやってみることに。
「納品書PDFを1つずつ印刷するのめんどくさいから選択した分まとめて印刷したい」
という要件でした。
TCPDF・FPDIライブラリ
TCPDF・FPDIそれぞれライブラリをDLします。
運用中のWEBサイトによってはライブラリがすでにある場合もありますので、あればそっち使ったほうがいいです。
ただ、バージョンが違ったりよくわからない場合はDLしたものを使ってください。
ディレクトリ構成
サンプル用のディレクトリ構成はこんな感じにします。
- pdf-batch.php – 連結したPDFを表示させるファイル
- /files – 結合させるPDFファイル(pdf1~pdf4)
- /TCPDF – TCPDFライブラリファイル
- /FPDI – FPDI
TCPDFとFPDIディレクトリにはDLしたファイルをそのまま全部上げておいてください。
不要なものもありますが面倒なので。
注意
PHPで連結させるのが目的なので、連結させたいファイルも多分サーバー側で生成されたものだと思います。
であれば多分問題ないと思うのですが、エクセル等から書き出したPDFファイルはエラーが出るかもしれません。
テストなどで使うPDFを作成する場合は以下の手順で。
その場合は「Adobe PDFとして保存」ではなくて「名前を付けて保存」を選びPDFを選択、最適化を「標準」にして保存してください。
pdf-batch.phpソース
use setasign\Fpdi; require_once( './TCPDF/tcpdf.php' ); require_once( './FPDI/src/autoload.php' ); $files = array( './files/pdf1.pdf', './files/pdf2.pdf', './files/pdf3.pdf', './files/pdf4.pdf', ); $pdf = new Fpdi\TcpdfFpdi(); $pdf->setPrintHeader( false ); $pdf->setPrintFooter( false ); foreach( $files as $file ) { $count = $pdf->setSourceFile( $file ); for ( $i = 1; $i <= $count; $i++ ) { $pdf->addPage(); $pdf->useTemplate( $pdf->importPage( $i ) ); } } $pdf->output(); exit();
説明
useでクラスのインポート
require_onceでライブラリをそれぞれ読み込み。
$filesに結合させるPDFファイルを格納。
クラス Fpdi\TcpdfFpdi
■setPrintHeader・setPrintFooterヘッダー・フッターの非表示。
これを書かないと余計なものが出力されます。
結合させるファイル分繰り返し処理させます。
setSourceFileでそのPDFのページ数を取得。
for~でページ数分繰り返す。
addPageで空のページを作成。
useTemplateで結合させるPDFから現在のページを取得して先程作成した空のページに格納。
outputで結合したPDFを出力。
出力されるPDFサイズについて
ページを追加するaddPageですが、何も指定が無いとA4縦になります。
もとのPDFがB5だったり横だったりしても新しくできるファイルはA4縦になるので、サイズは結合させるファイルに合わせて指定してください。
B5縦の場合-$pdf->addPage( ‘P’, ‘B5’ )
A4横の場合-$pdf->addPage( ‘L’, ‘A4’ )
サイズや向きについては下記サイトに詳しく書いてますのでご参考まで。
ファイルごとやページごとにサイズが違う場合、都度サイズを調べなくてはならないですが今回は省略します。面倒なので…
やることって基本的に同じテンプレートで作成したファイルの連結ですよね。