$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$dompdf->stream();
但是我这里前端使用了ajax传递数据,因此我要生成pdf文件,返回url给前端。
$output = $dompdf->output();
$path = 'test.pdf';
file_put_contents($path, $output);
$response = new AjaxResponse();
$response->setData(['url' => $path]);
$response->send();
踩坑:
1、因为该文件只是导出是使用,而且每次数据可能会变化,所以这里保存文件的时候就保存到了临时文件。但是临时文件不能通过外部网络访问,所以我给了前端url,也无法导出文件。
解决方法:1、将文件保存到非临时文件,然后加一个定时任务定期清理
2、参考更(3)新后的代码。
2、一开始我以为临时文件目录是保存在项目内的,但是大佬说临时目录是系统目录,不是项目目录。我以为在电脑上,正常情况是的,但是我实在docker下开发的,所以临时目录并不在电脑的临时目录,而是docker的容器目录下的临时目录。
3、更改后的代码:
我是在docker下drupal开发的。可能某些函数或类有环境限制。
$dompdf = new Dompdf();
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$output = $dompdf->output();
$filename = 'graphs_' . date('YmdHis') . '.pdf';
$path = 'temporary://' . $filename;
file_save_data($output, $path);
$headers = [
'Content-type' => 'application/pdf',
'Content-Disposition' => 'attachment;filename="' . $filename . '"'
];
return new BinaryFileResponse($path, 200, $headers, TRUE);
PS:我发现使用 $dompdf->stream(); 和 BinaryFileResponse 返回的结果是一样的二进制文件内容。不知道有啥区别。
结果证明 $dompdf->stream(); 和 BinaryFileResponse 返回的内容前端不能直接使用,所以最后将pdf文件生成和导出分开两个接口处理了。其实这个问题解决方案有很多,只是看根据项目情况取最合适的即可。