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

2025年10月4日Laravel,PHP

紙谷 善照です。
TwitterYoutubeもやってます。

今回は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
icon

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>

Laravel,PHPLaravel

Posted by kami