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

