在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
相关产品推荐
相关产品推荐

