はじめに
給与明細や請求書として詳細をPDFダウンロードを実装したかったのですが、
あるパッケージを使用したらとても簡単に実装できました。
あと細かい日本語対応なども対応してます。
※追記
画像表示も手こずりましたのでその方法です↓
Laravel-dompdfパッケージで画像表示する方法
環境
実装した環境は以下です。
$ php artisan --version
Laravel Framework 8.39.0
PDFダウンロード機能実装
Laravel-dompdfパッケージのインストール
このパッケージはbladeファイルの見た目のままPDFにしてくれます!
サーバー上で以下のコマンド
$ composer require barryvdh/laravel-dompdf
インストール完了後、Laravelインストールディレクトリの
config\app.phpにサービスプロバイダーとエイリアスを登録します。
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
(中略)
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\DataBaseQueryServiceProvider::class,
Barryvdh\DomPDF\ServiceProvider::class, //この行を追加
],
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Arr' => Illuminate\Support\Arr::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
(中略)
'PermissionCheck' => App\Commons\PermissionCheck::class,
'ScreenName' => App\Commons\ScreenName::class,
'PDF' => Barryvdh\DomPDF\Facade::class, //この行を追加
],
];
PDF作成
次にコントローラーへ記述していきますが、今回は
ページは変わらず(新たなページは表示させず)ダウンロードだけ実行したいのでAPIで実装。
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use PDF;
public function getSalaryDetailPdf(Request $request)
{
(中略)
$pdf = PDF::loadView('[bladeファイル名]', compact('[変数]'))
->setPaper('a4')->setWarnings(false);
return $pdf->download('[ダウンロードファイル名]');
}
上記の様に記述。
loadView()
でbladeファイルと変数を指定します。
setPaper()
で大きさを指定(基本は縦)
setWarnings()
でエラーを出すか否か指定。(たぶん)
ちなみに以下のようにするとダウンロードせず、ブラウザ上で確認できる。
return $pdf->stream();
横向きにする場合
setPaper()
の第二引数にlandscape
と指定する。
$pdf = PDF::loadView()->setPaper('a4', 'landscape');
日本語化への対応
このままでは日本語がすべて文字化けするのでそれに対応します。
storageディレクトリにfontsディレクトリ作成
$ mkdir fonts
fontsディレクトリ以下の権限を変更
$ chmod -R 777 fonts/
以下からIPAフォントのダウンロード
https://moji.or.jp/ipafont/ipa00303/
4書体セットものをダウンロード。
解凍し中身をfontsディレクトリへコピー。
次にbladeファイルへ@font-face
を使って使用するフォントの設定
<style>
@font-face{
font-family: ipag;
font-style: normal;
font-weight: normal;
src:url('{{ storage_path("fonts/ipag.ttf")}}');
}
@font-face{
font-family: ipag;
font-style: bold;
font-weight: bold;
src:url('{{ storage_path("fonts/ipag.ttf")}}');
}
</style>
これで正常に日本語が表示されます。
font-weightがboldにするときはfont-faceも複数設定する必要。
※ディレクトリ権限を変更しないとうまく表示されません。
PDFファイルサイズ削減
そのままだとサイズが大きくなる。
日本語のフォントがすべてPDFにも埋め込まれているみたいです。
下記コマンドでconfigディレクトリの中にdompdfの設定ファイルdompdf.phpを作成。
$ php artisan vendor:publish --
provider="Barryvdh\DomPDF\ServiceProvider"
・
・
Publishing complete.
config/dompdf.phpを開き以下のようにします。
* Whether to enable font subsetting or not.
*/
"enable_font_subsetting" => true, //falseからtrueへ変更
これでファイルサイズが小さくなる。
以上でPDFダウンロードの設定完了です。
最初はすごい難しく考えましたが、
こんな簡単にできるのはすごい!
以下の記事をほとんど参考にさせていただきました(^^)
違う環境でもできたということで!
参考:https://reffect.co.jp/laravel/how_to_create_pdf_in_laravel