nanisore oishisou

Webエンジニアあるまさんのゆるふわ奮闘記。

LaravelでViewからExcelを作りPDFでエクスポートする方法 【手順編】

果たして私は手順を簡潔に説明できるのか.....
That is the question.


【LaravelでViewからExcelを作りPDFでエクスポートする方法】

★手順1ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
composer.jsonに以下の2行を追加して、composer update を実行します。
PHPExcelライブラリが入っていない人は、それも追加しないとダメだと思います。

"maatwebsite/excel": "1.*",
"tecnick.com/tcpdf": "~6.0.0"

★手順2ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
IPAフォントダウンロードページよりIPAゴシックというフォントをダウンロードし
ipag.ttfをvendor/tecnick.com/tcpdf/toolsのフォルダの中に入れます。

★手順3ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ターミナルでフォントを入れた階層へ移動します。

$ cd vendor/tecnick.com/tcpdf/tools


同じフォルダの中にconvert_fonts_examples.txtというマニュアルが入っているので、そちらを参考にして以下の例のようなコマンドを入力します。
※フォントを同じ階層に入れてから実行してください。

$ php ./tcpdf_addfont.php -b -t TrueTypeUnicode -f 32 -i ./ipag.ttf


★手順4ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Laravel ExcelのPDFドライバをtcPDFに変更します。

vendor/maatwebsite/excel/src/config/export.php の157行目です。

★手順5ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
views/test/にpdf_view.blade.phpを作成しViewにmetaタグを挿入します。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


★手順6ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Controllerに以下のようなコードを書きます。

例)views/test/pdf_view.blade.phpのViewをPDFに出力したい場合

$data = [
    'sampleModelObject' => $sampleModelObject
];

Excel::create('sample', function($excel) use($data)  {
  $excel->sheet('sample', function($sheet) use($data) {
        $sheet->setFontFamily('ipag');
  // PDFを横にしたい場合
        $sheet->setOrientation('landscape');
        $sheet->loadView('test.pdf_view', $data);
  });
})->export('pdf');

これでViewをExcelにしてPDFで出力できます。
最後の行を以下のようにすると、Excelファイルを保存しつつ、PDFをダウンロードさせるということができます。

})->store('xls')->export('pdf');

保存する場所はvendor/maatwebsite/excel/src/config/export.phpの130行目にあるstoreの箇所で指定します。

ということで、手順をまとめてみました!
今回はtcpdfを使っていますが、結局、dompdfでも無事にPDF出力できましたのでどちらでもよいのですが、barryvdh/laravel-dompdfを使いたい場合はdompdfで日本語フォントをインストールしてください!

その場合のコードサンプルはこちらです。

$data = [
    'sampleModelObject' => $sampleModelObject
];
$pdf = PDF::loadView('test.pdf_view', $data);
return $pdf->download('sample.pdf');

barryvdh/laravel-dompdfの場合はapp/config/app.php
providers に 'Barryvdh\DomPDF\ServiceProvider', を追記し
aliases に 'PDF' => 'Barryvdh\DomPDF\Facade', を追記するのをお忘れなく。

ではでは、長々とお付き合いくださりありがとうございましたm(_ _)m