Python继承FPDF类生成多页PDF时调用join方法后第二页全空白
FPDF自定义类生成多页PDF第二页空白问题解决方案
问题原因梳理
- 基础语法错误:Python类的构造方法需为双下划线包裹的
__init__,原代码写为单下划线的_init_,不会被自动调用,配置的字体、页面尺寸等参数均未生效 - 实例调用逻辑错误:多处错误使用全局实例
pdf调用方法,应该用实例自身self完成调用;super父类初始化语法错误,横线误写为减号 - 变量作用域错误:
WIDTH、HEIGHT定义为构造方法局部变量,其他实例方法无法访问,需绑定到self变为实例属性 - 颜色继承问题:
front方法中将文字颜色设置为白色,第二页渲染时未重置文字颜色,白色文字和PDF白色背景重叠导致内容不可见 - 自动分页触发:
page_two方法中ln(250)的偏移量过大,部分版本FPDF会触发自动分页,导致内容输出到第三页空白处
修正后完整代码
from fpdf import FPDF class MY_PDF(FPDF): def __init__(self, **kwargs): super().__init__(**kwargs) self.add_font('Arial', '', r"c:\WINDOWS\Fonts\ARIAL.ttf", uni=True) self.add_font('Arial_Bold', '', r"c:\WINDOWS\Fonts\ARIALBD.ttf", uni=True) self.add_font('Georgia', '', r"c:\WINDOWS\Fonts\GEORGIA.ttf", uni=True) self.add_font('Calibri', '', r"c:\WINDOWS\Fonts\CALIBRI.ttf", uni=True) # A4尺寸绑定为实例属性 self.WIDTH = 210 self.HEIGHT = 297 # 禁用自动分页,避免内容偏移触发意外分页 self.set_auto_page_break(False) def front(self, title, second_title): self.set_fill_color(0,0,90) self.rect(0.5, 50, self.WIDTH-1, 75, 'F') self.set_fill_color(149,194,61) self.rect(14, 12, 5, 280, 'F') self.set_font('Arial', 'B', 38) self.set_text_color(255, 255, 255) self.cell(15) self.cell(150, 135, txt=f'{title}') self.ln(10) self.set_font('Arial', '', 28) self.cell(15) self.cell(150, 150, txt=f'{second_title}') #self.image('logga.png', 25, 12, 50) self.ln() def page_two(self, name, date, nr): # 重置文字颜色为黑色,避免沿用第一页的白色 self.set_text_color(0, 0, 0) self.set_font('Arial', '', 9) # 调整行偏移量避免超出页面 self.ln(240) self.cell(20) self.cell(0, 0, txt="©", align='L', ln=0) self.cell(-160) self.cell(0, 0, txt='Company name', align='L', ln=2) self.ln(4) self.cell(30) self.cell(0, 0, txt=f'Author: {name}', align='L', ln=2) self.ln(4) self.cell(30) self.cell(0, 0, txt=f'Date: {date}', align='L', ln=2) self.ln(4) self.cell(30) self.cell(0, 0, txt=f'Number: {nr}', align='L', ln=2) self.ln() def join(self, title, second_title, name, date, nr): self.add_page() self.front(title, second_title) self.add_page() self.page_two(name, date, nr) pdf= MY_PDF() pdf.join('TITLE!', 'some other title', 'Name Name', '2021-11-30', '21262') pdf.output('output.pdf')
内容的提问来源于stack exchange,提问作者Henri
相关产品推荐
相关产品推荐

