我试图在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页,页脚只是 必须放在最早的页面底部但在表后。)
我在使用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,对我解决这些问题帮助很大。
祝贺。
我能够找到自己的解决方案。
我创建了自己的 Flowable
并加了一个 TopPadder
对方 Flowables
. 我不得不把一个 Spacer
之间,因为其他方式我的 Flowable
有时会与《公约》重叠。Table
.