首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用reportLab向页面添加页眉和页脚

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

Stack Overflow用户
提问于 2021-05-26 18:08:33
回答 1查看 341关注 0票数 1

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

代码语言:javascript
运行
复制
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])

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

代码语言:javascript
运行
复制
 pdf.addPageTemplates([
                      PageTemplate(id='footer', frames=[frameh, framef], onPage=partial(header, content=header_content)),
                      ])
EN

回答 1

Stack Overflow用户

发布于 2021-05-26 20:01:30

您需要将headerfooter组合到一个函数中,并将其放入一个PageTemplate

代码语言:javascript
运行
复制
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")])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67702808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档