0
0

[Dompdf] LaravelでPDFを出力する

Posted at

導入

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

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

動作環境:Docker, laravel 10

インストール

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

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

基本設定

1.app.phpのproviders, aliasesへそれぞれ追加

app.php
'providers' => [
    .
    .
    .
    \Barryvdh\DomPDF\ServiceProvider::class,//追加
],

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

2.外部サイトからフォントをダウンロード

自分はNotoSansJPを使用するので、GoogleFontsからzipファイルをダウンロードしてきました。
解凍後、ttfファイルをお好きなフォルダへ保存(今回はレギュラーと太字をstorage/fontsディレクトリへ)

スクリーンショット 2024-09-03 123435.png

3.dompdf.phpのフォントパスを変更

2で保存したフォントのディレクトリを指定します。変更した箇所のみ抜粋しています。

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で)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0