0

私は最新のreportlabとdjangoであり、「TOCEntry」に通知する標準のカモノハシTOCは私のドキュメントに最適です。

現在、目次に「図のリスト」と「表のリスト」の2つのセクションを追加しようとしています。ドキュメント内のフローアブルh1、h2、テーブル、画像などは任意の順序で発生する可能性があるため、2つのリストをメインの目次から分離できないようです。理想的には、次のようなものが欲しいです。

Table of Content:

Heading1
  Sub1
  Sub2
Heading2
  Sub3
  Sub4
  Sub5

List of Figures:
  Figure1
  Figure2

List of Tables:
  Table1
  Table2

私が理解している限り、「TOCEntry」はルックアップされたタグであり、AfterFlowableを使用すると、実際のドキュメントに示されているのと同じ順序ですべてのフローアブルが配置されます。そして、これは私が望むものではありません。TOCを上記の描写のように見せるためのポインタをいただければ幸いです。

4

1 に答える 1

4

最も簡単なアプローチは、TOCをサブクラス化し、それらのafterFlowableキャッチャーをdocTemplateに追加することであると考えました。

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

     def afterFlowable(self, flowable):  
         "Registers TOC entries."  
         if flowable.__class__.__name__ == 'Paragraph':  
             text = flowable.getPlainText()  
             style = flowable.style.name  

             if style == 'reportHeading1':
                 toc_el = [ 0, text, self.page ] # basic elements
                 toc_bm = getattr(flowable, '_bookmarkName', None) # bookmark for links
                 if toc_bm: 
                     toc_el.append( toc_bm )
                 self.notify('TOCEntry', tuple(toc_el) )

             elif style == 'reportHeading2':  
                 toc_el = [ 1, text, self.page ] # basic elements
                 toc_bm = getattr(flowable, '_bookmarkName', None) # bookmark for links
                 if toc_bm: 
                     toc_el.append( toc_bm )
                 self.notify('TOCEntry', tuple(toc_el) )

             elif style == 'TableTitleStyle':
                 toc_el = [ 1, text, self.page ] # basic elements
                 toc_bm = getattr(flowable, '_bookmarkName', None) # bookmark for links
                 if toc_bm: 
                     toc_el.append( toc_bm )
                 self.notify('TOCTable', tuple(toc_el) )

             elif style == 'GraphicTitleStyle':
                 toc_el = [ 1, text, self.page ] # basic elements
                 toc_bm = getattr(flowable, '_bookmarkName', None) # bookmark for links
                 if toc_bm: 
                     toc_el.append( toc_bm )
                 self.notify('TOCFigure', tuple(toc_el) )

図と表の二次目次:

class ListOfFigures(TableOfContents):
    def notify(self, kind, stuff):
        """ The notification hook called to register all kinds of events.
            Here we are interested in 'Figure' events only.
        """
        if kind == 'TOCFigure':
            self.addEntry(*stuff)


class ListOfTables(TableOfContents):
    def notify(self, kind, stuff):
        """ The notification hook called to register all kinds of events.
            Here we are interested in 'Table' events only.
        """
        if kind == 'TOCTable':
            self.addEntry(*stuff)

そして最後に、ドキュメント生成プロセスです。標準の目次の後にListOfTablesとListOfFiguresのインスタンスを追加して、実際のpdfである程度関連しているように見せます。

于 2012-05-30T21:47:17.733 に答える