首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ReportLab首页不同(首页)

ReportLab首页不同(首页)
EN

Stack Overflow用户
提问于 2021-12-16 16:14:48
回答 1查看 697关注 0票数 0

我正在使用python 3.7.9和最新的reportlab创建一个PDF报告。我试图为我的第一页分配一个不同的template (没有页眉和页脚),但是我的调度不起作用。此设置基于文件,第9.5章。如何仅在第一页上使用不同的template

下面的代码创建一个PDF与一个简单的目录和页眉和页脚在所有的网页。

代码语言:javascript
运行
复制
from reportlab.lib.styles import ParagraphStyle as PS
from reportlab.platypus import PageBreak, Table
from reportlab.platypus.paragraph import Paragraph
from reportlab.platypus.doctemplate import PageTemplate, BaseDocTemplate
from reportlab.platypus.tableofcontents import TableOfContents
from reportlab.platypus.frames import Frame
from reportlab.lib.units import cm
from reportlab.lib import colors
from functools import partial

class MyDocTemplate(BaseDocTemplate):

    def __init__(self, filename, **kw):
        self.allowSplitting = 0
        BaseDocTemplate.__init__(self, filename, **kw)

        template = PageTemplate('normal',
                                [Frame(1.75*cm, 2.5*cm, 17.5*cm, 24*cm, id='F1')],
                                onPage=partial(header_and_footer,
                                header_content=header_content,
                                footer_content=footer_content))

        self.addPageTemplates(template)

    def afterFlowable(self, flowable):
        "Registers TOC entries."
        if flowable.__class__.__name__ == 'Paragraph':
            text = flowable.getPlainText()
            style = flowable.style.name
            if style == 'Heading1':
                self.notify('TOCEntry', (0, text, self.page))
            if style == 'Heading2':
                self.notify('TOCEntry', (1, text, self.page))

h1 = PS(name = 'Heading1',
       fontSize = 14,
       leading = 16)

h2 = PS(name = 'Heading2',
       fontSize = 12,
       leading = 14,
       leftIndent = 5)
l0 = PS(name = 'list0',
        fontSize = 12,
        leading =14,
        leftIndent=0,
        rightIndent=0,
        spaceBefore = 12,
        spaceAfter =0
        )

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

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

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

def drawPageNumber(canvas, doc):
    pageNumber = canvas.getPageNumber()
    canvas.setFont("Arial",11)
    canvas.drawCentredString(17.4*cm, 1.35*cm, 'Page '+str(pageNumber))

def PageNumber(canvas, doc):
    return(canvas.getPageNumber())

header_center_text='header_center_text foo'
footer_center_text='footer_center_text bar'  


    
def create_deco():
    global header_content, footer_content
    '-----------------------------------------------------------------------------'
    'Header'
    '-----------------------------------------------------------------------------'
    Header_caption=((header_center_text))
    A='Author'
    Header_table_data=[['',Header_caption,'Author:',Paragraph(f"""<font fontSize=7> {A} </font>""")],
                       ['','','Date:','11.22.3333'],
                       ['','','Version:','123']]
    
    Header_table=Table(Header_table_data,colWidths=[4*cm,9.5*cm,1.6*cm,2.4*cm],rowHeights=[0.66*cm,0.66*cm,0.66*cm],style=[
    ('GRID',(0,0),(1,2),1,colors.black),
    #('ALIGN',(0,0),(1,0),'CENTER'),
    ('ALIGN',(0,0),(0,3),'CENTER'),
    ('VALIGN',(0,0),(3,2),'MIDDLE'),
    ('ALIGN',(2,0),(3,2),'RIGHT'),
    ('SPAN',(0,0),(0,2)),
    ('SPAN',(1,0),(1,2)),
    ('BOX',(2,0),(-1,-1),1,colors.black),
    #('TEXTCOLOR',(0,0),(3,0),colors.Color(49/255,71/255,137/255))
    ])
    '-----------------------------------------------------------------------------'
    'Footer'
    '-----------------------------------------------------------------------------'
    Footer_caption=(footer_center_text)
    Seitenzahl=''
    Footerer_ID=Seitenzahl
    
    Footer_table_data=[['',Footer_caption,Footerer_ID]]
    Footer_table=Table(Footer_table_data,colWidths=[4*cm,9.5*cm,4*cm],rowHeights=[1*cm],style=[
    ('GRID',(0,0),(2,0),1,colors.black),
    #('ALIGN',(0,0),(1,0),'CENTER'),
    ('ALIGN',(0,0),(-1,-1),'RIGHT'),
    ('VALIGN',(0,0),(2,0),'MIDDLE'),
    ('ALIGN',(0,0),(3,0),'CENTER'),
    #('TEXTCOLOR',(0,0),(3,0),colors.Color(49/255,71/255,137/255))
    ])
    
    footer_content = Footer_table
    header_content = Header_table
