[Dompdf] LaravelでPDFを出力する

# 導入

これまでlaravelでPDFを出力する際にはlaravel-snappyを使用していました。
しかし、laravel-snappyを使うためのwkhtmltopdfのサポートが2023年に切れてしました😭😭

代替としてDompdfを使用することになったので、導入手順をまとめようと思います。

https://github.com/dompdf/dompdf

動作環境：Docker, laravel 10

# インストール
```bash
# dompdfをインストール
composer require dompdf/dompdf

# config/dompdf.phpを作成
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"
```

# 基本設定
#### １．app.phpのproviders, aliasesへそれぞれ追加
```app.php
'providers' => [
    .
    .
    .
    \Barryvdh\DomPDF\ServiceProvider::class,//追加
],

'aliases' => Facade::defaultAliases()->merge([
    .
    .
    .
    'PDF' => Barryvdh\DomPDF\Facade\Pdf::class,//追加
])->toArray(),

```

#### ２．外部サイトからフォントをダウンロード
自分はNotoSansJPを使用するので、[GoogleFonts](https://fonts.google.com/noto/specimen/Noto+Sans+JP "GoogleFonts")からzipファイルをダウンロードしてきました。
解凍後、ttfファイルをお好きなフォルダへ保存（今回はレギュラーと太字をstorage/fontsディレクトリへ）

![スクリーンショット 2024-09-03 123435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748426/082a4876-497d-34ca-1d5e-c6095bb2577f.png)


#### ３．dompdf.phpのフォントパスを変更
２で保存したフォントのディレクトリを指定します。変更した箇所のみ抜粋しています。
```dompdf.php
<?php
return array(

    'options' => array(

        # フォント置き場を指定
        "font_dir" => storage_path('fonts'),

        # フォント置き場を指定
        "font_cache" => storage_path('fonts'),

        # フォントサブセット化
        "enable_font_subsetting" => true,
    ),
);

```
設定系はここまでとなります。お疲れ様です。

# PDF出力
#### Controller
```PdfController.php
use Barryvdh\DomPDF\Facade\Pdf;
use Dompdf\Dompdf;

public function () {

 //今回は、sample.blade.phpへ出力を想定
 $PDF = Pdf::loadView('/sample');
 return $PDF->stream("サンプル.pdf");

}
```

#### View
`@font-face`で保存したフォントを指定し、bodyでフォント使います宣言をしています
```sample.blade.php
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>サンプル</title>
    <meta name="description" content="">
    <meta name="keywords" content="">
    <meta name="author" content="">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

    <style>
        @font-face {
            font-family: NotoSansJP;
            font-style: normal;
            font-weight: normal;
            src: url('{{ storage_path('fonts/NotoSansJP-Regular.ttf') }}') format('truetype');
        }
        @font-face {
            font-family: NotoSansJP;
            font-weight: bold;
            src: url('{{ storage_path('fonts/NotoSansJP-Bold.ttf') }}') format('truetype');
        }

        body {
            font-family: NotoSansJP, serif;
        }
    </style>
</head>

<body>
    <main role="main">
        <div>サンプルです。</div>
    </main>
</body>
</html>
```
Dompdfを使用して特定のフォントを使用し、PDFを出力する方法は以上となります。お疲れ様です！


# その他の機能
#### パスワードつきPDFを出力する
Dompdfなら閲覧パスワード、編集パスワードそれぞれつけることができます。凄...
```PdfController.php
use Barryvdh\DomPDF\Facade\Pdf;
use Dompdf\Dompdf;

public function () {

 //今回は、sample.blade.phpへ出力を想定
 $PDF = Pdf::loadView('/sample');

 $domPDF = $PDF->getDomPDF();
 $canvas = $domPDF->getCanvas();

 //パスワード設定
 //nullにした場合パスワードは無しとなります
 $canvas->get_cpdf()->setEncryption(
    'view_password',//閲覧パスワード
    'edit_password',//編集パスワード
    [
        'print' => true,      // 印刷を許可
        'modify' => false,    // 編集を禁止
        'copy' => true,       // テキストのコピーを許可
        'add' => false,       // ページの追加を禁止
    ]
 );
 
 return $PDF->stream("サンプル.pdf");

}
```

#### 出力スピードが遅い場合
・フォントをたくさん読み込んでいる場合は減らす
・画像を使用する場合は、pngより**jpg**を使用する（透過の必要がある場合はpngで）