summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2012-01-30 18:01:47 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2012-01-30 18:01:47 +0000
commita749e788abd910c37e98528c4d8c026667810ea3 (patch)
treeef8d683edc1a2af684a97de6d044c32fb77a01bf
parent967e6413e5104ed80f5474ae73f8c2b2752d06f0 (diff)
downloadredmine-a749e788abd910c37e98528c4d8c026667810ea3.tar.gz
redmine-a749e788abd910c37e98528c4d8c026667810ea3.zip
Adds bookmarks to PDF when exporting a grouped issue list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@8732 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--lib/redmine/export/pdf.rb87
1 files changed, 84 insertions, 3 deletions
diff --git a/lib/redmine/export/pdf.rb b/lib/redmine/export/pdf.rb
index b9efd1a33..f59ff5461 100644
--- a/lib/redmine/export/pdf.rb
+++ b/lib/redmine/export/pdf.rb
@@ -76,6 +76,8 @@ module Redmine
end
SetCreator(Redmine::Info.app_name)
SetFont(@font_for_content)
+ @outlines = []
+ @outlineRoot = nil
end
def SetFontStyle(style, size)
@@ -142,6 +144,84 @@ module Redmine
SetX(-30)
RDMCell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
end
+
+ def Bookmark(txt, level=0, y=0)
+ utf16 = Iconv.conv('UTF-16', 'UTF-8', txt)
+ if (y == -1)
+ y = GetY()
+ end
+ @outlines << {:t => utf16, :l => level, :p => PageNo(), :y => (@h - y)*@k}
+ end
+
+ def putbookmarks
+ nb=@outlines.size
+ return if (nb==0)
+ lru=[]
+ level=0
+ @outlines.each_with_index do |o, i|
+ if(o[:l]>0)
+ parent=lru[o[:l]-1]
+ #Set parent and last pointers
+ @outlines[i][:parent]=parent
+ @outlines[parent][:last]=i
+ if (o[:l]>level)
+ #Level increasing: set first pointer
+ @outlines[parent][:first]=i
+ end
+ else
+ @outlines[i][:parent]=nb
+ end
+ if (o[:l]<=level && i>0)
+ #Set prev and next pointers
+ prev=lru[o[:l]]
+ @outlines[prev][:next]=i
+ @outlines[i][:prev]=prev
+ end
+ lru[o[:l]]=i
+ level=o[:l]
+ end
+ #Outline items
+ n=self.n+1
+ @outlines.each_with_index do |o, i|
+ newobj()
+ out('<</Title '+textstring(o[:t]))
+ out("/Parent #{n+o[:parent]} 0 R")
+ if (o[:prev])
+ out("/Prev #{n+o[:prev]} 0 R")
+ end
+ if (o[:next])
+ out("/Next #{n+o[:next]} 0 R")
+ end
+ if (o[:first])
+ out("/First #{n+o[:first]} 0 R")
+ end
+ if (o[:last])
+ out("/Last #{n+o[:last]} 0 R")
+ end
+ out("/Dest [%d 0 R /XYZ 0 %.2f null]" % [1+2*o[:p], o[:y]])
+ out('/Count 0>>')
+ out('endobj')
+ end
+ #Outline root
+ newobj()
+ @outlineRoot=self.n
+ out("<</Type /Outlines /First #{n} 0 R");
+ out("/Last #{n+lru[0]} 0 R>>");
+ out('endobj');
+ end
+
+ def putresources()
+ super
+ putbookmarks()
+ end
+
+ def putcatalog()
+ super
+ if(@outlines.size > 0)
+ out("/Outlines #{@outlineRoot} 0 R");
+ out('/PageMode /UseOutlines');
+ end
+ end
end
# Returns a PDF string of a list of issues
@@ -205,9 +285,10 @@ module Redmine
if query.grouped? &&
(group = query.group_by_column.value(issue)) != previous_group
pdf.SetFontStyle('B',9)
- pdf.RDMCell(277, row_height,
- (group.blank? ? 'None' : group.to_s) + " (#{query.issue_count_by_group[group]})",
- 1, 1, 'L')
+ group_label = group.blank? ? 'None' : group.to_s
+ group_label << " (#{query.issue_count_by_group[group]})"
+ pdf.Bookmark group_label, 0, -1
+ pdf.RDMCell(277, row_height, group_label, 1, 1, 'L')
pdf.SetFontStyle('',8)
previous_group = group
end