create_deco() 



'-----------------------------------------------------------------------------'
'Build story'
'-----------------------------------------------------------------------------'
# Build story.
story = []
toc = TableOfContents()
# For conciseness we use the same styles for headings and TOC entries
toc.levelStyles = [h1, h2]
story.append(Paragraph('This is my cover page where I wish I had no header and footer!', l0))
story.append(PageBreak())
story.append(Paragraph('TOC HERE', l0))
story.append(toc)
story.append(PageBreak())
story.append(Paragraph('First heading', h1))
story.append(Paragraph('Text in first heading', PS('body')))
story.append(Paragraph('First sub heading', h2))
story.append(Paragraph('Text in first sub heading', PS('body')))
story.append(PageBreak())
story.append(Paragraph('Second sub heading', h2))
story.append(Paragraph('Text in second sub heading', PS('body')))
story.append(Paragraph('Last heading', h1))

doc = MyDocTemplate('mintoc.pdf')
doc.multiBuild(story)
EN

回答 1

Stack Overflow用户

发布于 2021-12-17 09:08:44

我自己找到了一个解决办法,可能与之有关:

templates在类MyDocTemplate中定义。若要更改模板,请将story.append(NextPageTemplate('#YourTemplateHere'))插入到故事中,以下页面将使用此模板。

代码语言:javascript
运行
复制
from reportlab.lib.styles import ParagraphStyle as PS
from reportlab.platypus import PageBreak, Table, NextPageTemplate
from reportlab.platypus.paragraph import Paragraph
from reportlab.platypus.doctemplate import PageTemplate, BaseDocTemplate
from reportlab.platypus.tableofcontents import TableOfContents
from reportlab.platypus.frames import Frame
from reportlab.lib.units import cm
from reportlab.lib import colors
from functools import partial

class MyDocTemplate(BaseDocTemplate):

    def __init__(self, filename, **kw):
        self.allowSplitting = 0
        BaseDocTemplate.__init__(self, filename, **kw)

        template_CoverPage = PageTemplate('CoverPage',[Frame(1.75*cm, 2.5*cm, 17.5*cm, 24*cm, id='F1')],)
        template_NormalPage = PageTemplate('NormalPage',
                                [Frame(1.75*cm, 2.5*cm, 17.5*cm, 24*cm, id='F1')],
                                onPage=partial(header_and_footer,
                                header_content=header_content,
                                footer_content=footer_content))

        self.addPageTemplates([template_CoverPage,template_NormalPage])



    def afterFlowable(self, flowable):
        "Registers TOC entries."
        if flowable.__class__.__name__ == 'Paragraph':
            text = flowable.getPlainText()
            style = flowable.style.name
            if style == 'Heading1':
                self.notify('TOCEntry', (0, text, self.page))
            if style == 'Heading2':
                self.notify('TOCEntry', (1, text, self.page))

h1 = PS(name = 'Heading1',
       fontSize = 14,
       leading = 16)

h2 = PS(name = 'Heading2',
       fontSize = 12,
       leading = 14,
       leftIndent = 5)
