LoginSignup
5
10

More than 3 years have passed since last update.

LaravelでPDFを出力する

Last updated at Posted at 2020-10-26

概要

Laravelでpdfを扱うケースがあったので、Laravel-mpdfを導入した。
その時の手順を記載する。

dompdfとSnappyも検討したが、以下の理由により断念。

  • dompdfは使えないcssが多すぎる。
  • Snappyは必要なパッケージが多すぎてインストールが難しい。

docker環境のLaravelでSnappyを利用しようと考えましたが、パッケージが足りてなくて利用できなかった…。
本番環境でもパッケージのインストールが必要になると考えると、自分の知識では難しいと判断。

laravel-mpdfのインストール

composer require carlos-meneses/laravel-mpdf

プロバイダーとファサードの追加

config/app.phpに以下のprovidersとaliasesに以下を追加する。

'providers' => [
    // ...
    Meneses\LaravelMpdf\LaravelMpdfServiceProvider::class
]
'aliases' => [
    // ...
    'PDF' => Meneses\LaravelMpdf\Facades\LaravelMpdf::class
]

config

config/pdf.phpを作成して以下を記載する。

return [
    'mode'                 => '',
    'format'               => 'A4',
    'default_font_size'    => '12',
    'default_font'         => 'sans-serif',
    'margin_left'          => 10,
    'margin_right'         => 10,
    'margin_top'           => 10,
    'margin_bottom'        => 10,
    'margin_header'        => 0,
    'margin_footer'        => 0,
    'orientation'          => 'P',
    'title'                => 'Laravel mPDF',
    'author'               => '',
    'watermark'            => '',
    'show_watermark'       => false,
    'watermark_font'       => 'sans-serif',
    'display_mode'         => 'fullpage',
    'watermark_text_alpha' => 0.1,
    'custom_font_dir'      => '',
    'custom_font_data'     => [],
    'auto_language_detection'  => false,
    'temp_dir'               => rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR),
    'pdfa'          => false,
        'pdfaauto'      => false,
];

フォント

今のままでは日本語を扱えないのでフォントを追加して、読み込むようにする。
以下のリンクからIPAフォントをダウンロードする。

ダウンロードしたフォントをresources/fonts/ipag.ttfに配置する。
config.phpのreturn文に以下を追加する。

'custom_font_dir' => base_path('resources/fonts/'),
'custom_font_data' => [
  'ipafont' => [
    'R'  => 'ipag.ttf',
  ]
]

cssに以下を追加する。
※追加しなくても日本語表示できたので、自動判別されている?

body {
    font-family: 'ipafont', sans-serif;
}

サンプル

ビューは、resources/views/pdfs/test.blade.phpが配置されているとする。

<?php

namespace App\Http\Controllers;

use PDF;
use Illuminate\Http\Request;

class PdfsController extends Controller
{
  public function test (Request $req)
  {
    $data = [
      'name' => $req->name,
      'age' => $req->age,
    ];
    $pdf = PDF::loadView('pdfs.test', $data);

    // 表示させる場合
    // return $pdf->stream('document.pdf');

    // ダウンロードさせる場合
    return $pdf->download('test.pdf');
  }
}

参考サイト

5
10
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
5
10