3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】PDFダウンロードする方法

Last updated at Posted at 2021-07-14

はじめに

給与明細や請求書として詳細をPDFダウンロードを実装したかったのですが、
あるパッケージを使用したらとても簡単に実装できました。

あと細かい日本語対応なども対応してます。

※追記
画像表示も手こずりましたのでその方法です↓
Laravel-dompdfパッケージで画像表示する方法

環境

実装した環境は以下です。

$ php artisan --version

Laravel Framework 8.39.0

PDFダウンロード機能実装

Laravel-dompdfパッケージのインストール

このパッケージはbladeファイルの見た目のままPDFにしてくれます!

サーバー上で以下のコマンド

$ composer require barryvdh/laravel-dompdf

インストール完了後、Laravelインストールディレクトリの
config\app.phpにサービスプロバイダーとエイリアスを登録します。


 'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        
        (中略)

       // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
        App\Providers\DataBaseQueryServiceProvider::class,
        Barryvdh\DomPDF\ServiceProvider::class, //この行を追加
    ],


     'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Arr' => Illuminate\Support\Arr::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,

        (中略)

        'PermissionCheck' => App\Commons\PermissionCheck::class,
        'ScreenName' => App\Commons\ScreenName::class,
        'PDF' => Barryvdh\DomPDF\Facade::class, //この行を追加
    ],
    
];

PDF作成

次にコントローラーへ記述していきますが、今回は
ページは変わらず(新たなページは表示させず)ダウンロードだけ実行したいのでAPIで実装。


<?php
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use PDF;

public function getSalaryDetailPdf(Request $request)
{

  (中略)

  $pdf = PDF::loadView('[bladeファイル名]', compact('[変数]'))
                        ->setPaper('a4')->setWarnings(false);
      return $pdf->download('[ダウンロードファイル名]');
}

上記の様に記述。

loadView()でbladeファイルと変数を指定します。

setPaper()で大きさを指定(基本は縦)
setWarnings()でエラーを出すか否か指定。(たぶん)

ちなみに以下のようにするとダウンロードせず、ブラウザ上で確認できる。

return $pdf->stream();

横向きにする場合

setPaper()の第二引数にlandscapeと指定する。

$pdf = PDF::loadView()->setPaper('a4', 'landscape');

日本語化への対応

このままでは日本語がすべて文字化けするのでそれに対応します。

storageディレクトリにfontsディレクトリ作成

$ mkdir fonts

fontsディレクトリ以下の権限を変更

$ chmod -R 777 fonts/

以下からIPAフォントのダウンロード
https://moji.or.jp/ipafont/ipa00303/

4書体セットものをダウンロード。
解凍し中身をfontsディレクトリへコピー。

次にbladeファイルへ@font-faceを使って使用するフォントの設定


<style>
@font-face{
    font-family: ipag;
    font-style: normal;
    font-weight: normal;
    src:url('{{ storage_path("fonts/ipag.ttf")}}');
  }
@font-face{
    font-family: ipag;
    font-style: bold;
    font-weight: bold;
    src:url('{{ storage_path("fonts/ipag.ttf")}}');
}
</style>

これで正常に日本語が表示されます。
font-weightがboldにするときはfont-faceも複数設定する必要。

※ディレクトリ権限を変更しないとうまく表示されません。

PDFファイルサイズ削減

そのままだとサイズが大きくなる。
日本語のフォントがすべてPDFにも埋め込まれているみたいです。

下記コマンドでconfigディレクトリの中にdompdfの設定ファイルdompdf.phpを作成。

$ php artisan vendor:publish --

provider="Barryvdh\DomPDF\ServiceProvider"
・
・
Publishing complete.

config/dompdf.phpを開き以下のようにします。

* Whether to enable font subsetting or not.
*/
"enable_font_subsetting" => true, //falseからtrueへ変更

これでファイルサイズが小さくなる。

以上でPDFダウンロードの設定完了です。

最初はすごい難しく考えましたが、
こんな簡単にできるのはすごい!

以下の記事をほとんど参考にさせていただきました(^^)
違う環境でもできたということで!

参考:https://reffect.co.jp/laravel/how_to_create_pdf_in_laravel

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?