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

