FattView/fpdf/attic/TOC.py


Home Back

from FPDF import *

class TOC(FPDF):
    def __init__(this, orientation='P',unit='mm',format='A4'):
        this._toc=[]
        this._numbering=0
        this._numberingFooter=0
        this._numPageNum=1
        FPDF.__init__(this,orientation,unit,format)

    def AddPage(this,orientation=''):
        FPDF.AddPage(this,orientation)
        if(this._numbering):
            this._numPageNum+=1

    def startPageNums(this):
        this._numbering=1
        this._numberingFooter=1

    def stopPageNums(this):
        this._numbering=0

    def numPageNo(this):
        return this._numPageNum

    def TOC_Entry(this,txt,level=0):
        this._toc+=[{'t':txt,'l':level,'p':this.numPageNo()}]

    def insertTOC(this,location=1,labelSize=20,entrySize=10,tocfont='Times',label='Table of Contents'):
        #make toc at end
        this.stopPageNums()
        this.AddPage()
        tocstart=this.page

        this.SetFont(tocfont,'B',labelSize)
        this.Cell(0,5,label,0,1,'C')
        this.Ln(10)

        for t in this._toc:
            #Offset
            level=t['l']
            if(level>0):
                this.Cell(level*8)
            weight=''
            if(level==0):
                weight='B'
            Str=t['t']
            this.SetFont(tocfont,weight,entrySize)
            strsize=this.GetStringWidth(Str)
            this.Cell(strsize+2,this.FontSize+2,Str)

            #Filling dots
            this.SetFont(tocfont,'',entrySize)
            PageCellSize=this.GetStringWidth(str(t['p']))+2
            w=this.w-this.lMargin-this.rMargin-PageCellSize-(level*8)-(strsize+2)
            nb=w/this.GetStringWidth('.')
            dots=str_repeat('.',nb)
            this.Cell(w,this.FontSize+2,dots,0,0,'R')

            #Page number
            this.Cell(PageCellSize,this.FontSize+2,str(t['p']),0,1,'R')

        #grab it and move to selected location
        n=this.page
        n_toc = n - tocstart + 1
        last = []

        #store toc pages
        for i in xrange(tocstart,n+1):
            last+=[this.pages[i]]

        #move pages
        for i in xrange(tocstart-1,location-1,-1):
        #~ for(i=tocstart - 1;i>=location-1;i--)
            this.pages[i+n_toc]=this.pages[i]

        #Put toc pages at insert point
        for i in xrange(0,n_toc):
            this.pages[location + i]=last[i]

    def Footer(this):
        if(this._numberingFooter==0):
            return
        #Go to 1.5 cm from bottom
        this.SetY(-15)
        #Select Arial italic 8
        this.SetFont('Arial','I',8)
        this.Cell(0,7,str(this.numPageNo()),0,0,'C');
        if(this._numbering==0):
            this._numberingFooter=0

Powered by Code, a simple repository browser by Fabio Di Matteo