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’で設定を行います。

$orientationの設定は、mergeで行うとファイル全体が一括で反映されましたが、addPDFでは反映されませんでした。

$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 エラーが発生し、結合を行うことができません。回避策は不明ですので、暗号化されたファイルを結合する場合は注意が必要です。