LoginSignup
9

More than 1 year has 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');
  }
}

参考サイト

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
What you can do with signing up
9