【Laravel】PDFダウンロードの実装紹介

今回はPDFダウンロードのやり方の紹介です。
wkhtmltopdfをインストール

環境によって動作しない場合はあるので、動く方を試してみてください。
h4cc/wkhtmltopdf-amd64
h4cc/wkhtmltopdf-amd64 は、wkhtmltopdf のバイナリを提供するパッケージです。wkhtmltopdf は、HTMLをPDFに変換するオープンソースのコマンドラインツールです。
composer require h4cc/wkhtmltopdf-amd64Linuxのamd64アーキテクチャ)向けに作られているため、macOSや他の環境では動作しない場合があります。
メモリのエラー発生時
Fatal error: Allowed memory size of 1610612736 bytes exhausted
メモリのエラーが発生した場合は以下のコマンドでメモリを一時的に無効にして実行しましょう
php -d memory_limit=-1 /usr/bin/composer require h4cc/wkhtmltopdf-amd64wkhtmltopdf
Homebrewを使って wkhtmltopdf をインストールするためのコマンドです。wkhtmltopdf は、HTMLをPDFに変換するオープンソースのコマンドラインツールです。このツールをインストールすると、システム全体で利用できるようになります。
brew install wkhtmltopdfmacOS向けであるため、他の環境(LinuxやWindows)では使用できません。
Brewを使わず、Ubuntu環境であれば以下のコマンドで、wkhtmltopdfをインストールできます。
apt-get update
apt-get install wkhtmltopdf
whichコマンドでパスが取得できれば、インストール成功しています。
which wkhtmltopdfknp-snappyをインストール
knplabs/knp-snappy は、wkhtmltopdf などのツールを簡単に操作するためのラッパーライブラリです。wkhtmltopdf に対するPHPのインターフェースを提供し、HTMLからPDFや画像を生成するのを簡単にします。
composer require knplabs/knp-snappyメモリ不足の場合
php -d memory_limit=-1 /usr/bin/composer require knplabs/knp-snappyスポンサードサーチ
snappyの作成・更新
config/snappy.phpの記述をしてください。
binaryにパスを指定します。
パスの確認方法

ターミナルで叩いて帰ってきたパスを入力します
which wkhtmltopdf 'pdf' => [
'enabled' => true,
'binary' => '/usr/local/bin/wkhtmltopdf',
'timeout' => false,
'options' => [],
'env' => [],
],
'image' => [
'enabled' => true,
'binary' => '/usr/local/bin/wkhtmltopdf',
'timeout' => false,
'options' => [],
'env' => [],
],コントローラの設定
PdfControllerの作成をします。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Knp\Snappy\Pdf;
class PdfController extends Controller
{
protected $snappy;
public function __construct()
{
$this->snappy = new Pdf(config('snappy.pdf.binary')); // config/snappy.phpでbinaryを取得
}
public function downloadPdf()
{
$htmlContent = view('pdf')->render(); // ViewファイルをレンダリングしてHTMLを取得
$pdf = $this->snappy->getOutputFromHtml($htmlContent);
return response($pdf, 200)
->header('Content-Type', 'application/pdf')
->header('Content-Disposition', 'attachment; filename="document.pdf"');
}
}
HTMLをPDFに変換する
config/snappy.phpでbinaryを取得して、wkhtmltopdfを使用します。
$this->snappy = new Pdf(config('snappy.pdf.binary')); // config/snappy.phpでbinaryを取得PDFの生成を行う
HTMLコンテンツ ($htmlContent) をPDFに変換し、そのバイナリデータを返します。
$pdf = $this->snappy->getOutputFromHtml($htmlContent);ブラウザはレスポンスがPDFファイルとしての認識をさせる
header('Content-Type', 'application/pdf')>header('Content-Type', 'application/pdf') は、レスポンスヘッダーに Content-Type: application/pdf を追加します。
これにより、ブラウザはレスポンスがPDFファイルであることを認識します。
レスポンスをダウンロードとして処理を行う
レスポンスヘッダーに Content-Disposition: attachment; filename="document.pdf" を追加します。
これにより、ブラウザはレスポンスをダウンロードとして処理し、ファイル名を document.pdf として提案します。
header('Content-Disposition', 'attachment; filename="document.pdf"');スポンサードサーチ
PDFデータ
PDFのblade.phpファイルです。
今回は、静的なPDFを生成しています。
<!-- resources/views/pdf.blade.php -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PDF Document</title>
<style>
body {
font-family: 'ipaexg', sans-serif;
}
</style>
</head>
<body>
<h1>PDFタイトル</h1>
<p>これはPDFドキュメントの内容です。</p>
</body>
</html>
ルーティングの設定
ルーティングを追加して、pdfのダウンロードの処理を追加します。
use App\Http\Controllers\PdfController;
Route::get('/download-pdf', [PdfController::class, 'downloadPdf']);スポンサードサーチ
クリックでのPDFダウンロード
クリックでPDFダウンロード処理を追加する例になります。
<a href="{{ url('/pdf') }}">PDFをダウンロード</a>






