Laravelを使ってPDFを結合する方法
Laravelで構築したシステム上に保存された複数のPDFを一括でダウンロードしたいという場合に利用することができます。PDFを結合するためにlara-pdf-mergerというパッケージを利用して行います。
目次
lara-pdf-mergerのインストールと設定
composerコマンドを利用してパッケージのインストールを行います。
$ composer require daltcore/lara-pdf-merger
config/app.phpでサービスプロバイダーの追加を行います。providersに追加を行なってください。
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
・
・
Illuminate\View\ViewServiceProvider::class,
LynX39\LaraPdfMerger\PdfMergerServiceProvider::class, //追加
次にファサードの追加も行います。config/app.phpのaliasesに追加を行なってください。
インストールと初期設定は完了です。
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
・
・
'View' => Illuminate\Support\Facades\View::class,
'PdfMerger' => LynX39\LaraPdfMerger\Facades\PdfMerger::class,//追加
],
PDFの準備と結合
結合を行いたいPDFファイルを保存する必要があります。保存フォルダは、storage/app/publicの下に保存します。
web.phpに以下を記述します。
Route::get('/', function () {
$files = Storage::files('public'); //(1)
$pdfMerger = PdfMerger::init(); //(2)
foreach($files as $file){ //(3)
$pdfMerger->addPDF(Storage::path($file));
}
$pdfMerger->merge(); //(4)
$pdfMerger->save("file_name.pdf", "download"); //(5)
});
(1)ではStorageファサードのfilesメソッドを使ってpublicフォルダの下にあるファイルの一覧を取得しています。もし、sample.pdf, sample2.pdf, sample3.pdfの3つのファイルが保存されていたら、配列[public/sample.pdf, public/sample2.pdf, public/sample3.pdf]で取得されます。
(2)PdfMergerの初期化を行なっています。
(3)foreachを使って展開し、Storage::path()メソッドを使って各ファイルのフルパスを取得しています。addPDFメソッドでpdfの追加を行なっています。
(4)追加したPDFをmergeメソッドで結合しています。
(5)ファイル名をfile_name.pdfでダウンロードを行える設定にしています。
ここでは”/”ルートにアクセスすると結合されたファイルがダウンロードできます。
各種設定
addPDFメソッドの設定
addPDFをパスのみ指定していましたが、3つの引数を設定することができます。
public function addPDF($filepath, $pages = 'all', $orientation = null)
$filepathにはファイルのパスを入れます。$pagesはデフォルではallに設定されており、すべてのページが結合されます。$orientationはページの向きを設定することができ、portrait(縦)とlandscape(横)で設定を行うことができます。’P’と’L’で設定を行います。
$pagesを設定する場合は、下記のように設定を行うことができます。
$pdfMerger->addPDF('samplepdfs/one.pdf', '1, 3, 4');
$pdfMerger->addPDF('samplepdfs/two.pdf', '1-2');
mergeメソッドの設定
mergeメソッドは引数を取らなくても実行できますが、$orientationと$metaの2つの引数をとることができます。
public function merge($orientation = null, $meta = [])
$orientationはページの向きを設定することができ、portrait(縦)とlandscape(横)で設定を行うことができます。’P’と’L’で設定を行います。
$metaはPDFのメタ情報を設定することができます。
[title => $title, author => $author, subject => $subject, keywords => $keywords, creator => $creator]
PDFの作者をJohn Doeに設定したい場合は以下のように設定を行います。
$pdfMerger->merge(null,['author' => 'John Doe']);
saveメソッドの設定
downloadに設定を行なっていますが、browser, string, fileに変更を行うことができます。
browserに設定するとブラウザ画面にそのままPDFが表示されます。
fileの場合は、ファイル名だけではなくパスまで設定を行います。設定したフォルダの中にfile_name.pdfが作成されます。
$pdfMerger->save(Storage::path(false)."file_name.pdf", "file");
暗号化ファイルの結合
パスワードで暗号化されているファイルを結合しようとすると TCPDF_PARSER ERROR: decodeFilterFlateDecode: invalid code エラーが発生し、結合を行うことができません。回避策は不明ですので、暗号化されたファイルを結合する場合は注意が必要です。