CodeIgniter4下MPDF读取带图PDF设置模板时出现HTTP异常求助
问题根因
你看到的Unknown HTTP status code:267错误是CodeIgniter异常处理机制的误判,底层实际是MPDF依赖的FPDI组件抛出的CrossReferenceException,错误码267代表FPDI无法解析源PDF的交叉引用表。带图片的PDF普遍存在资源压缩率高、PDF版本高于1.4、资源结构复杂的特性,你当前使用的SetDocTemplate方法对这类PDF的兼容性极差,因此只有无图PDF能正常处理。
解决方案
- 第一步:替换源PDF导入逻辑,弃用兼容性差的
SetDocTemplate,改用FPDI逐页导入方案,大幅提升复杂PDF的解析成功率 - 第二步:调整
SetProtection调用顺序,放在所有内容写入完成后、输出文件前执行,避免加密逻辑提前生效干扰资源导入 - 第三步:新增FPDI异常捕获逻辑,避免CodeIgniter把业务异常码误识别为HTTP状态码
- 第四步:如果仍报错,提前将源PDF转换为1.4版本、关闭压缩选项后再导入,可解决绝大多数图片资源解析问题
修正后的完整可运行代码如下:
try { // 初始化MPDF时开启FPDI兼容配置 $config = [ 'mode' => 'utf-8', 'allow_output_buffering' => true, 'useFPDF' => true ]; $this->mpdf = new \Mpdf\Mpdf($config); // 逐页导入源PDF所有内容 $pageCount = $this->mpdf->setSourceFile($source); for ($i = 1; $i <= $pageCount; $i++) { $tplIdx = $this->mpdf->importPage($i); $this->mpdf->AddPage(); $this->mpdf->useTemplate($tplIdx); } // 添加新页面写入自定义内容 $this->mpdf->AddPage(); $this->mpdf->WriteHTML(''); // 所有内容写入完成后再设置密码保护 $this->mpdf->SetProtection(['print', 'modify'], '123456', '123456'); // 输出最终文件 $outputPath = APPPATH . "../public/files/" . $fileName; $this->mpdf->Output($outputPath, 'F'); } catch (\setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException $e) { // 自定义处理PDF解析错误逻辑 return $this->response->setStatusCode(400)->setJSON(['error' => '源PDF格式不兼容,请转换为PDF 1.4版本后重试']); } catch (\Exception $e) { // 处理其他通用异常 return $this->response->setStatusCode(500)->setJSON(['error' => 'PDF处理失败:'.$e->getMessage()]); }
内容的提问来源于stack exchange,提问作者Heena Manglani
相关产品推荐
相关产品推荐

