Chris@0: # Translation of the bookmark class from the PHP FPDF script from Olivier Plathey Chris@0: # Translated by Sylvain Lafleur and ?? with the help of Brian Ollenberger Chris@0: # Chris@0: # First added in 1.53b Chris@0: # Chris@0: # Usage is as follows: Chris@0: # Chris@0: # require 'fpdf' Chris@0: # require 'bookmark' Chris@0: # pdf = FPDF.new Chris@0: # pdf.extend(PDF_Bookmark) Chris@0: # Chris@0: # This allows it to be combined with other extensions, such as the Chinese Chris@0: # module. Chris@0: Chris@0: module PDF_Bookmark Chris@0: def PDF_Bookmark.extend_object(o) Chris@0: o.instance_eval('@outlines,@OutlineRoot=[],0') Chris@0: super(o) Chris@0: end Chris@0: Chris@0: def Bookmark(txt,level=0,y=0) Chris@0: y=self.GetY() if y==-1 Chris@0: @outlines.push({'t'=>txt,'l'=>level,'y'=>y,'p'=>self.PageNo()}) Chris@0: end Chris@0: Chris@0: def putbookmarks Chris@0: @nb=@outlines.size Chris@0: return if @nb==0 Chris@0: lru=[] Chris@0: level=0 Chris@0: @outlines.each_index do |i| Chris@0: o=@outlines[i] Chris@0: if o['l']>0 Chris@0: parent=lru[o['l']-1] Chris@0: # Set parent and last pointers Chris@0: @outlines[i]['parent']=parent Chris@0: @outlines[parent]['last']=i Chris@0: if o['l']>level Chris@0: # Level increasing: set first pointer Chris@0: @outlines[parent]['first']=i Chris@0: end Chris@0: else Chris@0: @outlines[i]['parent']=@nb Chris@0: end Chris@0: if o['l']<=level and i>0 Chris@0: # Set prev and next pointers Chris@0: prev=lru[o['l']] Chris@0: @outlines[prev]['next']=i Chris@0: @outlines[i]['prev']=prev Chris@0: end Chris@0: lru[o['l']]=i Chris@0: level=o['l'] Chris@0: end Chris@0: # Outline items Chris@0: n=@n+1 Chris@0: @outlines.each_index do |i| Chris@0: o=@outlines[i] Chris@0: newobj Chris@0: out('<>') Chris@0: out('endobj') Chris@0: end Chris@0: # Outline root Chris@0: newobj Chris@0: @OutlineRoot=@n Chris@0: out('<>') Chris@0: out('endobj') Chris@0: end Chris@0: Chris@0: def putresources Chris@0: super Chris@0: putbookmarks Chris@0: end Chris@0: Chris@0: def putcatalog Chris@0: super Chris@0: if not @outlines.empty? Chris@0: out('/Outlines '+@OutlineRoot.to_s+' 0 R') Chris@0: out('/PageMode /UseOutlines') Chris@0: end Chris@0: end Chris@0: end