[reportlab-users] User Guidance Required

Prabhakar Moka prabhakarmoka at gmail.com
Wed Oct 12 12:02:20 EDT 2016


Hi All,



I am using ReportLab 2.7 with Python 2.7.  I am able to  create a pdf with
clickable bookmarks in the table of contents (toc) and  created a pdf with
"x of y" page numbering also. Here my problem is  bookmarkpage(key) appears
to break when I try to do both. Only *FooterCanvas *is working for me.  And
also you check the below code snippet which was failed.



Could someone please help me to resolve this?



I really appreciate any help you can provide.



Regards,

Prabhakar







*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 of %s" % (self._pageNumber, page_count)

        x = 128

        self.saveState()

        self.setStrokeColorRGB(0, 0, 0)

        self.setLineWidth(0.5)

        self.line(66, 78, LETTER[0] - 66, 78)

        self.setFont('Times-Roman', 10)

        self.drawString(LETTER[0]-x, 65, page)

        self.restoreState()





*class MyDocTemplate(BaseDocTemplate):*

    def __init__(self, filename, **kw):

        self.allowSplitting = 0

        apply(BaseDocTemplate.__init__, (self, filename), kw)

        template = PageTemplate('normal', [Frame(2.5*cm, 2.5*cm, 15*cm,
25*cm, id='F1')])

        self.addPageTemplates(template)



    # Entries to the table of contents can be done either manually by

    # calling the addEntry method on the TableOfContents object or
automatically

    # by sending a 'TOCEntry' notification in the afterFlowable method of

    # the DocTemplate you are using. The data to be passed to notify is a
list

    # of three or four items countaining a level number, the entry text,
the page

    # number and an optional destination key which the entry should point
to.

    # This list will usually be created in a document template's method like

    # afterFlowable(), making notification calls using the notify() method

    # with appropriate data.



    def afterFlowable(self, flowable):

        "Registers TOC entries."

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



centered = PS(name = 'centered', fontSize = 30,leading = 16, alignment =
1,spaceAfter = 20)



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

h2 = PS(name = 'Heading2',fontSize = 12,leading = 14)





# Build story.

story = []



# Create an instance of TableOfContents. Override the level styles
(optional)

# and add the object to the story



toc = TableOfContents()

toc.levelStyles = [

    PS(fontName='Times-Bold', fontSize=20, name='TOCHeading1',
leftIndent=20, firstLineIndent=-20, spaceBefore=10, leading=16),

    PS(fontSize=18, name='TOCHeading2', leftIndent=40, firstLineIndent=-20,
spaceBefore=5, leading=12),

]

story.append(Paragraph('<b>Table of contents</b>', centered))

story.append(toc)





#this function makes our headings

def doHeading(text,sty):

    from hashlib import sha1

    #create bookmarkname

    bn=sha1(text+sty.name).hexdigest()

    #modify paragraph text to include an anchor point with name bn

    h=Paragraph(text+'<a name="%s"/>' % bn,sty)

    #store the bookmark name on the flowable so afterFlowable can see this

    h._bookmarkName=bn

    story.append(h)



#story.append(Paragraph('<b>Table of contents</b>', centered))

story.append(PageBreak())

doHeading('First heading', h1)

story.append(Paragraph('Text in first heading', PS('body')))

doHeading('First sub heading', h2)

story.append(Paragraph('Text in first sub heading', PS('body')))

story.append(PageBreak())

doHeading('Second sub heading', h2)

story.append(Paragraph('Text in second sub heading', PS('body')))

story.append(PageBreak())

doHeading('Last heading', h1)

story.append(Paragraph('Text in last heading', PS('body')))

doc = MyDocTemplate('mintoc.pdf')

*doc.multiBuild(story, canvasmaker = FooterCanvas)*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist2.pair.net/pipermail/reportlab-users/attachments/20161012/15c651fd/attachment-0001.html>


More information about the reportlab-users mailing list