从第一页删除页眉和页脚

Remove header and footer from 1st page

 class MyDocTemplate(BaseDocTemplate):
        def __init__(self, filename, **kw):
            self.allowSplitting = 0
            apply(BaseDocTemplate.__init__, (self, filename), kw)
            template = PageTemplate('normal', [Frame(1.0*cm, 1*cm, 19*cm, 27*cm, id='F1')])
            self.addPageTemplates(template)

        def afterFlowable(self, flowable):
            if flowable.__class__.__name__ == 'Paragraph':
            text = flowable.getPlainText()
            style = flowable.style.name
            if style == 'Heading1':
                level = 0
            elif style == 'Heading2':
                level = 1
            else:
                return
            E = [level, text, self.page]
    #if we have a bookmark name append that to our notify data
            bn = getattr(flowable,'_bookmarkName',None)
            if bn is not None:
                E.append(bn)
            self.notify('TOCEntry', tuple(E))

 class FooterCanvas(canvas.Canvas):

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

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

     def save(self):
         page_count = len(self.pages)
         for page in self.pages:
             self.__dict__.update(page)
             self.draw_canvas(page_count)
             canvas.Canvas.showPage(self)
         canvas.Canvas.save(self)

     def draw_canvas(self, page_count):
         page = "Page %s" % (self._pageNumber)
         self.saveState()
         self.setFont('Times-Roman', 10)
         self.line(40,23,560,23)
         self.drawString(280, 25, page)
         self.line(40, 810, 560, 810)
         self.drawString(40,813,"abc")
         self.restoreState()

如您所见,这将从 FooterCanvas class 创建 TOC 以及页眉和页脚,并且 FooterCanvas class 正在应用于所有页面,但我不希望它被应用到我的 pdf 的第一页。那么我该如何实现呢?

看来您只有一个PageTemplate。当我想要类似的控制时,我创建了两个单独的 PageTemplates,如下所示。

frontpage = PageTemplate(id='FrontPage', onPage=footer, frames=[]) 
backpage = PageTemplate(id='BackPage', onPage=header, frames=[])

MyDocTemplate.addPageTemplates(frontpage) MyDocTemplate.addPageTemplates(backpage)

在其他答案的帮助下,我找到了另一种方法。原来如此。

Frame1=Frame(x1,y1,width,height,id='F1')
Frame2=Frame(x1,y1,width,height,id='F2')

def FooterCanvas(canvas,doc):
    page = "Page %s" % (canvas._pageNumber)
    canvas.saveState()
    canvas.setFont('Times-Roman', 10)
    canvas.drawString(280, 15, page)
    canvas.restoreState()

class MyDocTemplate(BaseDocTemplate):
    def __init__(self, filename, **kw):
        self.allowSplitting = 0
        apply(BaseDocTemplate.__init__, (self, filename), kw)
        self.addPageTemplates([PageTemplate(id='firstPage',frames=Frame1),PageTemplate(id='allpages',frames=Frame2,onPage=FooterCanvas)
            ])

    def afterFlowable(self, flowable):
        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))

Story=[]
write your styles here and write your TOC styles. create TOC instance and add levels for TOC(levels are optional).

Story.append(NextPageTemplate('firstpage'))
First page with some paragraph or graphics.

Story.append(NextPageTemplate('allpages'))
Story.append(PageBreak())
Rest of the pages with some paragraph or graphics.

doc=MyDocTemplate("abc.pdf")
doc.multiBuild(Story)