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

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

環境によって動作しない場合はあるので、動く方を試してみてください。
h4cc/wkhtmltopdf-amd64
h4cc/wkhtmltopdf-amd64
は、wkhtmltopdf
のバイナリを提供するパッケージです。wkhtmltopdf
は、HTMLをPDFに変換するオープンソースのコマンドラインツールです。
composer require h4cc/wkhtmltopdf-amd64
Linuxのamd64アーキテクチャ)向けに作られているため、macOSや他の環境では動作しない場合があります。
メモリのエラー発生時
Fatal error: Allowed memory size of 1610612736 bytes exhausted

メモリのエラーが発生した場合は以下のコマンドでメモリを一時的に無効にして実行しましょう
php -d memory_limit=-1 /usr/bin/composer require h4cc/wkhtmltopdf-amd64
wkhtmltopdf
Homebrewを使って wkhtmltopdf
をインストールするためのコマンドです。wkhtmltopdf
は、HTMLをPDFに変換するオープンソースのコマンドラインツールです。このツールをインストールすると、システム全体で利用できるようになります。
brew install wkhtmltopdf
macOS向けであるため、他の環境(LinuxやWindows)では使用できません。
Brewを使わず、Ubuntu環境であれば以下のコマンドで、wkhtmltopdfをインストールできます。
apt-get update
apt-get install wkhtmltopdf

whichコマンドでパスが取得できれば、インストール成功しています。
which wkhtmltopdf
knp-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>