You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中POST请求调用Dompdf返回乱码而非PDF文件问题

解决Ajax请求dompdf返回PDF原始数据而非可下载文件的问题

我太懂你这种糟心的情况了——本来想通过Ajax触发PDF下载,结果返回一堆看起来像乱码的%PDF-1.3开头的内容,完全不是预期的下载弹窗。其实问题出在Ajax请求本身不会自动处理二进制文件的下载逻辑,浏览器默认把响应当成普通文本解析了,所以才显示了PDF的原始二进制代码。

下面给你一步步解决的办法:

第一步:修改前端fetch请求,处理二进制响应

你需要告诉fetch我们要接收的是二进制Blob数据,然后手动触发浏览器的下载行为:

fetch('/exportPDF',{
 method: 'POST',
 cache: 'no-cache',
 credentials: 'same-origin',
 headers: {
 'Content-type': 'application/json',
 "X-CSRF-TOKEN": token
 },
 referrerPolicy: 'no-referrer',
 body: JSON.stringify({ record: appendTotalRecord })
})
.then(response => {
  // 先检查请求是否成功
  if (!response.ok) {
    throw new Error('请求失败');
  }
  // 将响应转换为Blob对象(二进制数据)
  return response.blob();
})
.then(blob => {
  // 创建临时URL指向Blob数据
  const downloadUrl = window.URL.createObjectURL(blob);
  // 创建隐藏的a标签来触发下载
  const link = document.createElement('a');
  link.href = downloadUrl;
  // 设置下载的文件名,可根据需求修改
  link.download = 'candidates_export.pdf';
  // 把a标签加到页面上并触发点击
  document.body.appendChild(link);
  link.click();
  // 清理临时资源,避免内存泄漏
  window.URL.revokeObjectURL(downloadUrl);
  document.body.removeChild(link);
})
.catch(err => {
  console.error('PDF下载失败:', err);
});

第二步:确保后端响应头正确(可选但推荐)

虽然dompdf的download()方法应该已经设置了正确的响应头,但如果还是有问题,可以手动在控制器里指定响应头,确保浏览器能正确识别这是一个可下载的PDF文件:

public function exportCandidates(Request $request){
  // ... 你的数据查询和PDF生成逻辑保持不变 ...
  
  $html = \View::make("pdf")->with('response', $response_array);
  $pdf = PDF::LoadHTML($html);
  $pdfContent = $pdf->output();

  // 手动设置响应头并返回
  return response($pdfContent, 200)
      ->header('Content-Type', 'application/pdf')
      ->header('Content-Disposition', 'attachment; filename="candidates_export.pdf"');
}

为什么这样能解决问题?

  • 前端通过response.blob()把返回的二进制PDF数据转换成Blob对象,这是浏览器能识别的二进制文件类型。
  • 通过创建临时URL和a标签,利用download属性触发浏览器的下载机制,让浏览器把Blob数据当成文件来处理,而不是解析成文本显示。

内容的提问来源于stack exchange,提问作者Hassan Malik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:32:47