首页 > 解决方案 > Reportlab:如何为第一页设置模板

问题描述

我需要在使用 ReportLab 创建的 PDF 文件的第一页上设置模板。我已经在下一页看到了NextPageTemplate用于更改模板的 flowable。所以任何人都可以帮助我做到这一点?例如:我需要设置一个模板,使页面顶部应如下所示。

在此处输入图像描述

请在下面找到我的代码。

from reportlab.lib.colors import Color
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfgen import canvas
from reportlab.platypus import BaseDocTemplate, Frame, Paragraph, NextPageTemplate, PageBreak, PageTemplate


class NumberedCanvas(canvas.Canvas):
    def __init__(self, *args, **kwargs):
        canvas.Canvas.__init__(self, *args, **kwargs)
        self._saved_page_states = []

    def showPage(self):
        self._saved_page_states.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        """add page info to each page (page x of y)"""
        num_pages = len(self._saved_page_states)
        for state in self._saved_page_states:
            self.__dict__.update(state)
            self.draw_page_number(num_pages)
            canvas.Canvas.showPage(self)
        canvas.Canvas.save(self)

    def draw_page_number(self, page_count):
        self.setFont('Montserrat', 9)
        self.setLineWidth(0.1)
        self.setStrokeColor(Color(0, 0, 0, alpha=0.2))
        self.setFillColor(Color(0, 0, 0, alpha=0.4))
        self.line(cm, 1.5 * cm, A4[0] - cm, 1.5 * cm)
        self.drawRightString(A4[0] - cm, 1.1 * cm, "Page %d of %d" % (self._pageNumber, page_count))


style = getSampleStyleSheet()['Normal']
style.fontName = 'Montserrat'
elements = []

doc = BaseDocTemplate('basedoc.pdf', showBoundary=1, pagesize=A4)
pdfmetrics.registerFont(TTFont('Montserrat', 'Montserrat-Regular.ttf'))

frameT = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='normal')

frame1 = Frame(doc.leftMargin, doc.bottomMargin, doc.width / 2 - 6, doc.height, id='col1')
frame2 = Frame(doc.leftMargin + doc.width / 2 + 6, doc.bottomMargin, doc.width / 2 - 6, doc.height, id='col2')

doc.addPageTemplates([
    PageTemplate(id='OneCol', frames=frameT),
    PageTemplate(id='TwoCol', frames=[frame1, frame2]),
])

elements.append(Paragraph("Frame one column, " * 500, style))
elements.append(NextPageTemplate('TwoCol'))
elements.append(PageBreak())
elements.append(Paragraph("Frame two columns,  " * 500, style))
elements.append(NextPageTemplate('OneCol'))
elements.append(PageBreak())
elements.append(Paragraph("Mohammed Shafeeque", style))

# start the construction of the pdf
doc.build(elements, canvasmaker=NumberedCanvas)

标签: pythonpython-3.xreportlab

解决方案


推荐阅读