FPDF中set_xy与get_string_width使用异常问题求助
问题分析与解决方案
看起来你遇到的问题大概率和FPDF的坐标系统、文本基线对齐这两个关键点有关,我帮你拆解一下:
核心问题点
FPDF的坐标方向容易搞混:FPDF的坐标原点在页面左上角,y轴是向下递增的。你设置
set_xy(0,50),意味着文本单元格的顶部距离页面顶部50mm——而你的页面总高度只有70mm,这个位置其实已经非常接近页面底部了,如果你误以为y轴向上(数值越大越靠上),那实际效果自然和预期不符。文本基线的隐形影响:
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
相关产品推荐
相关产品推荐

