[reportlab-users] build vs. multiBuild with TableOfContents()
    Sebastian Ware 
    sebastian at urbantalk.se
       
    Fri Oct 12 12:12:50 EDT 2007
    
    
  
I got it to work :) by adding the following custom class:
from reportlab.platypus.doctemplate import _doNothing, PageTemplate,  
BaseDocTemplate
from reportlab.platypus.frames import Frame
from reportlab.platypus import SimpleDocTemplate
class VisitDocTemplate(SimpleDocTemplate):
     "The document template used for all PDF documents."
     def afterFlowable(self, flowable):
         "Registers TOC entries and makes outline entries."
         if flowable.__class__.__name__ == 'Paragraph':
             styleName = flowable.style.name
             if styleName[:1] == 'h':
                 # Register TOC entries.
                 level = int(styleName[1:]) - 1
                 text = flowable.getPlainText()
                 pageNum = self.page
                 self.notify('TOCEntry', (level, text, pageNum))
                 # Add PDF outline entries (not really needed/tested  
here).
                 key = str(hash(flowable))
                 c = self.canv
                 c.bookmarkPage(key)
                 c.addOutlineEntry(text, key, level=level, closed=0)
     def multiBuild(self,flowables,onFirstPage=_doNothing,  
onLaterPages=_doNothing, canvasmaker=canvas.Canvas):
         """build the document using the flowables.  Annotate the  
first page using the onFirstPage
                function and later pages using the onLaterPages  
function.  The onXXX pages should follow
                the signature
                   def myOnFirstPage(canvas, document):
                       # do annotations and modify the document
                       ...
                The functions can do things like draw logos, page  
numbers,
                footers, etcetera. They can use external variables to  
vary
                the look (for example providing page numbering or  
section names).
         """
         self._calc()    #in case we changed margins sizes etc
         frameT = Frame(self.leftMargin, self.bottomMargin,  
self.width, self.height, id='normal')
         self.addPageTemplates([PageTemplate 
(id='First',frames=frameT, onPage=onFirstPage,pagesize=self.pagesize),
                         PageTemplate(id='Later',frames=frameT,  
onPage=onLaterPages,pagesize=self.pagesize)])
         if onFirstPage is _doNothing and hasattr(self,'onFirstPage'):
             self.pageTemplates[0].beforeDrawPage = self.onFirstPage
         if onLaterPages is _doNothing and hasattr(self,'onLaterPages'):
             self.pageTemplates[1].beforeDrawPage = self.onLaterPages
         BaseDocTemplate.multiBuild(self,flowables,  
canvasmaker=canvasmaker)
Mvh Sebastian
12 okt 2007 kl. 17.49 skrev Sebastian Ware:
> Hi!
>
> I am working to render my TableOfContents(). All I get is the  
> placeholder text.
>
> I can see from the test that you are using...
>
>   doc.multiBuild(story)
>
> ...whereas I have used (SimpleDocTemplate())...
>
>   doc.build(story, onFirstPage=self.myFirstPage,  
> onLaterPages=self.myLaterPages)
>
> Do I have to use multiBuild? And if so, how would I keep the  
> onFirstPage, onLaterPages behavior? (multiBuild doesn't take the  
> onFirstPage, onLaterPages parameters :( )
>
> Mvh Sebastian
>
> _______________________________________________
> reportlab-users mailing list
> reportlab-users at reportlab.com
> http://two.pairlist.net/mailman/listinfo/reportlab-users
    
    
More information about the reportlab-users
mailing list