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

FPDF中set_xy与get_string_width使用异常问题求助

问题分析与解决方案

看起来你遇到的问题大概率和FPDF的坐标系统、文本基线对齐这两个关键点有关,我帮你拆解一下:

核心问题点

  1. FPDF的坐标方向容易搞混:FPDF的坐标原点在页面左上角,y轴是向下递增的。你设置set_xy(0,50),意味着文本单元格的顶部距离页面顶部50mm——而你的页面总高度只有70mm,这个位置其实已经非常接近页面底部了,如果你误以为y轴向上(数值越大越靠上),那实际效果自然和预期不符。

  2. 文本基线的隐形影响:cell方法绘制文本时,默认是基于基线对齐的,即使你设置了valign='T'(顶部垂直对齐),文本的顶部和单元格顶部之间也会有微小的间距(取决于字体的上升高度)。如果需要精确控制文本的位置,这个细节不能忽略。

修正后的代码示例

情况1:你确实想让文本顶部距离页面顶部50mm

如果这是你的真实需求,我们可以调整代码确保位置精准:

font_size = 8
pdf = FPDF(unit='mm')
pdf.set_font("Arial", "", font_size)
full_w, full_h = 150, 70
txt = "Text"
txt_w = pdf.get_string_width(txt)

# 计算字体相关的尺寸(pt转mm:1pt=0.352778mm)
font_height_mm = font_size * 0.352778
# Arial字体的上升高度(基线到文本顶部的距离)约为字号的0.8倍
ascent_mm = (font_size * 0.8) * 0.352778

pdf.add_page('P', format=(full_w, full_h))

# 方式1:用cell方法,显式指定垂直顶部对齐
pdf.set_xy(0, 50)
# valign='T'确保文本在单元格内顶部对齐,cell高度设为字体总高度
pdf.cell(txt_w, font_height_mm, txt, align='R', border=1, valign='T')

# 方式2:用text方法更精准控制(y参数是文本基线的位置)
# pdf.text(txt_w, 50 + ascent_mm, txt)  # align='R'的话,x要设为txt_w,让文本右对齐到x位置

pdf.output("output.pdf")

情况2:你搞反了y轴方向,想让文本距离页面底部50mm

如果你的真实需求是文本靠近顶部,比如距离底部50mm(也就是距离顶部70-50=20mm),只需要把set_xy的y值改成20即可:

pdf.set_xy(0, 20)
pdf.cell(txt_w, font_height_mm, txt, align='R', border=1, valign='T')

额外验证建议

  • 可以先在页面上绘制一个边框来确认页面尺寸和坐标:
    pdf.rect(0, 0, full_w, full_h)  # 绘制页面外边框
    
  • 这样你就能直观看到文本在页面中的实际位置,更容易排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:10:36