【Laravel】PDFダウンロードする方法

# はじめに
給与明細や請求書として詳細をPDFダウンロードを実装したかったのですが、
あるパッケージを使用したらとても簡単に実装できました。

あと細かい日本語対応なども対応してます。

※追記
画像表示も手こずりましたのでその方法です↓
[Laravel-dompdfパッケージで画像表示する方法](https://qiita.com/yamato1491038/items/2e510ac3c5c03d8e9de6)


### 環境

実装した環境は以下です。

```
$ php artisan --version

Laravel Framework 8.39.0
```


# PDFダウンロード機能実装

### Laravel-dompdfパッケージのインストール

**このパッケージはbladeファイルの見た目のままPDFにしてくれます！**

サーバー上で以下のコマンド

```
$ composer require barryvdh/laravel-dompdf
```

インストール完了後、Laravelインストールディレクトリの
config\app.phpにサービスプロバイダーとエイリアスを登録します。

```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

<?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()`でエラーを出すか否か指定。（たぶん）

ちなみに以下のようにするとダウンロードせず、ブラウザ上で確認できる。

```php
return $pdf->stream();
```
### 横向きにする場合

`setPaper()`の第二引数に`landscape`と指定する。

```php
$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`を使って使用するフォントの設定

```php

<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を開き以下のようにします。

```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