Laravel生成PDF后前端下载显示空白问题求助
解决PDF下载后空白但页数正确的问题
先按优先级排查:
第一步:确认服务器上的原始PDF文件是否正常
登录服务器找到public/${fileName}.pdf文件,手动打开验证内容:
- 如果文件本身空白:问题出在docx转PDF环节,跳转到「情况二」处理。
- 如果文件正常:问题出在后端返回/前端下载环节,跳转到「情况一」处理。
情况一:服务器PDF正常,前端下载后空白
1. 修正后端响应头配置
response()->file()自动识别MIME类型偶尔会出错,手动指定PDF专属响应头:
$pdfPath = public_path($fileName . '.pdf'); return response()->file($pdfPath, [ 'Content-Type' => 'application/pdf', 'Content-Disposition' => 'attachment; filename="' . $fileName . '.pdf"' ]);
2. 修正前端Axios请求与Blob处理
- 把
Accept头改为application/pdf(后端返回的是文件而非JSON) - 创建Blob时必须指定
application/pdf类型,避免浏览器解析错误
修改后的前端代码:
export const generateDocx = (offerData) => async () => { await axios({ method: 'post', url: `${process.env.REACT_APP_API_URL2}offer/generate/docx`, headers: { 'Content-Type': 'application/json', Accept: 'application/pdf', // 修正Accept头 }, responseType: 'arraybuffer', // 此配置保留正确 data: offerData, }).then((res) => { // 指定Blob的MIME类型 const blob = new Blob([res.data], { type: 'application/pdf' }); const url = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.setAttribute('download', `${fileName}.pdf`); // 建议与后端文件名保持一致 document.body.appendChild(link); link.click(); link.parentNode.removeChild(link); window.URL.revokeObjectURL(url); // 释放URL对象,避免内存泄漏 }); };
情况二:服务器上的PDF文件本身空白
1. 验证生成的docx文件
先打开服务器上的${fileName}.docx,确认内容存在且格式正常。如果docx本身空白,优先解决docx生成逻辑问题。
2. 检查docx转PDF的转换引擎
如果使用phpdocx这类库,确保转换引擎配置正确:
- 以LibreOffice为例,需先在服务器安装LibreOffice,再在代码中指定路径:
$docx->setConverter('libreoffice', '/usr/bin/libreoffice'); // 替换为你的LibreOffice实际路径 $docx->transformDocument($fileName . '.docx', $fileName . '.pdf');
- 确认服务器已安装转换依赖(如LibreOffice、Ghostscript),且web进程有执行权限。
3. 检查文件路径与权限
确保public_path()指向的目录有写入权限,生成的PDF文件权限设置合理(如0644),保证web进程能正常读取。
内容的提问来源于stack exchange,提问作者Elodie Muller
相关产品推荐
相关产品推荐

