はじめに

Laravel で PDF ファイルをブラウザで開く方法を整理した。

PDF ファイル自体は Laravel が動作するサーバ内だったり、S3 だったりに置いてある想定。

TL;DR

  • Storage::disk()->get() で PDF ファイルを取得
  • response に PDF ファイルを設定
  • headerContent-type: application/pdfContent-disposition を指定

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. 準備
    2. 前提知識
    3. PDF 表示コード
      1. ルーティング
      2. コントローラ
      3. 動作確認
  5. まとめ
  6. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
$ grep -i pretty /etc/os-release
PRETTY_NAME="Ubuntu 16.04.3 LTS"

$ php -v
PHP 7.2.22-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Sep 2 2019 12:54:12) ( NTS )

$ composer -V
Composer version 1.9.0 2019-08-02 20:55:32

$ composer info laravel/framework
name : laravel/framework
versions : * v5.7.28

確認: Chrome 79.0.3945.130(Official Build) (64 ビット)

詳細

準備

動作確認用に 表示確認用サンプル PDF を適当な場所に格納。

今回は Laravel サーバの storage/app/pdf/my_file.pdf に配置した。

前提知識

PDF ファイルをブラウザで開かせるには Content-Type: application/pdf として、レスポンスを返却すればよい。

保存時のデフォルトのファイル名を指定するには、あわせて Content-description: inline; filename="my_file.pdf" を指定する。

なお Content-description: attachment; にすると、ダウンロードが行われるようになる。

PDF 表示コード

Laravel で PDF を表示するコード

ルーティング

実運用では、添付ファイルの識別子(連番とか UUID とか)を使って、表示するファイルを切り替えることになると思うが、今回は適当。

1
Route::get('my_pdf', 'PdfController@show')->name('pdf.show');

コントローラ

  • Illuminate\Support\Facades\Storage を使って PDF ファイルを取得
  • response に PDF ファイルを指定
  • header で以下を設定
    • Content-Type: application/pdf
    • Content-description: inline; filename="my_file.pdf"
      • filename は保存時のデフォルトファイル名になる
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Storage;

class PdfController extends Controller
{
public function show()
{
$disk = 'local'; // or 's3'
$storage = Storage::disk($disk);
$file_name = 'my_file.pdf';
$pdf_path = 'pdf/' . $file_name;
$file = $storage->get($pdf_path);
return response($file, 200)
->header('Content-Type', 'application/pdf')
->header('Content-Disposition', 'inline; filename="' . $file_name . '"');
}
}
他のやり方

ローカルのファイルを表示するだけなら、response()->file() だけで良きにはからってくれるっぽい。
※S3 のファイルでもいけるのかは不明

1
2
3
4
5
6
7
8
public function show()
{
$file_path = storage_path('app/pdf/my_file.pdf');
$headers = ['Content-disposition' => 'inline; filename="hogehoge.pdf"'];
return response()->file($file_path, $headers);
// 保存ファイル名の指定が不要なら headers 指定なしで OK
// return response()->file($file_path);
}

動作確認

これで /my_pdf にアクセスすると下記のように表示されるはず。

まとめ

  • Storage::disk()->get() で PDF ファイルを取得
  • response に PDF ファイルを設定
  • headerContent-type: application/pdfContent-disposition を指定

参考文献

関連記事