Python reportlab - 如何在 SimpleDocTemplate 的最后一页绘制内容?

Python reportlab - How to draw something on the last page of a SimpleDocTemplate?

我正在尝试在 Django 视图中使用 python reportlab 库创建发票。

但现在我的问题是:

How can I write/draw something at the bottom (that's important!) of the last page? (Which may also be the first one, depending on how long the table is.)

我的想法是只获取最后一页的 canvas 并在其上绘制页脚(我添加了一个 Spacer 所以我可以确定它有足够的 space。这会起作用,但我无法获取最后一页的 canvas。)

buffer = BytesIO()

doc = SimpleDocTemplate(buffer, rightMargin=10*mm, leftMargin=10*mm, topMargin=10*mm, bottomMargin=0*mm)
elements = [Spacer(1,75*mm),get_table(),Spacer(1,108*mm)]
# get_table() returns a Table object

doc.build(elements, onFirstPage=draw_header)
# draw_header draws the header on the canvas

draw_invoice(CANVAS) # here's my problem

buffer.seek(0)

return FileResponse(buffer, as_attachment=False, filename='invoice.pdf')

建文档后有没有办法获取最后一页的canvas并修改?或者有其他方法可以解决我的问题吗?

这是我正在尝试做的事情的一部分:(table 也可以超过 2 页,页脚只是 必须在最早的底部可能的页面 ,但在 table 之后。)

我在使用 reportlab 时遇到了几个问题,是的,它是一个生成 pdf 的好工具,但大多数时候我不得不重写函数并从 basedoctemplate 创建子类。

我要做的是创建一个包含该信息的页面模板,然后切换到它,然后使用 Pagebreak() 完成文档。

class MyDocTemplate(BaseDocTemplate):
def __init__(self, data, filename, **kw):
    self.data = data
    self.allowSplitting = 0
    BaseDocTemplate.__init__(self, filename, **kw)

    #Frame bottom, limited to your work area
    frame_bottom = Frame(self.leftMargin, self.bottomMargin, self.width/2, self.height/2 - 20*mm,
                    page_height_landscape - 2 * self.bottomMargin,
                    id='landscape', showBoundary=0)
    # Definicion de templates
    template_last_page = PageTemplate('last_page', frames=frame_b,
                                       onPage=lastpage)

之后,您可以将 template_last_page 添加到您的文档中。然后在到达文档的最后使用方法 nextpagetemplate("your template"),然后是 Pagebreak().

如果您不使用库中的子类,有时会非常有限。我买了一本 reportlab 的书,Reportlab: Processing with Python,帮我解决了这些问题。

此致。

我找到了自己的解决方案:

我创建了自己的 Flowable 并将其与 TopPadder 添加到另一个 Flowables。我不得不在两者之间放置一个 Spacer,因为否则我的 Flowable 有时会与 Table.

重叠