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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:33:37