小能豆

pyFPDF:自动分页导致每页只有一行

py

我对 FPDF 感到困惑。当我循环遍历数据框并想将数据放入 PDF 文件的页面中时;但是当 FPDF 添加新页面时会发生以下情况:

  • 第一页正确地填充了许多行(这很好
  • 在其他页面中,每页只有一行

我展示了下面发生的情况:

PAGE 1: val 1, val 2, val 3, val 4, val 5, val 6
PAGE 2: val 7,
PAGE 3: val 8,
PAGE 4: val 9,
[...]

这是我的代码:

pdf = PDF('L', 'mm', 'A4')
pdf.alias_nb_pages()
pdf.add_page()
pdf.set_font("Arial","",12)
pdf.content(df)
pdf.output('tuto2.pdf', 'F')

这是我的PDF班级,它是FPDF

class PDF(FPDF):

    def header(self):
        self.set_font('Arial', 'B', 30)
        self.cell(0,30,"HALLO PDF",0,0,"C")
        self.ln(30)

    def footer(self):
        self.set_y(-20)
        self.set_font('Arial', 'I', 8)
        self.cell(0,10,"Seite " + str(self.page_no()) + "/{nb}",0,0,"C",0,"")
        self.set_y(-10)
        self.cell(0,10,"Dokument erzeugt am XXXX",0,0,"C",0,"")

    def content(self,df):
        y=30
        for i in range(len(df)):
            self.set_y(y)
            self.cell(40,15,df['LG'].iloc[i],1,ln=0,align='C')
            self.cell(40, 15, df['LGP'].iloc[i], 1, ln=0, align='C')
            self.cell(40, 15, df['ZEIT'].iloc[i], 1, ln=1, align='C')
            y=y+15

我的代码有什么问题?

也许另一个人可以回答我一个简单的问题:我可以获得正文的大小吗(例如:页面大小 - 页眉 - 页脚)?


阅读 21

收藏
2025-01-04

共1个答案

小能豆

错误解释

问题始于第一页末尾,此时 的值较高y(可能是mm)。此时您的代码执行了以下指令:y``180

self.cell(40,15,df['LG'].iloc[i],1,ln=0,align='C')
self.cell(40, 15, df['LGP'].iloc[i], 1, ln=0, align='C')
self.cell(40, 15, df['ZEIT'].iloc[i], 1, ln=1, align='C')

并在第一页插入最后一行。之后,库创建一个新页面,并准备将下一行放置在新页面的开头。
此时执行以下 2 条指令:

# here y value is 'high' (180 mm)
y = y + 15
# the value of y now is 195
self.set_y(y)

该指令self.set_y(y)将代码放在第二页的开头。
现在插入了新行,但y等于195并且还增加了15。因此,当执行该指令时,self.set_y(210)库将创建第三页。

如何避免错误

为了避免这种情况,您必须检查的值self.get_y()是否是页面中的当前位置。另一方面,y在插入文本的最后一行之前保存页面中的 Y 位置。如果当前位置变为<=值,则y意味着 PyFPDF 库已自动添加新页面,并且已将 Y 位置设置在新页面的顶部。
在这种情况下,值y不能增加,但必须将其设置为等于 current_position。

content()方法修改

一个可能的解决方案是content()按如下方式修改您的功能:

def content(self,df):
    y=30
    for i in range(len(df)):
        self.set_y(y)
        self.cell(40,15,df['LG'].iloc[i],1,ln=0,align='C')
        self.cell(40, 15, df['LGP'].iloc[i], 1, ln=0, align='C')
        self.cell(40, 15, df['ZEIT'].iloc[i], 1, ln=1, align='C')
        curr_y = self.get_y()
        if curr_y > y:
            # here we are in the of the page
            y = y + 15
        else:
            # here the library adds a new page so curr_y has a low value
            y = curr_y
2025-01-04