AJAX请求生成FPDF字符串后返回JSON出现语法错误如何解决
问题原因
- 封装的
createProgramAndInvoicePdf方法传参'S'时未严格遵循只返回PDF字符串的逻辑,方法内部存在直接输出PDF内容的代码(例如误调用FPDF的Output('I')/Output('D')方法、多余的echo/print逻辑),导致PDF内容先被写入响应体。 - 后端输出JSON前未清理已产生的输出内容,也未终止后续多余输出,最终响应体为「PDF二进制内容 + JSON字符串」的混合格式,前端指定
dataType: "json"后解析响应时,第一个字符为PDF开头标识%,不符合JSON格式要求,直接抛出解析错误。
解决方法
- 优先排查FPDF封装方法逻辑:确认传参'S'时仅将PDF内容作为返回值返回,移除所有直接输出内容的逻辑,FPDF原生
Output('S')方法本身不会产生直接输出,重点检查封装层的多余输出代码。 - 输出JSON前添加缓冲区清理与响应头设置,修改返回代码如下:
// 清空之前所有输出内容 ob_clean(); // 声明JSON格式响应头 header('Content-Type: application/json; charset=utf-8'); $data[] = [ STATUS => $checkAll, CHECK_FIRSTNAME => $checkFirstname, CHECK_LASTNAME => $checkLastname, ]; echo json_encode($data); // 终止后续所有输出 exit;
- 若业务需要同时返回PDF文件,可将PDF字符串转base64编码后放入JSON字段中返回,示例如下:
ob_clean(); header('Content-Type: application/json; charset=utf-8'); $data[] = [ STATUS => $checkAll, CHECK_FIRSTNAME => $checkFirstname, CHECK_LASTNAME => $checkLastname, 'invoice_pdf' => base64_encode($invoice) ]; echo json_encode($data); exit;
前端拿到返回值后可直接使用base64内容完成PDF预览、下载等操作。
内容的提问来源于stack exchange,提问作者m.Sarto
相关产品推荐
相关产品推荐

