我正在制作发票,我想在最后一页上添加一个页脚(也可以是第一页)。
由于表的数据是动态的,我无法计算页数。
现在我正在使用2页模板,第一页(有2帧和页脚1)和下页(有1帧和页脚2)。这在数据填充两页时起作用,但是当表只填充1页或更多页时,它就不再起作用了。
我按以下方式定义了页脚:
footerFrame = Frame(x1=35*mm, y1=20*mm, width=175*mm, height=15*mm)
footerStory = [ Paragraph("Have a nice day.", styles["fancy"]) ]
def footer2(canvas,document):
canvas.saveState()
footerFrame.addFromList(footerStory, canvas)
canvas.restoreState()
是否有更灵活的方式来定义页脚,因此它只显示在表格结束的页面上?
提前致谢。
答案 0 :(得分:3)
通过覆盖ReportLabs canvas类,您可以跟踪页面(我已经完成了其他不涉及flowables的报告,但我相信您仍然可以使它工作!)。
由于您使用的是可流动的(段落),因此您需要知道每个新PDF生成的页数(长度是动态部分)。我不是100%肯定,但我认为ReportLab的可流动性仍然会调用画布的“showPage()”方法。所以你可以做到以下几点:
在伪代码/ part-python中,我推荐以下(未经测试):
class MyFooterCanvas(canvas.Canvas):
def __init__(self, *args, **kwargs):
## Subclass the ReportLab canvas class.
canvas.Canvas.__init__(self, *args, **kwargs)
## Create an empty list to store the saved pages so you can keep track of them.
self._savedPages = []
def showPage(self):
"""Override the showPage method"""
## We are writing our own showPage() method here, so we can keep track of
## what page we are on.
self._savedPages.append(self)
## Start a new page.
self._startPage()
def drawFooter(self):
"""Draws the footer to the page. You can have it do whatever you want here"""
self.drawString(50, 50, "This is my footer, yay me - footer freedom")
def save(self):
"""Saves the entire PDF in one go, a bit costly to do it this way,
but certainly one way to get a footer."""
numPages = len(self._savedPages)
for pages in self._savedPages:
## Finds the last page and when it 'hits', it will call the self.drawFooter() method.
if pages == self._savedPages[-1]:
self.drawFooter()
else:
## If it's not the last page, explicitly pass over it. Just being thorough here.
pass
## And... continue doing whatever canvas.Canvas() normally does when it saves.
canvas.Canvas.save(self)
AGAIN 这是未经测试的,但我认为这会为您提供所需的行为。尝试一下,如果你遇到困难让我知道,如果需要,我可以将其中的一部分哈希,但我已经为其他非流动性做了同样的方法,它在过去对我有用。