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

FPDI组件Cell/Text方法Y轴定位异常,文本显示错位求助

FPDF/FPDI文本垂直偏移问题解决

在给预制表格叠加用户值时,所有文本都出现错误的垂直偏移:把文本定位到(0,0)位置,只能看到一半高度;用$fpdi->Text(0,0, 'Maestro Bach Johann Sebastian')方法也有同样问题。手动将Y轴偏移量调为字体尺寸一半时,文本位置又偏低,推测是字体尺寸单位(pt)与XY位置单位(mm)不兼容导致的。

相关代码:

$fpdi->SetFont('Arial', '', 18);
$fpdi->SetTextColor(255, 0, 255);
$fpdi->SetXY(0, 0);
$fpdi->Cell(0, 0, 'Maestro Bach Johann Sebastian', 0, 0, 'L');

问题截图:
文本显示异常截图


核心原因

FPDI/FPDF中,SetXY()的坐标是基于文本基线而非文本顶部的;同时默认位置单位是mm,但字体大小用的是pt,两者没有自动做单位换算,直接导致定位偏差。

解决方法

1. 手动换算单位偏移

1pt≈0.352778mm,可根据字体大小计算出基线到文本顶部的偏移量,再调整Y坐标:

$fontSize = 18;
// 把pt单位的字体高度转成mm,作为Y轴偏移量(不同字体可微调比例)
$offsetY = $fontSize * 0.352778;
$fpdi->SetFont('Arial', '', $fontSize);
$fpdi->SetTextColor(255, 0, 255);
$fpdi->SetXY(0, $offsetY);
$fpdi->Cell(0, 0, 'Maestro Bach Johann Sebastian', 0, 0, 'L');

2. 利用字体上升值精准定位

通过GetFontAscent()获取字体的上升高度(pt单位),换算成mm后作为Y轴偏移,能更精准匹配文本顶部:

$fpdi->SetFont('Arial', '', 18);
$ascentPt = $fpdi->GetFontAscent();
$ascentMm = $ascentPt * 0.352778;
$fpdi->Text(0, $ascentMm, 'Maestro Bach Johann Sebastian');

3. 全局统一单位为pt

初始化FPDI时直接将单位设为pt,让坐标和字体大小单位统一,彻底避免换算问题:

// 第二个参数设为pt,统一单位
$fpdi = new FPDI('P', 'pt', 'A4');
$fpdi->SetFont('Arial', '', 18);
// Y轴设为字体大小,对应文本顶部定位
$fpdi->SetXY(0, 18);
$fpdi->Cell(0, 0, 'Maestro Bach Johann Sebastian', 0, 0, 'L');

内容的提问来源于stack exchange,提问作者Petr Katerinak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:52:37