在WordPress中用FPDI和mPDF给现有PDF添加HTML内容失败求助
问题原因与解决方案
核心错误分析
你当前代码的根本问题是:$mpdf->Output('', 'S')返回的是完整的PDF二进制文件数据,不是可直接通过FPDI的MultiCell渲染的文本/HTML内容。把二进制PDF字符串当成普通文本添加,只会导致乱码或无内容显示。
方案一:直接用mPDF完成「导入PDF+添加HTML」(推荐)
mPDF本身支持导入现有PDF页面,不需要额外依赖FPDI,流程更简洁:
function generate_pdf_from_url_param() { // 处理GET参数及其他设置... // 初始化mPDF $mpdf = new MpdfLibrary(); $existingPdfPath = get_template_directory() . '/existing.pdf'; // 导入现有PDF的页面 $pageCount = $mpdf->setSourceFile($existingPdfPath); // 循环处理每一页 for ($page = 1; $page <= $pageCount; $page++) { // 导入当前页并添加到mPDF $tplIdx = $mpdf->importPage($page); $mpdf->AddPage(); $mpdf->useTemplate($tplIdx); // 生成要添加的HTML内容(示例) $htmlContent = '<div style="color: red; font-size: 14px;">这是添加的HTML内容</div>'; // 设置位置并写入HTML $mpdf->SetXY(30, 190); $mpdf->WriteHTML($htmlContent); } // 输出PDF $mpdf->Output('modified.pdf', 'I'); exit; } add_action('init', 'generate_pdf_from_url_param');
方案二:用FPDI结合TCPDF的HTML渲染(若需保留FPDI)
FPDI基于TCPDF/FPDF,可直接使用TCPDF的writeHTML方法渲染HTML,无需引入mPDF:
function generate_pdf_from_url_param() { // 处理GET参数及其他设置... // 初始化FPDI(注意:确保你的FPDI基于TCPDF) $fpdi = new FpdiLibrary(); $existingPdfPath = get_template_directory() . '/existing.pdf'; $pageCount = $fpdi->setSourceFile($existingPdfPath); // 循环处理每一页 for ($page = 1; $page <= $pageCount; $page++) { $tplIdx = $fpdi->importPage($page); $fpdi->AddPage(); $fpdi->useTemplate($tplIdx); // 生成HTML内容 $htmlContent = '<p style="font-weight: bold;">通过FPDI添加的HTML内容</p>'; // 设置位置并写入HTML $fpdi->SetXY(30, 190); $fpdi->writeHTML($htmlContent); } // 输出PDF $fpdi->Output('modified.pdf', 'I'); exit; } add_action('init', 'generate_pdf_from_url_param');
关键注意事项
- 确保mPDF/FPDI的库版本兼容,避免因版本差异导致的API不匹配
- 若使用自定义字体,需提前在mPDF/FPDI中注册字体,否则HTML中的特殊字体可能无法正常渲染
- 调整
SetXY的坐标时,注意PDF的坐标系(默认左下角为原点)
内容的提问来源于stack exchange,提问作者user2492580
相关产品推荐
相关产品推荐

