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

Python fpdf生成PDF表格时如何调整列宽适配所有文本内容

Python fpdf 自定义表格列宽解决文本显示不全问题

问题表现

使用fpdf生成PDF表格时,默认采用均匀分配列宽的规则,内容较长的第一列无法完整显示所有文本,需要调整列宽为第一列宽度大于第二、第三列,适配所有内容的显示需求。

问题根源

原代码中使用col_width = pdf.epw / 4为所有列设置了统一宽度,没有根据各列的实际内容长度分配宽度,导致长文本列空间不足。

修复方案

放弃单一列宽变量,改为按比例分配页面可编辑区域总宽度(pdf.epw为当前页面正文可用总宽度):给存放长文本的第一列分配60%的宽度,存放数值的第二列、存放单位的第三列各分配20%的宽度,总宽度刚好占满可用区域,既保证长文本完整显示,也不会浪费空间。
渲染表头和表格行时,按列索引匹配对应的宽度值即可。

修复后完整代码

from fpdf import FPDF 
pdf = FPDF()

alfa = 5
lasna = 5

pdf.add_page() 
  
pdf.set_font("Times", size = 16) 

TABLE_COL_NAMES = ("Propriedade", "Valor", "Unidade")
TABLE_DATA = (
    ("Ângulo da vertente", str(alfa), "º"),
    ("Comprimento de cada asna", str(lasna), "m"),
)


pdf.set_font("Times", size=16)
line_height = pdf.font_size * 2
# 按比例配置列宽,第一列更宽适配长文本
col_widths = (pdf.epw * 0.6, pdf.epw * 0.2, pdf.epw * 0.2)

def render_table_header():
    pdf.set_font(style="B")  # 表头启用粗体
    for col_name, width in zip(TABLE_COL_NAMES, col_widths):
        pdf.cell(width, line_height, col_name, border=1)
    pdf.ln(line_height)
    pdf.set_font(style="")  # 恢复常规字体

render_table_header()
for _ in range(1):
    for row in TABLE_DATA:
        if pdf.will_page_break(line_height):
            render_table_header()
        for datum, width in zip(row, col_widths):
            pdf.cell(width, line_height, datum, border=1)
        pdf.ln(line_height)

pdf.output("Relatório_TED.pdf")

调整说明

  • 如果6:2:2的比例下第一列仍有文本截断,可以适当调大第一列的占比,只要三个列的宽度之和等于pdf.epw就不会超出页面边界
  • 固定比例列宽实现简单,适配内容固定的报表场景;如果需要完全贴合文本长度,可以先遍历所有单元格内容计算每列最长文本的渲染宽度,再加2-5mm的内边距作为最终列宽。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:31:01