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

