我对 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:
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
我的代码有什么问题?
也许另一个人可以回答我一个简单的问题:我可以获得正文的大小吗(例如:页面大小 - 页眉 - 页脚)?
问题始于第一页末尾,此时 的值较高y(可能是mm)。此时您的代码执行了以下指令:y``180
y
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.set_y(y)
195
15
self.set_y(210)
为了避免这种情况,您必须检查的值self.get_y()是否是页面中的当前位置。另一方面,y在插入文本的最后一行之前保存页面中的 Y 位置。如果当前位置变为<=值,则y意味着 PyFPDF 库已自动添加新页面,并且已将 Y 位置设置在新页面的顶部。 在这种情况下,值y不能增加,但必须将其设置为等于 current_position。
self.get_y()
<=
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