如何用FPDF将DataFrame逐行打印到PDF并实现页面对齐
使用FPDF实现DataFrame的PDF表格对齐打印
问题分析
你之前的代码把整行数据拼接成单个字符串放入一个单元格,导致内容无法按列对齐。要实现规整的表格,需要为每一列分配独立的单元格,并统一列宽、添加边框,同时单独处理表头和数据行。
解决方案代码
from fpdf import FPDF import pandas as pd # 初始化PDF对象,设置单位为英寸,纸张为letter pdf = FPDF(format='letter', unit='in') pdf.add_page() # 设置左右边距 pdf.set_left_margin(0.5) pdf.set_right_margin(0.5) # --- 打印页面其他数据(示例:标题、说明)--- pdf.set_font('helvetica', 'B', 12) pdf.cell(w=0, h=0.5, txt="产品清单", ln=True, align='C') pdf.ln(0.2) # 换行留白 pdf.set_font('helvetica', '', 10) pdf.cell(w=0, h=0.3, txt="生成日期:2024年5月20日", ln=True, align='R') pdf.ln(0.3) # --- 准备DataFrame数据 --- data = [ [1, 'denumire1', 'cant1', 'pret1', 'valoare1'], [2, 'denumire2', 'cant2', 'pret2', 'valoare2'], [3, 'denumire3', 'cant3', 'pret3', 'valoare3'], [4, 'denumire4', 'cant4', 'pret4', 'valoare4'], ] df = pd.DataFrame(data, columns=['Nr. crt.', 'Denumire', 'Cant.', 'Pret unitar', 'Valoarea']) # --- 定义表格列宽(总可用宽度7.5英寸,按列内容分配)--- col_widths = [0.8, 2.5, 1.2, 1.5, 1.5] # 总和7.5,适配letter纸宽度 # --- 打印表头 --- pdf.set_font('helvetica', 'BU', 10) for col, width in zip(df.columns, col_widths): # 单元格参数:宽度、高度、内容、边框(1=显示边框)、是否换行(0=不换行,继续下一个cell)、对齐方式 pdf.cell(w=width, h=0.4, txt=col, border=1, ln=0, align='C') pdf.ln() # 表头行结束后换行 # --- 打印数据行 --- pdf.set_font('helvetica', '', 9) for _, row in df.iterrows(): for idx, width in enumerate(col_widths): content = str(row.iloc[idx]) # 数据单元格左对齐,表头居中,保持统一边框 pdf.cell(w=width, h=0.35, txt=content, border=1, ln=0, align='L') pdf.ln() # 每行结束后换行 # --- 可添加更多页面数据(示例:合计行)--- pdf.ln(0.2) pdf.set_font('helvetica', 'B', 10) pdf.cell(w=sum(col_widths[:4]), h=0.4, txt="总计:", border=1, ln=0, align='R') pdf.cell(w=col_widths[-1], h=0.4, txt="计算值", border=1, ln=1, align='R') # 输出PDF pdf.output('test_table.pdf', 'F')
关键说明
- 列宽分配:根据每列内容的长度设置对应宽度,确保内容不拥挤且整体适配页面
- 单元格边框:通过
border=1显示表格边框,提升可读性 - 字体与对齐:表头使用加粗下划线字体并居中,数据行左对齐,区分层级
- 其他数据插入:在表格前后可自由添加标题、日期、合计等内容,只需调整
pdf.cell和pdf.ln控制排版
内容的提问来源于stack exchange,提问作者kitten_world
相关产品推荐
相关产品推荐

