我有这个端点,它输出(在浏览器中呈现)一个 PDF 文件:
$pdf = PDF::loadView('print.property', $data, []); // DOMPDF
$filename = 'test.pdf';
if($show) {
return $pdf->stream( $filename );
}
return $pdf->download($filename);
,其中
$show
表示渲染,但不下载 PDF 文件。
对于桌面,一切正常并且呈现 PDF 文件,但是当我使用移动模拟器 Chrome Dev Tools 进行设置时,服务器没有响应,只是停留在加载模式。
我试过退出,没有带标题的返回:
header("Content-Type: application/octet-stream");
header("Content-Disposition: inline; filename=\"$filename\"");
使用
Content-Disposition: attachment
,它会下载正确生成的文件。
我猜问题出在标题中的某个地方。
* 我正在使用LiteServer
.
这是一些从库响应头中生成的:
content-disposition: inline; filename="test.pdf"
content-type: application/pdf
我之前尝试过这个标题:
die ($pdf->stream( $filename));
header('Content-Length: 101840');
header('Content-Type: application/octet-stream');
或:
header('Content-Type: application/pdf');
或: header('Content-Disposition: inline; filename="'.$filename.'"'); 或者: header('Content-Disposition: attachment; filename="'.$filename.'"');
没有任何作用。我能得到的最接近的是在 Chrome(移动)的浏览器中将其下载或呈现为字符串。
我个人也有问题。现在,我使用“https://github.com/barryvdh/laravel-snappy”我不知道它在 v6 laravel 上是否有效。
我还将此答案添加到另一个问题Preview pdf 而不是使用 Barryvdh\DomPDF\Facade 下载。
因为它对我有用,我尝试了 6 次以上才弄明白,最后我想出了这个解决方案
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Storage;
use Barryvdh\DomPDF\Facade\Pdf;
public function PDFDownload($view, $data = [], $fileName = 'File.pdf', $paperSize = 'A4', $orientation = 'potrait') {
$pdf = PDF::loadView($view, $data)->setPaper($paperSize, $orientation)->setWarnings(false);
$filePath = storage_path('app/temp/'.$fileName);
// Save the PDF to a temporary file on the server
Storage::put('temp/'.$fileName, $pdf->output());
$headers = [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="'.$fileName.'"',
];
// Get the PDF content as a string
$content = file_get_contents($filePath);
// Delete the temporary file
Storage::delete('temp/'.$fileName);
// Return the response with the PDF content and headers
return response($content, 200, $headers);
}
移动设备也应该能够使用此代码。但是,在某些情况下,移动设备的安全设置会禁止从浏览器下载文件。