带有 reportlab SimpleDocTemplate 和 Django 的两个不同页面

Two different pages with reportlab SimpleDocTemplate and Django

我正在使用 django 并在 this example 之后生成报告,我需要生成最后一页但没有页眉或页脚和不同的内容。

我正在尝试这样做:

def print_example(self):
    buffer = self.buffer
    doc = SimpleDocTemplate(buffer,
                            rightMargin=72,
                            leftMargin=72,
                            topMargin=72,
                            bottomMargin=72,
                            pagesize=self.pagesize)

    elements = []
    elements.append(Paragraph('Content for all pages'), my_custom_style)
    # ...

    doc.build(elements, onFirstPage=self._header_footer, onLaterPages=self._header_footer,
                  canvasmaker=NumberedCanvas)

    doc2 = SimpleDocTemplate(buffer,
                        rightMargin=72,
                        leftMargin=72,
                        topMargin=72,
                        bottomMargin=72,
                        pagesize=self.pagesize)

    elements2 = []
    elements2.append(Paragraph('Content for the last page only'), my_custom_style)

    doc2.build(elements2, canvasmaker=NumberedCanvas)


    # Get the value of the BytesIO buffer and write it to the response.
    pdf = buffer.getvalue()
    buffer.close()
    return pdf

然后只出现最后一个内容,之前的内容消失。

如何生成不同内容的最后一页?

我认为使用 SimpleDocTemplate 不可能,但您可以使用 BaseDocTemplate 并定义自己的模板来实现。

基本示例

from reportlab.platypus import PageTemplate, BaseDocTemplate, NextPageTemplate, PageBreak

def headerFooterLayout(canvas, doc):
    canvas.saveState()
    canvas.setPageSize(self.pagesize)
    # add header/footer
    canvas.restoreState()

def emptyLayout(canvas, doc):
    canvas.saveState()
    canvas.setPageSize(self.pagesize)
    canvas.restoreState()

pHeight, pWidth = self.pagesize
myFrame = Frame(0, 0, pHeight, pWidth, id='myFrame')

headerFooterTemplate = PageTemplate(id='headerFooterTemplate',
                                    frames=[myFrame],
                                    onPage=headerFooterLayout)

emptyTemplate = PageTemplate(id='emptyTemplate',
                             frames=[myFrame],
                             onPage=emptyLayout)

elements = []
elements.append(Paragraph('blah', style))
elements.append(NextPageTemplate('emptyTemplate'))
elements.append(PageBreak())
elements.append(Paragraph('last page', style))

doc = BaseDocTemplate(buffer,
                      rightMargin=72,
                      leftMargin=72,
                      topMargin=72,
                      bottomMargin=72)

doc.addPageTemplates([headerFooterTemplate, emptyTemplate])

doc.build(elements)

自从我使用它以来已经有一段时间了,所以可能会出现一些问题,但如果有什么不起作用,请发表评论。

这些都在 user guide 中,但很难找到您要找的东西。