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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:45:00