FPDF2 带页眉的自动分页符

FPDF2 Auto Page Breaks With Header

提问人:Max Lyman 提问时间:11/4/2023 更新时间:11/18/2023 访问量:37

问:

我正在尝试将 FPDF2 中的表格与格式化的 PDF 一起使用。我的 PDF 类继承了占据页面顶部前 15 毫米左右的标题方法。我遇到的问题是,当页面中断时,表格会继续到下一页并与标题重叠。有没有办法使当页面中断时,表格继续具有相同的上边距?

 def header(self):
        if self.page_no() != 1:
            self.set_font("Helvetica", "B", 15)
            self.set_fill_color(255, 255, 255)
            self.set_xy(4, 4)
            self.cell(0, 0, f"{self.title}")
            self.set_line_width(.25)
            self.set_draw_color(r=0, g=31, b=46)
            self.line(x1=5, y1=self.header_height, x2=self.w - 5, y2=self.header_height)

 def table_page_with_png(self, df: pd.DataFrame, columns: list,
                            text_align=("CENTER", "CENTER", "CENTER", "LEFT"),
                            col_widths=(20, 20, 25, 50),
                            png_padding=(2, 20, 2, 15)):
        self.add_page()

        self.set_draw_color(50)
        self.set_line_width(.5)
        self.set_font("Helvetica", '', 10)
        working_df = df[columns]
        df_to_list = working_df.values.tolist()
        df_to_list.insert(0, working_df.columns.values.tolist())
        with self.table(borders_layout="SINGLE_TOP_LINE",
                        text_align=text_align,
                        col_widths=col_widths,
                        line_height=2.5) as table:

            for i, data_row in enumerate(df_to_list):
                row = table.row()
                for j, data_cell in enumerate(data_row):
                    self.set_font("Helvetica", '', 8)
                    if ".png" in str(data_cell) and i > 0:
                        row.cell(img=data_cell, img_fill_width=True, padding=png_padding)
                    else:
                        data_cell = re.sub("<br>", " ", str(data_cell).strip())
                        row.cell(data_cell, padding=(1, .5, 1, 1))


谢谢!

python pdf 生成 pyfpdf fpdf2

评论


答:

0赞 blake 11/18/2023 #1

有点黑客,但我遇到了同样的问题,这就是我解决它的方式。

只需在末尾调用并传入您希望下一页开始的位置。self.set_y()header()

CONTENT_START = 108  # or set to whatever you want your content to start at

def header(self):
    ...  # header code
    self.set_y(CONTENT_START)

只要您的标题高度是可预测的,这就可以工作。