@phantom999

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

laravel8+snappyでpdfを連続ダウンロードする方法

解決したいこと

laravel8+snappyを使っています。
帳票pdfをブラウザーで表示やダウンロードするまではできましたが、
連続でダウンロードする方法があればご教授いただきたいです。

発生している問題・エラー

ループ処理で請求データを取得し、その都度、請求書を作成し、
PDFでダウンロードしようとするが、returnを実行した時点で
請求書が1枚目だけダウンロードして終了していまいます。
returnを入れているので当然なのですが、returnではなく、
変数に格納して結合してもエラーになります。
例えば請求書が10枚あった場合、10枚のPDFを一度にダウンロードする、
或いは、1枚ずつダウンロードするなど、処理をしたいと思っています。

※10枚分の請求データを全部取得して、帳票側(blade)でまわす方法もありますが、
既存ソースの改修が膨大になるため、1件ずつ取得しダウンロードする方法が
あればと思っております。

該当するソースコード

public function print_seikyusho()
{
foreach ($datas as $data) {
$seikyu_no = $data->seikyu_no;

    // 請求データ取得
    seikyus = $this->getSeikyuDt($seikyu_no);
    
    $pdf = PDF::loadView('print.seikyusyo', compact(['seikyus']))
                ->setPaper('A4')
                ->setOption('encoding', 'utf-8');

    return $pdf->download($seikyu_no.".pdf");
}

}

// 請求データ取得
public function getSeikyuDt($seikyu_no)
{
$sql = "select * from tbl_seikyu where seikyu_no = " . $seikyu_no;
$seikyus = DB::select($sql);
return $seikyus;
}

0 likes

1Answer

HTTP 通信では 1 回の要求・応答で 1 つのファイルしかダウンロードできません。複数回要求を繰り返すか、サーバー側で複数のファイルを zip など一つのファイルにまとめてそれをダウンロードするということになります。

1Like

Comments

  1. @phantom999

    Questioner

    早速のご回答ありがとうございます。
    なるほど、複数ファイル生成後にZIPダウンロードなのですね。
    もしご存知であれば更にご教授いただきたいのですが、
    return $pdf->download($seikyu_no.".pdf");
    これですと自動的にローカルPCにダウンロードされてしまいますが、
    サーバー側に保存する記述方法はご存知でしょうか。

  2. pdf 作成用のライブラリに dompdf を使っているのではないかと想像してますが (そういうことは最初に質問に書いておきましょう)、であれば、「pdfdom save file」などをキーワードにググってみてはいかが?

    参考になりそうな記事が多々ヒットするはずです。例えば下記:

    save the pdf file in storage folder
    https://github.com/barryvdh/laravel-dompdf/issues/540

    このスレッドの質問の「pdfを連続ダウンロード」はできないということで納得したのであれば、このスレッドはクローズしてください。

    一つの疑問の解決が次の疑問を呼んで、次から次へと質問を繰り返すのは避けてください。

    次の疑問は、複数の pdf ファイルをサーバー側で保持する方法、それらを zip ファイルにまとめる方法、zip ファイルをダウンロードする方法だろうと思いますが、それらは別に新たにスレッドを立てて質問してください。

    なお、その際は、このスレッドのようなコードの表示の乱れはないようにしてくださいね。

  3. @phantom999

    Questioner

    ご指摘ありがとうございます。一問一答の形式ですね。
    ルール違反となってしまい申し訳ございません。

    ライブラリですが、タイトルには記載しましたがsnappyを使っています。
    見よう見まねでコーディングしてみたら、サーバーに保存されましたので、
    別件となりますが、記載させていただきます。
    $content = $pdf->Output($seikyu_no.".pdf");
    Storage::disk('public')->put($seikyu_no . '.pdf', $content, 'private');

    いろいろとありがとうございました。
    今後は投稿内容に気を付けます。

Your answer might help someone💌