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

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字符,可通过以下步骤添加兼容字体:

  1. 使用FPDF自带的makefont.php工具,将TTF格式的Arial字体转换为FPDF兼容的字体文件(生成.php和.z文件)。
  2. 将生成的字体文件放入FPDF的font目录中。
  3. 在代码中加载并使用该字体:
    $pdf->AddFont('ArialUTF8','','arial.php');
    $pdf->SetFont('ArialUTF8','',12);
    
    之后即可直接使用UTF-8字符串,无需编码转换。

内容的提问来源于stack exchange,提问作者glochen G Uyirr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:40:15