実現したいこと
Laravel8を利用し、WEBアプリを作成しています。
実現したい流れとしては下記の通りです。
①クライアント側でフォームを入力する
②フォーム入力後、ダウンロードボタンを押させる。
**③ボタン押下後、サーバーに保存してあるPDFのテンプレートを使用してフォーム内容を書き込み、一度ローカルデバイスに作成したPDFをダウンロードさせる。
**→こちらが今回の質問項目です。
④デバイス上にPDFがダウンロードされたのを確認した後、改めて送信用のボタンを押させて内容をPOSTし、データをサーバーに保存する
聞きたいこと
上記③の内容を、下記のやり方で行おうと考えております。
HTML上で作成したフォームを非同期でPOSTしてPHPにフォーム内容を受け渡し、TCPDFを活用してPDF化。
その後、PDFを文字列として出力(Output($path, "S"))し、出力した文字列をJSON形式でクライアント側に受け渡します。
受け取った文字列をjavascriptでBlobの形へ変換し、自動でダウンロードを行おうと考えています。
伺いたいのは下記の点です。
- 文字列形式のPDFを受け渡すところまで成功しましたが、その文字列をjavascriptでBlobの形に変換ができません。
- タブレットでの運用を考えていますが、Ajaxリクエスト成功時に自動ダウンロードをさせることは可能でしょうか。(Safari使用)
前提
Laravel8.83.27
PHP 8.1.17
使用ブラウザ:Safari/Chrome
参考にしたサイト:https://kumatech-lab.com/tcpdf-output
(非同期でダウンロード)
エラー文
pdf_receipt_head.js:306 Uncaught TypeError: str.blob is not a function
(let blob = str.blob(); →js26行目☓)
該当のソースコード
javascript
1$("#download").click(function () { 2 var formdata = new FormData($('#form-id')[0]); 3 4 $.ajax({ 5 headers: { 6 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 7 }, //Headers 必須。呪文 8 url: "{{ route('ajaxdownload.post') }}", 9 method: 'POST', //リクエストタイプ 10 dataType: 'JSON', 11 data: form, 12 processData: false, 13 contentType: false, 14 data: formdata, 15 //リクエストが完了するまで実行される 16 beforeSend: function () { 17 document.getElementById('download_message').innerHTML = "ダウンロード中。。。"; 18 } 19 }) 20 // Ajaxリクエスト成功時の処理 21 .done(function (json) { 22 console.log(json); 23 let str = JSON.stringify(json); 24//↑ここまで成功! 25//↓ここからが分からず。。。。 26 let blob = str.blob(); 27 const url = URL.createObjectURL(blob); 28 const a = document.createElement('a'); 29 document.body.appendChild(a); 30 a.href = url; 31 32 let filename = 'sample.pdf'; 33 a.download = filename; 34 a.click(); 35 a.remove(); 36 37 console.log("ajaxでPDFのDL成功!"); 38 }) 39 // Ajaxリクエスト失敗時の処理 40 .fail(function (jqXHR, textStatus, errorThrown) { 41 alert('ダウンロードに失敗しました。本ページのスクリーンショットを保存し、送信ボタンを押してください。'); 42 console.log("ajax通信に失敗しました。Chromeコンソール画面のプレビューからエラー詳細を確認してください。"); 43 console.log("jqXHR : " + jqXHR.status); // HTTPステータスが取得 44 console.log("textStatus : " + textStatus); // タイムアウト、パースエラー 45 console.log("errorThrown : " + errorThrown.message); // 例外情報 46 document.getElementById('download_message').innerHTML = "ダウンロード失敗。スクリーンショットを撮ってください。"; 47 }) 48 // 成否にかかわらず実行 49 .always(function () { 50 $('#post_button').show(); 51 }) 52 53})
PHP
1public function ajax_download(Request $e) 2 { 3 //連想配列を作成 4 $request = [ 5 //formの中身を連想配列に変換 6 ]; 7 $pdfdata = $this->pdf_export($request); //←このfunctionの中でnew TCPDF_FONTS();し、受け取ったformの内容を座標指定してPDFを作成 8 $pdf = $pdfdata["pdf"]; 9 $path = $pdfdata["path"];//PDFの格納先のpath 10 $JSON_PDF = mb_convert_encoding($pdf->Output($path, "S"), 'UTF-8', 'UTF-8'); 11 $array = ['JSON_PDF' => $JSON_PDF]; 12 //json形式で返却 13 return response()->json($array); 14 }
補足情報(FW/ツールのバージョンなど)
知識不足な上丸投げな質問しかできず申し訳ありません。。
もしかしたら基礎的な知識が不足している場合もありますので、必要な情報が他にあればご指摘いただければ幸いです。
ご教授お願い致します!
2023.06.02
ご指摘をいただき、文章を修正いたしました。
AbeTakashi様、ご指摘ありがとうございます!

回答2件
あなたの回答
tips
プレビュー