FPDF的Cell函数中含重音字符导致内容对齐异常
重音字符导致FPDF单元格右对齐偏移的原因及解决办法
问题现象
执行以下FPDF代码时,带重音的Hélène无法正常右对齐,而无重音的Helene显示正常:
$pdf->Cell(65 ,3, "Helene",1, 1, 'R'); $pdf->Ln(2); $pdf->Cell(65 ,3, "Hélène",1, 1, 'R');

完整测试代码:
<?php // 引入FPDF库 require("fpdf/fpdf.php"); // 自定义PDF类 class PDF extends FPDF { function Header() { } } // 初始化PDF实例 $pdf = new PDF('L', 'mm', array(85, 54)); $HeaderVisible=1; $pdf->SetFont('Arial','',12); $pdf->SetTextColor(128, 128, 128); // 设置灰色文本 $pdf->AddPage('L'); $pdf->Cell(65 ,3, "Hélène",1, 1, 'R'); $pdf->Ln(2); $pdf->Cell(65 ,3, "Helene",1, 1, 'R'); $nom = 'test2.pdf'; exec ("rm test2.pdf"); // 设置响应头 header("Cache-Control: no-cache, no-store, must-revalidate"); header("Pragma: no-cache"); header("Expires: 0"); header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="'.$nom.'"'); $pdf->Output($nom); echo $nom; ?>
原因分析
- FPDF原生不支持UTF-8:FPDF默认采用ISO-8859-1(Latin-1)编码,而代码中使用的是UTF-8格式字符串,两者不兼容。
- 重音字符编码长度问题:UTF-8中的
é是2字节字符,但FPDF会将其当作两个独立单字节字符处理,导致字符宽度计算错误,最终右对齐偏移。 - 标准字体字符集限制:你使用的Arial是FPDF自带标准字体,仅包含ISO-8859-1字符集,无法正确解析UTF-8多字节字符的宽度。
解决办法
方法1:转换编码适配ISO-8859-1
使用utf8_decode()将UTF-8字符串转换为ISO-8859-1编码,让FPDF正确识别重音字符:
$pdf->Cell(65 ,3, utf8_decode("Hélène"),1, 1, 'R');
方法2:加载支持UTF-8的自定义字体
如果需要支持更多UTF-8字符,可通过以下步骤添加兼容字体:
- 使用FPDF自带的
makefont.php工具,将TTF格式的Arial字体转换为FPDF兼容的字体文件(生成.php和.z文件)。 - 将生成的字体文件放入FPDF的
font目录中。 - 在代码中加载并使用该字体:
之后即可直接使用UTF-8字符串,无需编码转换。$pdf->AddFont('ArialUTF8','','arial.php'); $pdf->SetFont('ArialUTF8','',12);
内容的提问来源于stack exchange,提问作者glochen G Uyirr
相关产品推荐
相关产品推荐

