annotate vendor/plugins/rfpdf/lib/fpdf/bookmark.rb @ 507:0c939c159af4 redmine-1.2

Update to Redmine 1.2.1 on 1.2-stable branch (Redmine SVN rev 6270)
author Chris Cannam
date Thu, 14 Jul 2011 10:32:19 +0100
parents cbce1fd3b1b7
children
rev   line source
Chris@0 1 # Translation of the bookmark class from the PHP FPDF script from Olivier Plathey
Chris@0 2 # Translated by Sylvain Lafleur and ?? with the help of Brian Ollenberger
Chris@0 3 #
Chris@0 4 # First added in 1.53b
Chris@0 5 #
Chris@0 6 # Usage is as follows:
Chris@0 7 #
Chris@0 8 # require 'fpdf'
Chris@0 9 # require 'bookmark'
Chris@0 10 # pdf = FPDF.new
Chris@0 11 # pdf.extend(PDF_Bookmark)
Chris@0 12 #
Chris@0 13 # This allows it to be combined with other extensions, such as the Chinese
Chris@0 14 # module.
Chris@0 15
Chris@0 16 module PDF_Bookmark
Chris@0 17 def PDF_Bookmark.extend_object(o)
Chris@0 18 o.instance_eval('@outlines,@OutlineRoot=[],0')
Chris@0 19 super(o)
Chris@0 20 end
Chris@0 21
Chris@0 22 def Bookmark(txt,level=0,y=0)
Chris@0 23 y=self.GetY() if y==-1
Chris@0 24 @outlines.push({'t'=>txt,'l'=>level,'y'=>y,'p'=>self.PageNo()})
Chris@0 25 end
Chris@0 26
Chris@0 27 def putbookmarks
Chris@0 28 @nb=@outlines.size
Chris@0 29 return if @nb==0
Chris@0 30 lru=[]
Chris@0 31 level=0
Chris@0 32 @outlines.each_index do |i|
Chris@0 33 o=@outlines[i]
Chris@0 34 if o['l']>0
Chris@0 35 parent=lru[o['l']-1]
Chris@0 36 # Set parent and last pointers
Chris@0 37 @outlines[i]['parent']=parent
Chris@0 38 @outlines[parent]['last']=i
Chris@0 39 if o['l']>level
Chris@0 40 # Level increasing: set first pointer
Chris@0 41 @outlines[parent]['first']=i
Chris@0 42 end
Chris@0 43 else
Chris@0 44 @outlines[i]['parent']=@nb
Chris@0 45 end
Chris@0 46 if o['l']<=level and i>0
Chris@0 47 # Set prev and next pointers
Chris@0 48 prev=lru[o['l']]
Chris@0 49 @outlines[prev]['next']=i
Chris@0 50 @outlines[i]['prev']=prev
Chris@0 51 end
Chris@0 52 lru[o['l']]=i
Chris@0 53 level=o['l']
Chris@0 54 end
Chris@0 55 # Outline items
Chris@0 56 n=@n+1
Chris@0 57 @outlines.each_index do |i|
Chris@0 58 o=@outlines[i]
Chris@0 59 newobj
Chris@0 60 out('<</Title '+(textstring(o['t'])))
Chris@0 61 out('/Parent '+(n+o['parent']).to_s+' 0 R')
Chris@0 62 if o['prev']
Chris@0 63 out('/Prev '+(n+o['prev']).to_s+' 0 R')
Chris@0 64 end
Chris@0 65 if o['next']
Chris@0 66 out('/Next '+(n+o['next']).to_s+' 0 R')
Chris@0 67 end
Chris@0 68 if o['first']
Chris@0 69 out('/First '+(n+o['first']).to_s+' 0 R')
Chris@0 70 end
Chris@0 71 if o['last']
Chris@0 72 out('/Last '+(n+o['last']).to_s+' 0 R')
Chris@0 73 end
Chris@0 74 out(sprintf('/Dest [%d 0 R /XYZ 0 %.2f
Chris@0 75 null]',1+2*o['p'],(@h-o['y'])*@k))
Chris@0 76 out('/Count 0>>')
Chris@0 77 out('endobj')
Chris@0 78 end
Chris@0 79 # Outline root
Chris@0 80 newobj
Chris@0 81 @OutlineRoot=@n
Chris@0 82 out('<</Type /Outlines /First '+n.to_s+' 0 R')
Chris@0 83 out('/Last '+(n+lru[0]).to_s+' 0 R>>')
Chris@0 84 out('endobj')
Chris@0 85 end
Chris@0 86
Chris@0 87 def putresources
Chris@0 88 super
Chris@0 89 putbookmarks
Chris@0 90 end
Chris@0 91
Chris@0 92 def putcatalog
Chris@0 93 super
Chris@0 94 if not @outlines.empty?
Chris@0 95 out('/Outlines '+@OutlineRoot.to_s+' 0 R')
Chris@0 96 out('/PageMode /UseOutlines')
Chris@0 97 end
Chris@0 98 end
Chris@0 99 end