Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从第一页删除页眉和页脚_Python_Reportlab - Fatal编程技术网

Python 从第一页删除页眉和页脚

Python 从第一页删除页眉和页脚,python,reportlab,Python,Reportlab,如您所见,这将从FooterCanvas类创建TOC以及页眉和页脚,FooterCanvas类将应用于所有页面,但我不希望它应用于我的pdf的第一页。那么我如何才能做到这一点呢?看起来您只有一个页面模板。当我需要类似的控件时,我会创建两个单独的页面模板,如下所示 class MyDocTemplate(BaseDocTemplate): def __init__(self, filename, **kw): self.allowSplitting = 0

如您所见,这将从FooterCanvas类创建TOC以及页眉和页脚,FooterCanvas类将应用于所有页面,但我不希望它应用于我的pdf的第一页。那么我如何才能做到这一点呢?

看起来您只有一个页面模板。当我需要类似的控件时,我会创建两个单独的页面模板,如下所示

 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()

在其他答案的帮助下,我又找到了一种方法。就是这样

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

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

看起来您只有一个页面模板。当我想要类似的控件时,我会创建两个单独的页面模板,例如frontpage=PageTemplate(id='frontpage',onPage=footer,frames=[],)backpage=PageTemplate(id='BackPage',onPage=header,frames=[]MyDoctTemplate.addPageTemplates(frontpage)MyDoctTemplate.addPageTemplates(BackPage)它起作用了。@Jacoglad我可以帮忙,我已经把它作为答案发布了,请将它标记为帮助/解决方案。
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)