【Laravel-DomPDF】ファイル名を日本語にした状態でダウンロードする

LaravelでPDF生成をするためのライブラリに、Laravel-DomPDF というものがあります。

github.com

Laravel用に改修されたDomPDFのラッパーで、簡単に導入する事ができるライブラリです。
しかし、海外環境用のライブラリですので、マルチバイトを使う場合に一手間加える必要があります。

さて、
今回は生成するLaravel-DomPDF をで日本語名のPDFファイルを作成する方法について記載します

日本語ファイルを指定する方法

Laravel-DomPDF にはdownload 関数があります。
この関数を使えばPDFダウンロードに必要なHTTPヘッダーを自動で追加した状態でレスポンスを返してくれます。
この関数には、ファイル名を指定することができますので、本来はこの関数で事足ります。

<?php

        $pdf = PDF::loadView(
            'example'
        );

        return $pdf->download('サンプル.pdf');

しかし、InternetExploaler 環境だとこのままでは文字化けします。   解決するには、ファイル名の前にエンコード名を指定する必要があります。
download関数ではHTTPヘッダーを指定する事ができません。

そのため、download関数ではなくoutput関数と自作のヘッダー情報で対応します。
blog.websandbag.com

実際にPDFを出力するまでの処理は次の通りです。

<?php

        $pdf = PDF::loadView(
            'example'
        );

        header('Content-Type: application/pdf');
        header('Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode('サンプル.pdf'));
        return $pdf->output();

iOS対策

PCブラウザであれば上記で問題ないのですが、iOSのsafariブラウザから実行するとPDFが生成されない場合があります。
ファイルを生成すると「〇〇.pdf.html」の様に、htmlファイルとして生成されてしまいます。

iOSも対策をする場合は、ライブラリで用意された関数だけでは対応できません。
そこで、レスポンスを自作します。

次のように、Laravelのレスポンス形式に則ってレスポンスする事でファイルの日本語化且つ、iOSでもダウンロードできる様になります。

<?php
use Illuminate\Http\Response;

// 省略
        $pdf = PDF::loadView(
            'example'
        );

        $output = $pdf->output();
        return new Response($output, 200, array(
            'Content-Type' => 'application/pdf',
            'Content-Disposition' =>  'attachment; filename*=UTF-8\'\'' . rawurlencode('サンプル.pdf'),
            'Content-Length' => strlen($output),
        ));


以上です。

結果的には最後の方法で実装すれば解決します。
今回は、iOSで発生した事象も紹介しようと思いこのような書き方をしました。

もし、iOSでPDFファイルがダウンロードできない問題が発生した場合はこの方法を試してみてください。

©︎2017-2018 WebSandBag