Python reportlab - 如何在SimpleDocTemplate的最后一页画一些东西?

问题描述 投票:1回答:2

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

但现在我的问题是:如何在SimpleDocTemplate的最后一页画一些东西?

我怎样才能在 底下 (这很重要!)的最后一页?也可能是第一页,这取决于表格的长度)。

我的想法是,只要得到最后一页的画布,然后在上面画页脚(我加了一个间隔符,这样我就可以确定有足够的空间。这样做是可行的,但我无法得到最后一页的画布。)

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')

有没有办法在建好文档后,修改后得到最后一页的画布?还是有其他方法可以解决我的问题?

下面是我想做的一个划痕:(表格也可以超过2页,页脚只是 必须放在最早的页面底部但在表后。)

What I'm trying to get

django python-3.x view pdf-generation reportlab
2个回答
1
投票

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

我想做的是创建一个包含这些信息的pagetemplate,然后在用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)

之后你就可以把你的模板_last_page添加到你的文档中。然后使用 nextpagetemplate("your template")方法到达文档的最后一页,再使用 Pagebreak()。

如果你不使用库中的子类,有时会很受限制。我买了一本Reportlab的书,Reportlab: Processing with Python,对我解决这些问题帮助很大。

祝贺。


0
投票

我能够找到自己的解决方案。

我创建了自己的 Flowable 并加了一个 TopPadder 对方 Flowables. 我不得不把一个 Spacer 之间,因为其他方式我的 Flowable 有时会与《公约》重叠。Table.

© www.soinside.com 2019 - 2024. All rights reserved.