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

在WordPress后台使用mPDF生成PDF报错:Data has already been sent to output

解决WordPress后台使用mPDF生成PDF时的「输出已发送」错误

错误原因

你遇到的Mpdf\MpdfException是因为WordPress wp-admin后台在执行你的display_student_details函数之前,已经通过script-loader.php输出了后台的CSS、JS等内容。此时再启动输出缓冲(ob_start)已经无法拦截这些提前发送的输出,导致mPDF无法生成PDF。

修复方案

核心思路是在WordPress输出任何内容之前就启动缓冲,并拦截后台的默认输出流程,具体修改如下:

1. 调整钩子触发时机

将PDF生成函数挂载到WordPress最早的可执行钩子init上,确保在后台输出任何内容前就执行逻辑。

2. 修正输出缓冲逻辑

在函数最开头就启动并清空缓冲,确保没有残留的输出内容。

3. 添加请求区分参数

增加一个额外的参数(比如generate_pdf=1)来标记PDF生成请求,避免干扰正常的后台操作。

修改后的完整代码

// 挂载到init钩子,确保最早执行
add_action('init', 'generate_student_pdf');

function generate_student_pdf() {
    // 只在带有generate_pdf和id参数时触发
    if (!isset($_GET['generate_pdf']) || !isset($_GET['id'])) {
        return;
    }

    // 立即启动并清空输出缓冲,清除所有已发送的内容(如果有)
    ob_start();
    ob_clean();

    $student_id = intval($_GET['id']);
    global $wpdb;

    // 获取学生信息
    $student_details = $wpdb->get_row(
        $wpdb->prepare("SELECT id, firstName, secondName FROM wrbc_studentReg WHERE id = %d", $student_id),
        ARRAY_A
    );

    if (!$student_details) {
        die('未找到该学生的信息');
    }

    // 加载mPDF自动加载器
    require_once __DIR__ . '/mpdf/vendor/autoload.php';
    
    // 初始化mPDF
    $mpdf = new \Mpdf\Mpdf();

    // 添加PDF内容
    $mpdf->WriteHTML('<h1>学生详情</h1>');
    foreach ($student_details as $key => $value) {
        $mpdf->WriteHTML("<p><strong>{$key}:</strong> {$value}</p>");
    }

    // 输出PDF到浏览器
    $mpdf->Output('student_details.pdf', 'I');
    
    // 终止后续所有执行
    exit;
}

使用方法

在后台访问如下格式的URL即可生成PDF:
your-domain.com/wp-admin/?generate_pdf=1&id=学生ID

关键注意事项

  • 必须使用init钩子:这是WordPress最早能处理请求的钩子之一,此时还未输出任何后台内容。
  • 不要在后台页面的常规渲染流程中调用函数:比如在admin_menu注册的页面里调用,此时后台已经输出了头部、脚本等内容,缓冲无效。
  • 确认mPDF路径:确保__DIR__ . '/mpdf/vendor/autoload.php'指向正确的mPDF自动加载文件位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:38:11