l0 = PS(name = 'list0',
        fontSize = 12,
        leading =14,
        leftIndent=0,
        rightIndent=0,
        spaceBefore = 12,
        spaceAfter =0
        )

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

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

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

def drawPageNumber(canvas, doc):
    pageNumber = canvas.getPageNumber()
    canvas.setFont("Arial",11)
    canvas.drawCentredString(17.4*cm, 1.35*cm, 'Page '+str(pageNumber))

def PageNumber(canvas, doc):
    return(canvas.getPageNumber())

header_center_text='header_center_text foo'
footer_center_text='footer_center_text bar'  


    
def create_deco():
    global header_content, footer_content
    '-----------------------------------------------------------------------------'
    'Header'
    '-----------------------------------------------------------------------------'
    Header_caption=((header_center_text))
    A='Author'
    Header_table_data=[['',Header_caption,'Author:',Paragraph(f"""<font fontSize=7> {A} </font>""")],
                       ['','','Date:','11.22.3333'],
                       ['','','Version:','123']]
    
    Header_table=Table(Header_table_data,colWidths=[4*cm,9.5*cm,1.6*cm,2.4*cm],rowHeights=[0.66*cm,0.66*cm,0.66*cm],style=[
    ('GRID',(0,0),(1,2),1,colors.black),
    #('ALIGN',(0,0),(1,0),'CENTER'),
    ('ALIGN',(0,0),(0,3),'CENTER'),
    ('VALIGN',(0,0),(3,2),'MIDDLE'),
    ('ALIGN',(2,0),(3,2),'RIGHT'),
    ('SPAN',(0,0),(0,2)),
    ('SPAN',(1,0),(1,2)),
    ('BOX',(2,0),(-1,-1),1,colors.black),
    #('TEXTCOLOR',(0,0),(3,0),colors.Color(49/255,71/255,137/255))
    ])
    '-----------------------------------------------------------------------------'
    'Footer'
    '-----------------------------------------------------------------------------'
    Footer_caption=(footer_center_text)
    Seitenzahl=''
    Footerer_ID=Seitenzahl
    
    Footer_table_data=[['',Footer_caption,Footerer_ID]]
    Footer_table=Table(Footer_table_data,colWidths=[4*cm,9.5*cm,4*cm],rowHeights=[1*cm],style=[
    ('GRID',(0,0),(2,0),1,colors.black),
    #('ALIGN',(0,0),(1,0),'CENTER'),
    ('ALIGN',(0,0),(-1,-1),'RIGHT'),
    ('VALIGN',(0,0),(2,0),'MIDDLE'),
    ('ALIGN',(0,0),(3,0),'CENTER'),
    #('TEXTCOLOR',(0,0),(3,0),colors.Color(49/255,71/255,137/255))
    ])
    
    footer_content = Footer_table
    header_content = Header_table
create_deco() 



'-----------------------------------------------------------------------------'
'Build story'
'-----------------------------------------------------------------------------'
# Build story.
story = []
toc = TableOfContents()
# For conciseness we use the same styles for headings and TOC entries
toc.levelStyles = [h1, h2]
story.append(NextPageTemplate('CoverPage'))
story.append(Paragraph('This is my cover page where a different template is used!!!', l0))
story.append(NextPageTemplate('NormalPage'))
story.append(PageBreak())
story.append(Paragraph('TOC HERE', l0))
story.append(toc)
story.append(PageBreak())
story.append(Paragraph('First heading', h1))
story.append(Paragraph('Text in first heading', PS('body')))
story.append(Paragraph('First sub heading', h2))
story.append(Paragraph('Text in first sub heading', PS('body')))
story.append(PageBreak())
story.append(Paragraph('Second sub heading', h2))
story.append(Paragraph('Text in second sub heading', PS('body')))
story.append(Paragraph('Last heading', h1))


doc = MyDocTemplate('mintoc.pdf')
doc.multiBuild(story)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70382278

复制
相关文章

相似问题

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