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
相关产品推荐
相关产品推荐

