reportlab header 使用 Django 的参数

Parameter to reportlab header using Django

我正在根据 this example 生成 PDF 并且工作正常,但是我在 header 的部分有一个小问题,这是实际代码:

def _header_footer(canvas, doc):
    # Save the state of our canvas so we can draw on it
    canvas.saveState()
    styles = getSampleStyleSheet()

    # Header
    header = Paragraph('This is a multi-line header.  It goes on every page.   ' * 5, styles['Normal'])
    w, h = header.wrap(doc.width, doc.topMargin)
    header.drawOn(canvas, doc.leftMargin, doc.height + doc.topMargin - h)

    # Release the canvas
    canvas.restoreState()

我想将数据从模型发送到 header,像这样

def _header_footer(canvas, doc, custom_data):
    canvas.saveState()
    styles = getSampleStyleSheet()

    header = Paragraph('This is my %s' % custom_data')

    #etc.

_header_footer 调用者:

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

如何将我的 custom_data 变量发送到 _header_footer 方法?

您至少有两个选择:

您可以使用 partial from functools,它允许 "bind" 您的函数的一些参数。例如:

from functools import partial
def _header_footer(canvas, doc, custom_data):
    ...

# Usage:
doc.build(elements, onFirstPage=partial(_header_footer, custom_data=my_custom_data))

或者因为您似乎是在 class 中使用它,由于 self 关键字(或者是打字错误?),您可以简单地将 custom_data 作为属性到你的 class.

class MyPdf(object):
    def __init__(self, custom_data):
        self.custom_data = custom_data
        self.doc = ... # your doc

    def _header_footer(self, canvas, doc):
        # you can access self.custom_data here
        ...

    def build(self):
        ...
        self.doc.build(elements, onFirstPage=self._header_footer)

# Usage
my_pdf = MyPdf(custom_data)
my_pdf.build()