Задать вопрос
@AleDv

Как сделать генерацию pdf и отдачу на скачку на лету?

Всем привет. Есть такая задача: сгенерировать pdf-файл по кнопке, и сразу же отдать пользователю этот файл на скачивание, без сохранения файла на сервере. Если такое вообще возможно, не знаю.

Исходные: laravel 5, пакет barryvdh/laravel-dompdf для генерации pdf. Пока дошёл до такого:
$pdf = \App::make('dompdf.wrapper');
    $pdf = $pdf->loadView('pdf.offer', [ 'offer' => $offer ]);
    $filename = public_path().'/files/pdf/offers/'.str_slug($offer->title . '_' . $offer->id).'.pdf';
     $pdf->save($filename);

      return 'http://'.request()->getHost().'/files/pdf/offers/'.str_slug($offer->title . '_' . $offer->id).'.pdf';


Через ajax пердаю необходимые данные для генерации в контроллер. Контроллер генерирует пдфку, сохрянет на диск и возвращает ссылку на скачивание.

В success'e ajax-запроса я просто открываю этот файл и пользователь скачивает.
....
    success: function(data){
        window.open(data);
     }
....


Файл генерируется, пользователь скачивает - всё хорошо. Но мне эти пдфки на сервере не нужны, можно ли как-то генерировать это всё на лету? Может быть не вижу очевидного решения, глаз уже замылился.

UPD. Получилось сделать генрацию на лету, но в браузер пдф отдаётся как строка:
a4049ac11a2a4294aed916e68607d04f.PNG
  • Вопрос задан
  • 1130 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
thewind
@thewind
php программист, front / backend developer
Грузите не через ajax, а как src невидимого iframe. Или форму сабмитьте с target=Ваш iframe.
А вместо save делайте что-то вроде output, как то так
Ответ написан
Комментировать
@Barmunk
Route::post('/invoice/pdf', 'InvoiceController@getInvoice')->name('getInvoice');


<form role="form" action="{{ route('getInvoice') }}" method="post"> 
{{ csrf_field() }} 
<input type="hidden" name="invoice_id" value="{{ $item->DocID }}"> 
<button type="submit" class="btn btn-link">скачать</button> 
</form>


/** 
     * @param Request $request 
     * 
     * @return $this 
     */ 
    public function getInvoice(Request $request) 
    { 
      //валидируем
 
      //подключаем пдф
      $pdf = app('dompdf.wrapper'); 
 
     //формируем пдф вью
      $pdf->loadView('docs.invoice'); 
 
      //возвращаем на скачивание
      return $pdf->download('invoice.pdf'); 
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы