Laravel-SnappyでPDF作成(&メール添付)

こんにちは。

今回はLaravel-Snappyを用いてのPDF作成、
そこからのメール添付の方法をまとめて記載したいと思います。
大枠は後述の記事を参考にさせていただきました。

laravel-snappy

github

https://github.com/barryvdh/laravel-snappy

何ができるか

  • CSSがインラインではなく、CSSファイルとして定義できる
  • JSファイルも同様に可能
  • HTML出力、ダウンロード出力、保存、バイナリ出力等一通り手軽にサポート

導入

https://qiita.com/ats05/items/cbb2956727cad2681d1d
https://qiita.com/qwe001/items/7eb3e338fc48325be08d
を参考に導入

【変更箇所まとめ】
composer.json追加分

  "require": {
    ・・・・
    "h4cc/wkhtmltopdf-i386": "0.12.x",
    "h4cc/wkhtmltoimage-i386": "0.12.x",
    "barryvdh/laravel-snappy": "^0.4.1",
    "h4cc/wkhtmltopdf-amd64": "^0.12.4",
    "h4cc/wkhtmltoimage-amd64": "^0.12.4"
  },

app.php追加分

    'providers' => [
        ・・・
        Barryvdh\Snappy\ServiceProvider::class,
    ],
    'aliases' => [
        ・・・
        'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class,
        'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,
    ],

snappy.php

<?php
return array(
  'pdf' => array(
    'enabled' => true,
    'binary'  => base_path('vendor/bin/wkhtmltopdf-amd64'),  //これを追加
    'timeout' => false,
    'options' => array(),
    'env'     => array(),
  ),
  'image' => array(
    'enabled' => true,
    'binary'  => base_path('vendor/bin/wkhtmltoimage-amd64'), //追加
    'timeout' => false,
    'options' => array(),
    'env'     => array(),
  ),
);

呼び出し

一通りいれ終わったらいざ実装!
TestSendPdf.php

    //template内で使うパラメータ
    $params = ・・・;

    //PDF作成
    $pdf = \PDF::loadView('file.pdf_test', ['params' => $params])
      ->setOption('encoding', 'utf-8')  //文字コード
      ->setOption('user-style-sheet', public_path() . '/pdf/pdf_test.css'); //スタイルシート

    //ブラウザで表示
    return $pdf->inline('filename.pdf');

    //ダウンロード
    return $pdf->download('filename.pdf');

    //保存(上書き)
    $pdf->save('filename.pdf', true);

    //バイナリ出力
    $pdfBinary = $pdf->output();

メールに添付

今回はメール添付送信するのがゴールの為、メールを作成します。
細かいメールの設定等は割愛して、PDFを添付する部分のみ記載します。

TestSendPdfMail.php

$mailer->send($this->view, $this->data, function ($message) use ($config) {
        $message->subject($config['subject'])
          ->from($config['from'])
          ->to($config['to'])
          ->cc($config['cc'])
          ->attach($config['file_name'])  //ファイルパスを指定する場合
          ->attachData($config['file_data']);  //$pdf->output()で出したバイナリを指定する場合
      });

複数のファイルを添付する際は、attach・attachDataを複数回呼べば可能です。
以上で、Laravel-Snappyを用いたPDFの作成から、メールへの添付までの手順となります。