Codeigniter4中Dompdf生成PDF在移动端Chrome下载后乱码问题求助
该问题是移动端Chrome对HTTP响应头的MIME类型校验更严格,dompdf默认输出的响应头不满足其识别规则,导致浏览器将PDF文件误判为HTML格式,自动追加.html后缀,打开时直接显示PDF原始二进制内容。
修复方案
- 优先使用CodeIgniter 4原生的响应类设置规范的PDF下载响应头,避免依赖dompdf默认的头输出
- 修正setPaper方法的拼写错误(原代码中的
potrait应为portrait) - 改用手动输出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
相关产品推荐
相关产品推荐

