導入
これまで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ディレクトリへ)
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で)