PHP 8.0+MPDF生成证书时,如何通过坐标与文本长度实现文本居中?
解决MPDF中用户名文本居中的问题
你当前的问题核心是用字符数量(strlen($name))代替了文本实际宽度,不同字符(比如中英文、不同字体)的显示宽度差异极大,这种计算方式完全无法匹配真实的文本占用空间,导致居中偏移。
正确的实现方式
MPDF内置了GetStringWidth()方法,能精准计算指定文本在当前字体、字号下的实际显示宽度(单位与MPDF坐标一致,默认是毫米),用这个值来计算居中坐标才是可靠的。
修改后的完整代码:
$mpdf = new \Mpdf\Mpdf(['orientation' => 'L']); $mpdf->setSourceFile('storage/' . $certificate->url); $certificatePDf = $mpdf->importPage(1); $mpdf->useTemplate($certificatePDf, 0, 0, null, null, true); $pageSize = $mpdf->getTemplateSize($certificatePDf); // 必须先设置字体字号,再计算文本宽度(宽度与字体直接相关) $mpdf->SetFont('Sanchez-Regular', '', 40); $textWidth = $mpdf->GetStringWidth($name); // 获取文本实际显示宽度 $centerX = $pageSize['width'] / 2 - $textWidth / 2; $yPosition = 130; $mpdf->WriteText($centerX, $yPosition, $name); $mpdf->Output('newpdf.pdf');
额外注意事项
- 确保
Sanchez-Regular字体已正确注册到MPDF中,如果字体未加载,MPDF会自动使用默认字体替代,导致宽度计算错误。 - 确认页面尺寸的单位与
WriteText的坐标单位一致(MPDF默认单位为毫米,无需额外转换)。
内容的提问来源于stack exchange,提问作者Erick Sanabria
相关产品推荐
相关产品推荐

