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

如何在Python的FPDF表格中为每个单元格设置固定宽高

自定义FPDF表格排版问题解决

问题背景

要编写一个从数据库列表生成PDF表格的脚本,为了实现对每个单元格的完全自定义控制,不使用FPDF官方的with pdf.table() as table:方法,改用multi_cell和cell手动实现表格,但遇到两个核心问题:

  • 无法确定合适的固定单元格高度,导致表格排版错乱不均
  • 需要设置适配每列最长内容的固定列宽,实现和内置table方法一样规整的表格效果

解决方案

以下是调整后的代码,实现了固定宽高的单元格,自动适配每列最长内容,排版规整统一:

from fpdf import FPDF

data = [
    ['Lp.', 'Nazwa Uslugi/Towaru', 'Jm', 'Ilosc', 'Cena Netto', 'Wartosc Netto', 'VAT', 'Kwota VAT' , 'Wartosc brutto'],
    ['1', 'maka', 'szt.', '10kg', '  11,32  zl ', '  11,32  zl ', '23%', '  2,60  zl ', '  13,92  zl '],
    ['2', 'ryz', 'szt.', '15kg', '  10,00  zl ', '  10,00  zl ', '8%', '  0,80  zl ', '  10,80  zl '],
    ['3', 'makaron', 'szt.', '5kg', '  3,60  zl ', '  3,60  zl ', '23%', '  0,83  zl ', '  4,43  zl '],
    ['4', 'kasza', 'szt.', '8kg', '  2,00  zl ', '  2,00  zl ', '8%', '  0,16  zl ', '  2,16  zl '],
    ['5', 'cukier', 'szt.', '20kg', '  20,00  zl ', '  20,00  zl ', '8%', '  1,60  zl ', '  21,60  zl '],
    ['6', 'soda', 'szt.', '3kg', '  1,00  zl ', '  1,00  zl ', '23%', '  0,23  zl ', '  1,23  zl '],
    ['7', 'smietana', 'szt.', '1l', '  15,00  zl ', '  15,00  zl ', '23%', '  3,45  zl ', '  18,45  zl '],
    ['8', 'bulka tarta', 'szt.', '2kg', '  1,56  zl ', '  1,56  zl ', '23%', '  0,36  zl ', '  1,92  zl']
]

def simple_table(spacing=1.5):
    pdf = FPDF()
    pdf.add_font('Segoe Ui', '', r'C:\Windows\Fonts\seguibl.ttf')
    pdf.add_page()
    pdf.set_font("Segoe Ui")
    
    # 计算每列最大宽度(适配最长内容,加内边距避免贴边)
    col_widths = []
    for col_idx in range(len(data[0])):
        max_width = 0
        for row in data:
            text_width = pdf.get_string_width(row[col_idx])
            if text_width > max_width:
                max_width = text_width
        col_widths.append(max_width + 2)
    
    # 统一行高:基于字体大小乘以间距系数
    row_height = pdf.font_size * spacing
    
    # 手动控制坐标,逐行逐单元格绘制
    current_y = pdf.y + 5  # 顶部留边距
    for row_idx, row in enumerate(data):
        current_x = pdf.x + 5  # 左侧留边距
        fill = row_idx == 0  # 表头填充灰色
        if fill:
            pdf.set_fill_color(128, 128, 128)
        
        for col_idx, item in enumerate(row):
            pdf.set_xy(current_x, current_y)
            pdf.multi_cell(
                w=col_widths[col_idx],
                h=row_height,
                txt=item.strip(),  # 清除内容前后多余空格
                border=1,
                align="C",
                fill=fill
            )
            current_x += col_widths[col_idx]
        current_y += row_height
    
    pdf.output('testing.pdf')

simple_table()

关键调整说明

  • 动态计算列宽:遍历每列所有内容,用get_string_width获取文本宽度,取最大值并添加内边距,确保每列能容纳最长内容
  • 统一使用multi_cell:避免cell和multi_cell混用导致的位置偏移,所有单元格用同一方法渲染,保证排版一致性
  • 固定行高:基于字体大小和间距系数设定统一行高,确保每行高度一致
  • 精准坐标控制:手动管理current_x和current_y,逐单元格定位,避免自动换行引发的位置错乱
  • 清理文本冗余空格:用strip()去除内容前后多余空格,避免内容显示偏移

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:38:13