Secura Vita

Category: Works , PHP
Works

PHP:複数のPDFを連結させる(TCPDF・FPDI)

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作成時注意

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

ヘッダー・フッターの非表示。
これを書かないと余計なものが出力されます。

■foreach~

結合させるファイル分繰り返し処理させます。

setSourceFileでそのPDFのページ数を取得。

for~でページ数分繰り返す。

addPageで空のページを作成。

useTemplateで結合させるPDFから現在のページを取得して先程作成した空のページに格納。

outputで結合したPDFを出力。

出力されるPDFサイズについて

ページを追加するaddPageですが、何も指定が無いとA4縦になります。

もとのPDFがB5だったり横だったりしても新しくできるファイルはA4縦になるので、サイズは結合させるファイルに合わせて指定してください。

B5縦の場合-$pdf->addPage( ‘P’, ‘B5’ )

A4横の場合-$pdf->addPage( ‘L’, ‘A4’ )

サイズや向きについては下記サイトに詳しく書いてますのでご参考まで。

AddPage:TCPDFマニュアル(勝手訳)

ファイルごとやページごとにサイズが違う場合、都度サイズを調べなくてはならないですが今回は省略します。面倒なので…

やることって基本的に同じテンプレートで作成したファイルの連結ですよね。


おもしろかった・役に立った
▼ブログランキング参加中!クリック!▼
  • ブログランキング・にほんブログ村へ

Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ソースコードを記入する場合は [code]~[/code] でくくってください。
[code]
echo "Hello World";
[/code]

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください