Chrome加载PDF出现Failed to load pdf document错误问题咨询
Chrome加载PHP输出PDF提示「Failed to load pdf document」排查方案
常见错误原因
- 输出前存在多余内容:PHP代码中
<?php标签前的空格/换行、提前输出的调试信息、PHP报错内容都会混入PDF二进制流,破坏文件结构 - CURL请求异常未处理:当CURL请求超时、目标地址报错、返回非PDF内容时,直接输出错误信息会导致文件格式非法
- HTTP头设置不完整/提前发送:仅设置
Content-Type: application/pdf不够,缺少Content-Length头、或者头信息因为提前输出内容发送失败,都会导致浏览器解析失败 - 自定义输出函数破坏内容:你代码中使用的
e()如果是自定义输出函数,可能存在HTML转义、追加调试内容等逻辑,损坏PDF二进制数据
对应解决方案
第一步:优化输出逻辑,清理多余内容
在输出PDF前清空所有缓冲区内容,同时确保没有提前输出的内容,修改代码如下:
<?php // 注意<?php前不要有任何空格、换行、BOM头 $s = curl_init(); curl_setopt($s,CURLOPT_URL,$url); curl_setopt($s,CURLOPT_SSL_VERIFYPEER, false); curl_setopt($s,CURLOPT_RETURNTRANSFER,true); curl_setopt($s,CURLOPT_POSTFIELDS,http_build_query($t)); $r = curl_exec($s); $curlError = curl_errno($s) ? curl_error($s) : ''; curl_close($s); // 先校验CURL请求是否正常 if ($curlError) { die('PDF获取失败:' . $curlError); } // 校验返回内容是否为合法PDF(PDF文件开头固定为%PDF-标识) if (strpos($r, '%PDF-') !== 0) { die('上游接口返回内容不是合法PDF'); } // 清空所有之前的输出内容,避免多余字符混入 ob_end_clean(); // 完整设置HTTP头 header('Content-Type: application/pdf'); header('Content-Length: ' . strlen($r)); // 如需让浏览器直接预览而不是下载,添加以下头 header('Content-Disposition: inline; filename="preview.pdf"'); // 直接输出原始PDF内容,不要使用自定义e()函数,避免内容被转义 echo $r; // 终止后续所有输出,避免多余内容追加 exit;
第二步:排查自定义输出函数逻辑
如果你需要保留e()函数,先确认该函数的实现逻辑,确保它不会对输入内容做任何转义、格式化、追加额外内容的操作,否则直接替换为原生echo即可。
第三步:验证内容合法性
如果修改后还是报错,可以将返回的PDF内容写入本地文件测试:
file_put_contents('test.pdf', $r);
如果本地打开test.pdf正常,说明输出阶段还有多余内容,可以打开浏览器F12网络面板,查看该请求的响应内容,检查开头和结尾是否有多余的空格、换行、报错信息。如果本地也打不开,说明上游$url接口返回的内容本身就有问题,需要排查上游接口逻辑。
内容的提问来源于stack exchange,提问作者yu quan john tan
相关产品推荐
相关产品推荐

