HTML2PDF - 下载并显示 pdf 文件到页面

HTML2PDF - Download and display pdf file to page

我在 Laravel 5.1 中使用 HTML2PDF。我在页面上显示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 中尝试过,但它不显示文档,它只是将文件下载到服务器。我做错了什么?

您可能真的想这样做:

$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' 选项 return 是 'S' 的文件内容。因此,您只需要加载内容,然后 return 加载这些内容即可。

完全不熟悉 laravel,但考虑简单地像任何 URL link 一样启动输出的 pdf,因为现代浏览器将它们呈现为页面。下面假设 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 ");

我不知道这是否是最好的解决方案,但这可行:

$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

希望我解释得当。我不知道这是否存在漏洞或这不是一个好的做法,但我会坚持一段时间,因为我还没有找到另一种方法来实现它。

感谢所有回答的人。