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