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

Codeigniter4中Dompdf生成PDF在移动端Chrome下载后乱码问题求助

该问题是移动端Chrome对HTTP响应头的MIME类型校验更严格,dompdf默认输出的响应头不满足其识别规则,导致浏览器将PDF文件误判为HTML格式,自动追加.html后缀,打开时直接显示PDF原始二进制内容。

修复方案

  1. 优先使用CodeIgniter 4原生的响应类设置规范的PDF下载响应头,避免依赖dompdf默认的头输出
  2. 修正setPaper方法的拼写错误(原代码中的potrait应为portrait)
  3. 改用手动输出PDF二进制内容的方式,规避框架与dompdf的缓冲区冲突

修改后的代码如下:

public function getInvoice($id){
    $options = new Options();
    $options->set('isRemoteEnabled', true);
    $options->set('enable_css_float', false);
    $dompdf = new Dompdf($options); 

    $getTransaction = $this->BasicModel->getTransaction($id);
    $fileName = 'sebededata-invoice-'.$getTransaction->trans_ref . '.pdf';

    $dompdf->setPaper('A4', 'portrait'); // 修正拼写错误
    $dompdf->loadHtml(view('backend/templates/invoice', compact('getTransaction')));
    $dompdf->render();

    // 清空缓冲区避免多余输出
    if (ob_get_length()) {
        ob_end_clean();
    }

    // 用CI4原生响应类设置规范头
    return $this->response
        ->setHeader('Content-Type', 'application/pdf')
        ->setHeader('Content-Disposition', 'attachment; filename="'.$fileName.'"')
        ->setHeader('Cache-Control', 'private, no-store, no-cache, must-revalidate')
        ->setHeader('Pragma', 'no-cache')
        ->setHeader('Content-Length', strlen($dompdf->output()))
        ->setBody($dompdf->output());
}

异常排查点

如果以上修改后仍存在问题,可以按以下顺序排查:

  • 确认控制器方法没有其他输出,包括PHP开头/结尾标签外的空格、debug输出、异常报错信息
  • 检查站点的反向代理/CDN配置,确认没有篡改响应的Content-Type字段
  • 升级移动端Chrome到最新版本重试,部分老旧版本存在MIME类型识别bug

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:24:03