使用FPDF库创建表格报错:'CreateTablePDF'对象无'epw'属性
解决FPDF中'CreateTablePDF' object has no attribute 'epw'错误
问题描述
使用FPDF库创建表格时,Python抛出错误:'CreateTablePDF' object has no attribute 'epw'。相关代码如下:
import pathlib from os.path import join from fpdf import FPDF class CreateTablePDF(FPDF): def __init__(self): super(CreateTablePDF, self).__init__() src_dir = f'{pathlib.Path(__file__).parent.parent.parent.parent.absolute()}' font_dir = join(src_dir, 'common', 'fonts') font_arial = join(font_dir, "arial.ttf") self.add_font("Arial", "", font_arial, uni=True) self.set_font("Arial", size=8) def create_table_from_rows(self, rows): once = True line_height = self.font_size * 1.5 col_width = self.epw / 3 for row in rows: for datum in row: if datum != None: if once: self.set_fill_color(230, 230, 230) self.multi_cell(col_width, line_height, datum, border=1, ln=3, max_line_height=self.font_size, fill=True) else: self.multi_cell(col_width, line_height, datum, border=1, ln=3, max_line_height=self.font_size) col_width = self.epw / 3 once = False col_width = self.epw / 10 self.ln(line_height)
已尝试安装FPDF2,但问题仍未解决,本地安装的类中存在epw属性定义:
def __init__( self, orientation: _Orientation = ..., unit: _Unit | float = ..., format: _Format | tuple[float, float] = ..., font_cache_dir: str | Literal["DEPRECATED"] = ..., ) -> None: ... ... @property def epw(self) -> float: ...
解决方案
1. 修正FPDF2的导入语句
epw是FPDF2库专属的属性,旧版的fpdf库(最初的FPDF for Python)没有这个属性。如果已经安装了FPDF2,但代码中仍使用from fpdf import FPDF,导入的其实是旧版库的类,自然找不到epw。
修改导入代码:
from fpdf2 import FPDF
2. 确保页面已初始化
虽然FPDF2的__init__方法默认会自动添加第一页,但如果自定义初始化逻辑中意外跳过了页面创建,需要手动调用self.add_page()来生成页面,这样epw属性才会生效。可以在__init__方法末尾添加:
self.add_page()
3. 代码细节优化
将if datum != None:改为Python规范写法if datum is not None:,避免潜在的逻辑问题。
修正后的完整代码
import pathlib from os.path import join from fpdf2 import FPDF class CreateTablePDF(FPDF): def __init__(self): super(CreateTablePDF, self).__init__() src_dir = f'{pathlib.Path(__file__).parent.parent.parent.parent.absolute()}' font_dir = join(src_dir, 'common', 'fonts') font_arial = join(font_dir, "arial.ttf") self.add_font("Arial", "", font_arial, uni=True) self.set_font("Arial", size=8) # 确保页面已创建(若父类初始化未自动添加) self.add_page() def create_table_from_rows(self, rows): once = True line_height = self.font_size * 1.5 col_width = self.epw / 3 for row in rows: for datum in row: if datum is not None: if once: self.set_fill_color(230, 230, 230) self.multi_cell(col_width, line_height, datum, border=1, ln=3, max_line_height=self.font_size, fill=True) else: self.multi_cell(col_width, line_height, datum, border=1, ln=3, max_line_height=self.font_size) col_width = self.epw / 3 once = False col_width = self.epw / 10 self.ln(line_height)
内容的提问来源于stack exchange,提问作者CHERNO MYRZIK
相关产品推荐
相关产品推荐

