使用reportLab向页面添加页眉和页脚

Ann*_*C K 8 python pdf header reportlab footer

我试图将页眉和页脚包含在单个页面上。我在reportlab中引用了A multiline(paragraph) footer and header,并使用了Jochen和NateB80所述的方法。但只生成页眉,而不生成页脚。

def header(canvas, doc, content):
    canvas.saveState()
    w, h = content.wrap(doc.width, doc.topMargin)
    content.drawOn(canvas, doc.leftMargin, doc.height + doc.topMargin - h)
    canvas.restoreState()


def footer(canvas, doc, content):
    canvas.saveState()
    w, h = content.wrap(doc.width, doc.bottomMargin)
    content.drawOn(canvas, doc.leftMargin, h)
    canvas.restoreState()

styles = getSampleStyleSheet()

PAGESIZE = pagesizes.portrait(pagesizes.A4)
# PAGESIZE = letter
pdf = SimpleDocTemplate(filename, pagesize=PAGESIZE, leftMargin=2.2*cm, rightMargin=2.2*cm,
        topMargin=1.5*cm,bottomMargin=2.5*cm)
frameh = Frame(pdf.leftMargin, pdf.bottomMargin, pdf.width, pdf.height - 2 * cm, id='normal')
header_content = Paragraph("This is a header. testing testing testing  ", styles['Normal'])
templateh = PageTemplate(id='test', frames=frameh, onPage=partial(header, content=header_content))
pdf.addPageTemplates([templateh])

framef = Frame(pdf.leftMargin, pdf.bottomMargin, pdf.width, pdf.height, id='normal')
footer_content = Paragraph("This is  footer.  It goes on every page.  ", styles['Normal'])
templatef = PageTemplate(id='test', frames=framef, onPage=partial(footer, content=footer_content))
pdf.addPageTemplates([templatef])
Run Code Online (Sandbox Code Playgroud)

我也尝试了下面的方法,但仍然没有生成页脚。

 pdf.addPageTemplates([
                      PageTemplate(id='footer', frames=[frameh, framef], onPage=partial(header, content=header_content)),
                      ])
Run Code Online (Sandbox Code Playgroud)

mug*_*ows 9

您需要将headerand组合footer成一个函数并将其放入一个函数中PageTemplate

from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import cm
from reportlab.platypus import SimpleDocTemplate, PageTemplate
from reportlab.platypus.frames import Frame
from reportlab.lib import pagesizes
from reportlab.platypus.paragraph import Paragraph
from functools import partial

def header(canvas, doc, content):
    canvas.saveState()
    w, h = content.wrap(doc.width, doc.topMargin)
    content.drawOn(canvas, doc.leftMargin, doc.height + doc.bottomMargin + doc.topMargin - h)
    canvas.restoreState()

def footer(canvas, doc, content):
    canvas.saveState()
    w, h = content.wrap(doc.width, doc.bottomMargin)
    content.drawOn(canvas, doc.leftMargin, h)
    canvas.restoreState()

def header_and_footer(canvas, doc, header_content, footer_content):
    header(canvas, doc, header_content)
    footer(canvas, doc, footer_content)

styles = getSampleStyleSheet()

filename = "out.pdf"

PAGESIZE = pagesizes.portrait(pagesizes.A4)

pdf = SimpleDocTemplate(filename, pagesize=PAGESIZE, 
        leftMargin = 2.2 * cm, 
        rightMargin = 2.2 * cm,
        topMargin = 1.5 * cm, 
        bottomMargin = 2.5 * cm)

frame = Frame(pdf.leftMargin, pdf.bottomMargin, pdf.width, pdf.height, id='normal')

header_content = Paragraph("This is a header. testing testing testing  ", styles['Normal'])
footer_content = Paragraph("This is a footer. It goes on every page.  ", styles['Normal'])

template = PageTemplate(id='test', frames=frame, onPage=partial(header_and_footer, header_content=header_content, footer_content=footer_content))

pdf.addPageTemplates([template])

pdf.build([Paragraph("This is content")])
Run Code Online (Sandbox Code Playgroud)