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

继承FPDF类调用add_page()报AttributeError: 无buffer属性

解决FPDF子类AttributeError: 'PDFcert'对象没有'buffer'属性的问题

你遇到的问题根源在于自定义子类的__init__方法没有调用父类FPDF的构造函数。FPDF类的__init__会初始化很多核心属性(包括buffer),如果你重写__init__但不调用父类的初始化逻辑,这些属性就不会被创建,调用add_page()时自然会报错。

另外你的代码里还有一个小问题:header方法中引用了外部变量pdf.epw,应该改成self.epw,否则会引发NameError。

修正后的完整代码

from fpdf import FPDF
from fpdf import enums

class PDFcert(FPDF):
    def __init__(self, username):
        # 必须先调用父类的构造函数,初始化FPDF的核心属性
        super().__init__()
        self.username = username

    def header(self):
        self.set_font("helvetica", "B", 50)
        self.cell(50, align="C")
        self.cell(100, 30, txt="CS50 Shirtificate", align="C")
        with self.local_context(blend_mode="Overlay"):
            # 将pdf.epw改为self.epw,引用当前实例的属性
            self.image("./shirtificate.png", enums.Align.C, y=50, w=self.epw)
        self.set_font("helvetica", "B", 20)
        self.set_text_color(255)
        self.text(65, 120, txt=f"{self.username} took CS50")

def main():
    username = input("Name: ")
    pdf = PDFcert(username=username)
    pdf.add_page()
    pdf.output("new-tuto2.pdf")

if __name__ == "__main__":
    main()

关键修改说明

  • 在PDFcert.__init__中添加super().__init__():这行代码会调用父类FPDF的构造函数,完成buffer等核心属性的初始化,确保后续调用add_page()等方法时不会报错。
  • 将pdf.epw改为self.epw:epw是FPDF实例的属性,应该通过当前实例self访问,而不是引用外部的pdf变量。

这样修改后,你的程序就能正常生成带有用户名的T恤证书PDF了。

内容的提问来源于stack exchange,提问作者Vincent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:07:25