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

无扩展名PDF发票无法在浏览器内联显示的技术求助

问题分析与解决方案

你的代码里藏着一个很容易踩的坑——你输出的是PDF接口的URL字符串,而不是实际的PDF二进制内容!

当你执行echo $file时,浏览器收到的只是一段文本(比如http://yourdomain.com/guest/view/generate_invoice_pdf/xxx),它根本不是PDF文件,自然会提示“failed to load PDF document”;而改成attachment时,浏览器只是把这段文本当成文件内容下载了(你可以打开下载的“PDF”看看,里面其实就是那个URL)。

正确的实现方式

你需要先从生成PDF的接口获取到真实的二进制内容,再输出给浏览器,具体代码如下:

$invoice_api_url = site_url('guest/view/generate_invoice_pdf/' . $invoice_url_key);
// 1. 获取PDF的二进制内容(这里用file_get_contents,若服务器禁用可换cURL)
$pdf_content = file_get_contents($invoice_api_url);

// 处理获取失败的情况
if ($pdf_content === false) {
    header("HTTP/1.1 500 Internal Server Error");
    echo "无法生成发票PDF";
    exit;
}

$filename = 'factuur.pdf';
// 2. 设置正确的响应头
header("Content-type: application/pdf");
header('Content-Disposition: inline; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . strlen($pdf_content)); // 关键:告诉浏览器文件大小
header('Accept-Ranges: bytes');

// 3. 清空输出缓冲(避免框架或之前的输出破坏PDF结构)
ob_clean();
flush();

// 4. 输出实际的PDF二进制内容
echo $pdf_content;
exit;

备选方案:如果file_get_contents不可用

如果你的服务器禁用了allow_url_fopen,可以用cURL来获取PDF内容:

$invoice_api_url = site_url('guest/view/generate_invoice_pdf/' . $invoice_url_key);
$ch = curl_init($invoice_api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 处理接口可能的重定向
$pdf_content = curl_exec($ch);
curl_close($ch);

// 后续的响应头设置和输出逻辑和上面一致

额外注意事项

  • 确保guest/view/generate_invoice_pdf/xxx这个接口确实返回的是纯PDF二进制数据,而不是HTML错误页或其他内容;
  • 输出PDF之前,绝对不能有任何额外输出(比如echo调试信息、PHP文件开头的空格、BOM头),否则会破坏PDF的二进制结构;
  • 如果用的是CodeIgniter这类框架,建议关闭输出缓冲或者在输出前清空缓冲,避免框架的默认输出干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:21:48