HTML2PDF - загрузка и отображение файла PDF на странице

Я использую HTML2PDF с Laravel 5.1. У меня проблема с отображением файла pdf на странице и его загрузкой на сервер.

Когда я использую этот код, он без проблем показывает файл PDF:

$pdf = $html2pdf->Output('', 'S'); 
return response($pdf)
    ->header('Content-Type', 'application/pdf')
    ->header('Content-Length', strlen($pdf))
    ->header('Content-Disposition', 'inline; filename="sample.pdf"');

Однако приведенный выше код не сохраняет файл на сервере. Итак, я попробовал это:

$filename = '\Report-' . $project->id . '.pdf';
$output_path = base_path() . '\public\reports' . $filename;
$pdf = $html2pdf->Output($output_path, 'F'); 
return response($pdf)
    ->header('Content-Type', 'application/pdf')
    ->header('Content-Length', strlen($pdf))
    ->header('Content-Disposition', 'inline; filename="'.$output_path.'"');

Я пробовал это в Chrome и в Firefox, но он не отображает документ, а просто загружает файл на сервер. Что я делаю неправильно?


person CH123    schedule 10.05.2016    source источник


Ответы (3)


Вероятно, вы действительно хотите сделать это:

$filename = '\Report-' . $project->id . '.pdf';
$output_path = base_path() . '\public\reports' . $filename;
$pdf = $html2pdf->Output($output_path, 'F'); 
return response(file_get_contents($output_path))
                ->header('Content-Type', 'application/pdf')
                ->header('Content-Length', strlen($pdf))
                ->header('Content-Disposition', 'inline; filename="'.$output_path.'"');

Или, возможно:

$filename = '\Report-' . $project->id . '.pdf';
$output_path = base_path() . '\public\reports' . $filename;
$pdf = $html2pdf->Output($output_path, 'F'); 
return response($html2pdf->Output($output_path, 'S'))
                ->header('Content-Type', 'application/pdf')
                ->header('Content-Length', strlen($pdf))
                ->header('Content-Disposition', 'inline; filename="'.$filename.'"');

Я не могу сказать из документации, но я не верю, что Output с опцией «F» возвращает содержимое файла, где это делает «S». Поэтому вам просто нужно загрузить содержимое и вернуть его.

person Samsquanch    schedule 10.05.2016
comment
Chrome по-прежнему говорит Failed to load PDF document. Он не отображает файл, но сохраняет PDF-файл в указанном каталоге, как мой второй код. - person CH123; 10.05.2016
comment
Я думаю, что проблема заключалась в использовании ouput_path в имени файла вместо filename. - person Samsquanch; 10.05.2016
comment
Второй тоже не работает :( Все так же. Что вы имеете в виду под проблемой output_path?. - person CH123; 11.05.2016
comment
filename="'.$output_path.'"' будет выводить файл в браузер с именем /some/directory/pointing/to/file.pdf вместо просто file.pdf, что, как я предполагал, Chrome/FF задыхается. Вы получаете одну и ту же ошибку в обоих браузерах? - person Samsquanch; 11.05.2016
comment
Да, у меня была одна и та же ошибка в обоих браузерах. Во всяком случае, я уже разобрался. Я опубликовал свой ответ. Спасибо за вашу помощь! - person CH123; 11.05.2016

Совсем не знаком с laravel, но подумайте о том, чтобы просто запустить выведенный PDF-файл как любую URL-ссылку, поскольку современные браузеры отображают их как страницы. Ниже предполагается, что pdf сохраняется на сервере и предназначен в качестве объекта ответа:

$filename = '\Report-' . $project->id . '.pdf';
$output_path = base_path() . '\public\reports' . $filename;
$pdf = $html2pdf->Output($output_path, 'F'); 
return response($output_path)
    ->header("Location: $output_path ");
person Parfait    schedule 10.05.2016
comment
Возвращает ошибку Missing argument 2 for Illuminate\Http\Response::header() - person CH123; 11.05.2016
comment
Возможно, $output_path недопустимый путь. Что это эхо? Попробуйте использовать $filename, как в своем ответе. Кроме того, попробуйте Laravel перенаправления, попробуйте return Redirect::to($output_path) или return Redirect::to($output_path) - person Parfait; 11.05.2016

Я не знаю, лучшее ли это решение, но это работает:

$filename = 'Report-' . $project->id . '.pdf';
$output_path = base_path() . '\public\reports\\' . $filename;
$pdf = $html2pdf->Output('', 'S');
$html2pdf->Output($output_path, 'F');
return response($pdf)
   ->header('Content-Type', 'application/pdf')
   ->header('Content-Length', strlen($pdf))
   ->header('Content-Disposition', 'inline; filename="'.$filename.'"');

Я заметил, что когда $pdf = $html2pdf->Output('', 'S');, браузер отображает файл, но не загружает файл. Однако, если $pdf = $html2pdf->Output($output_path, 'F');, браузер не отображает файл, но тем не менее загружает его. Итак, я понял, что, поскольку я делаю response($pdf), я назначил $html2pdf->Output('', 'S'); на $pdf. И так как мне нужно скачать файл, я просто сделал $html2pdf->Output($output_path, 'F');, не назначая это на $pdf.

Надеюсь, я объяснил это правильно. Я не знаю, есть ли в этом какие-то лазейки или это не очень хорошая практика, но я собираюсь придерживаться этого на некоторое время, так как я еще не нашел другого способа, чтобы это работало.

Спасибо всем, кто ответил.

person CH123    schedule 11.05.2016
comment
Для будущих читателей всегда полезно объяснить, что вы сделали по-другому, так как код выглядит совершенно одинаково. Я вижу просто замену $output_path на $filename? - person Parfait; 11.05.2016
comment
Спасибо. Я добавил объяснение. Надеюсь, это имеет смысл. - person CH123; 11.05.2016