【问题标题】:Two different pages with reportlab SimpleDocTemplate and Djangoreportlab SimpleDocTemplate 和 Django 的两个不同页面
【发布时间】:2015-03-04 00:00:24
【问题描述】:

我正在使用 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

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

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

【问题讨论】:

  • docdoc2 使用相同的缓冲区。这意味着当您执行doc2.build 时,您可能会覆盖缓冲区中的先前构建。尝试将最后一段包含在您用于构建的元素列表中,或者在下一次构建之前将构建结果存储在变量中。您如何决定何时仅显示最后一页的内容尚不清楚,因此您的修复将取决于此。

标签: python django reportlab


【解决方案1】:

我认为使用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 中,但很难找到您要查找的内容。

【讨论】:

  • 谢谢,但是有一个错字 addPageTemplates 而不是 addPageTemplates
  • @BraulioSoncco 什么错字?
猜你喜欢
  • 1970-01-01
  • 2012-11-26
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 2013-12-19
相关资源
最近更新 更多