##// END OF EJS Templates
PDF: fix \\(double backslashes) handling of FPDF ANSI (#61, #117)....
Toshi MARUYAMA -
r5221:73a248530aa6
parent child
Show More
@@ -1,400 +1,398
1 # encoding: utf-8
1 # encoding: utf-8
2 #
2 #
3 # Redmine - project management software
3 # Redmine - project management software
4 # Copyright (C) 2006-2009 Jean-Philippe Lang
4 # Copyright (C) 2006-2009 Jean-Philippe Lang
5 #
5 #
6 # This program is free software; you can redistribute it and/or
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; either version 2
8 # as published by the Free Software Foundation; either version 2
9 # of the License, or (at your option) any later version.
9 # of the License, or (at your option) any later version.
10 #
10 #
11 # This program is distributed in the hope that it will be useful,
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
14 # GNU General Public License for more details.
15 #
15 #
16 # You should have received a copy of the GNU General Public License
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
19
20 require 'iconv'
20 require 'iconv'
21 require 'rfpdf/fpdf'
21 require 'rfpdf/fpdf'
22 require 'fpdf/chinese'
22 require 'fpdf/chinese'
23 require 'fpdf/japanese'
23 require 'fpdf/japanese'
24 require 'fpdf/korean'
24 require 'fpdf/korean'
25
25
26 module Redmine
26 module Redmine
27 module Export
27 module Export
28 module PDF
28 module PDF
29 include ActionView::Helpers::TextHelper
29 include ActionView::Helpers::TextHelper
30 include ActionView::Helpers::NumberHelper
30 include ActionView::Helpers::NumberHelper
31
31
32 class ITCPDF < TCPDF
32 class ITCPDF < TCPDF
33 include Redmine::I18n
33 include Redmine::I18n
34 attr_accessor :footer_date
34 attr_accessor :footer_date
35
35
36 def initialize(lang)
36 def initialize(lang)
37 super()
37 super()
38 set_language_if_valid lang
38 set_language_if_valid lang
39 @font_for_content = 'FreeSans'
39 @font_for_content = 'FreeSans'
40 @font_for_footer = 'FreeSans'
40 @font_for_footer = 'FreeSans'
41 SetCreator(Redmine::Info.app_name)
41 SetCreator(Redmine::Info.app_name)
42 SetFont(@font_for_content)
42 SetFont(@font_for_content)
43 end
43 end
44
44
45 def SetFontStyle(style, size)
45 def SetFontStyle(style, size)
46 SetFont(@font_for_content, style, size)
46 SetFont(@font_for_content, style, size)
47 end
47 end
48
48
49 def SetTitle(txt)
49 def SetTitle(txt)
50 txt = begin
50 txt = begin
51 utf16txt = Iconv.conv('UTF-16BE', 'UTF-8', txt)
51 utf16txt = Iconv.conv('UTF-16BE', 'UTF-8', txt)
52 hextxt = "<FEFF" # FEFF is BOM
52 hextxt = "<FEFF" # FEFF is BOM
53 hextxt << utf16txt.unpack("C*").map {|x| sprintf("%02X",x) }.join
53 hextxt << utf16txt.unpack("C*").map {|x| sprintf("%02X",x) }.join
54 hextxt << ">"
54 hextxt << ">"
55 rescue
55 rescue
56 txt
56 txt
57 end || ''
57 end || ''
58 super(txt)
58 super(txt)
59 end
59 end
60
60
61 def textstring(s)
61 def textstring(s)
62 # Format a text string
62 # Format a text string
63 if s =~ /^</ # This means the string is hex-dumped.
63 if s =~ /^</ # This means the string is hex-dumped.
64 return s
64 return s
65 else
65 else
66 return '('+escape(s)+')'
66 return '('+escape(s)+')'
67 end
67 end
68 end
68 end
69
69
70 alias RDMCell Cell
70 alias RDMCell Cell
71 alias RDMMultiCell MultiCell
71 alias RDMMultiCell MultiCell
72
72
73 def Footer
73 def Footer
74 SetFont(@font_for_footer, 'I', 8)
74 SetFont(@font_for_footer, 'I', 8)
75 SetY(-15)
75 SetY(-15)
76 SetX(15)
76 SetX(15)
77 RDMCell(0, 5, @footer_date, 0, 0, 'L')
77 RDMCell(0, 5, @footer_date, 0, 0, 'L')
78 SetY(-15)
78 SetY(-15)
79 SetX(-30)
79 SetX(-30)
80 RDMCell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
80 RDMCell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
81 end
81 end
82 end
82 end
83
83
84 class IFPDF < FPDF
84 class IFPDF < FPDF
85 include Redmine::I18n
85 include Redmine::I18n
86 attr_accessor :footer_date
86 attr_accessor :footer_date
87
87
88 def initialize(lang)
88 def initialize(lang)
89 super()
89 super()
90 set_language_if_valid lang
90 set_language_if_valid lang
91 case current_language.to_s.downcase
91 case current_language.to_s.downcase
92 when 'ko'
92 when 'ko'
93 extend(PDF_Korean)
93 extend(PDF_Korean)
94 AddUHCFont()
94 AddUHCFont()
95 @font_for_content = 'UHC'
95 @font_for_content = 'UHC'
96 @font_for_footer = 'UHC'
96 @font_for_footer = 'UHC'
97 when 'ja'
97 when 'ja'
98 extend(PDF_Japanese)
98 extend(PDF_Japanese)
99 AddSJISFont()
99 AddSJISFont()
100 @font_for_content = 'SJIS'
100 @font_for_content = 'SJIS'
101 @font_for_footer = 'SJIS'
101 @font_for_footer = 'SJIS'
102 when 'zh'
102 when 'zh'
103 extend(PDF_Chinese)
103 extend(PDF_Chinese)
104 AddGBFont()
104 AddGBFont()
105 @font_for_content = 'GB'
105 @font_for_content = 'GB'
106 @font_for_footer = 'GB'
106 @font_for_footer = 'GB'
107 when 'zh-tw'
107 when 'zh-tw'
108 extend(PDF_Chinese)
108 extend(PDF_Chinese)
109 AddBig5Font()
109 AddBig5Font()
110 @font_for_content = 'Big5'
110 @font_for_content = 'Big5'
111 @font_for_footer = 'Big5'
111 @font_for_footer = 'Big5'
112 else
112 else
113 @font_for_content = 'Arial'
113 @font_for_content = 'Arial'
114 @font_for_footer = 'Helvetica'
114 @font_for_footer = 'Helvetica'
115 end
115 end
116 SetCreator(Redmine::Info.app_name)
116 SetCreator(Redmine::Info.app_name)
117 SetFont(@font_for_content)
117 SetFont(@font_for_content)
118 end
118 end
119
119
120 def SetFontStyle(style, size)
120 def SetFontStyle(style, size)
121 SetFont(@font_for_content, style, size)
121 SetFont(@font_for_content, style, size)
122 end
122 end
123
123
124 def SetTitle(txt)
124 def SetTitle(txt)
125 txt = begin
125 txt = begin
126 utf16txt = Iconv.conv('UTF-16BE', 'UTF-8', txt)
126 utf16txt = Iconv.conv('UTF-16BE', 'UTF-8', txt)
127 hextxt = "<FEFF" # FEFF is BOM
127 hextxt = "<FEFF" # FEFF is BOM
128 hextxt << utf16txt.unpack("C*").map {|x| sprintf("%02X",x) }.join
128 hextxt << utf16txt.unpack("C*").map {|x| sprintf("%02X",x) }.join
129 hextxt << ">"
129 hextxt << ">"
130 rescue
130 rescue
131 txt
131 txt
132 end || ''
132 end || ''
133 super(txt)
133 super(txt)
134 end
134 end
135
135
136 def textstring(s)
136 def textstring(s)
137 # Format a text string
137 # Format a text string
138 if s =~ /^</ # This means the string is hex-dumped.
138 if s =~ /^</ # This means the string is hex-dumped.
139 return s
139 return s
140 else
140 else
141 return '('+escape(s)+')'
141 return '('+escape(s)+')'
142 end
142 end
143 end
143 end
144
144
145 def fix_text_encoding(txt)
145 def fix_text_encoding(txt)
146 @ic ||= Iconv.new(l(:general_pdf_encoding), 'UTF-8')
146 @ic ||= Iconv.new(l(:general_pdf_encoding), 'UTF-8')
147 txt = begin
147 txt = begin
148 # 0x5c char handling
148 @ic.iconv(txt)
149 txtar = txt.split('\\')
150 txtar << '' if txt[-1] == ?\\
151 txtar.collect {|x| @ic.iconv(x)}.join('\\').gsub(/\\/, "\\\\\\\\")
152 rescue
149 rescue
153 txt
150 txt
154 end || ''
151 end || ''
155 return txt
152 # 0x5c char handling
153 txt.gsub(/\\/, "\\\\\\\\")
156 end
154 end
157
155
158 def RDMCell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='')
156 def RDMCell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='')
159 Cell(w,h,fix_text_encoding(txt),border,ln,align,fill,link)
157 Cell(w,h,fix_text_encoding(txt),border,ln,align,fill,link)
160 end
158 end
161
159
162 def RDMMultiCell(w,h=0,txt='',border=0,align='',fill=0)
160 def RDMMultiCell(w,h=0,txt='',border=0,align='',fill=0)
163 MultiCell(w,h,fix_text_encoding(txt),border,align,fill)
161 MultiCell(w,h,fix_text_encoding(txt),border,align,fill)
164 end
162 end
165
163
166 def Footer
164 def Footer
167 SetFont(@font_for_footer, 'I', 8)
165 SetFont(@font_for_footer, 'I', 8)
168 SetY(-15)
166 SetY(-15)
169 SetX(15)
167 SetX(15)
170 RDMCell(0, 5, @footer_date, 0, 0, 'L')
168 RDMCell(0, 5, @footer_date, 0, 0, 'L')
171 SetY(-15)
169 SetY(-15)
172 SetX(-30)
170 SetX(-30)
173 RDMCell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
171 RDMCell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
174 end
172 end
175 alias alias_nb_pages AliasNbPages
173 alias alias_nb_pages AliasNbPages
176 end
174 end
177
175
178 # Returns a PDF string of a list of issues
176 # Returns a PDF string of a list of issues
179 def issues_to_pdf(issues, project, query)
177 def issues_to_pdf(issues, project, query)
180 if ( current_language.to_s.downcase == 'ko' ||
178 if ( current_language.to_s.downcase == 'ko' ||
181 current_language.to_s.downcase == 'ja' ||
179 current_language.to_s.downcase == 'ja' ||
182 current_language.to_s.downcase == 'zh' ||
180 current_language.to_s.downcase == 'zh' ||
183 current_language.to_s.downcase == 'zh-tw' ||
181 current_language.to_s.downcase == 'zh-tw' ||
184 current_language.to_s.downcase == 'th' )
182 current_language.to_s.downcase == 'th' )
185 pdf = IFPDF.new(current_language)
183 pdf = IFPDF.new(current_language)
186 else
184 else
187 pdf = ITCPDF.new(current_language)
185 pdf = ITCPDF.new(current_language)
188 end
186 end
189 title = query.new_record? ? l(:label_issue_plural) : query.name
187 title = query.new_record? ? l(:label_issue_plural) : query.name
190 title = "#{project} - #{title}" if project
188 title = "#{project} - #{title}" if project
191 pdf.SetTitle(title)
189 pdf.SetTitle(title)
192 pdf.alias_nb_pages
190 pdf.alias_nb_pages
193 pdf.footer_date = format_date(Date.today)
191 pdf.footer_date = format_date(Date.today)
194 pdf.AddPage("L")
192 pdf.AddPage("L")
195
193
196 row_height = 6
194 row_height = 6
197 col_width = []
195 col_width = []
198 unless query.columns.empty?
196 unless query.columns.empty?
199 col_width = query.columns.collect {|column| column.name == :subject ? 4.0 : 1.0 }
197 col_width = query.columns.collect {|column| column.name == :subject ? 4.0 : 1.0 }
200 ratio = 262.0 / col_width.inject(0) {|s,w| s += w}
198 ratio = 262.0 / col_width.inject(0) {|s,w| s += w}
201 col_width = col_width.collect {|w| w * ratio}
199 col_width = col_width.collect {|w| w * ratio}
202 end
200 end
203
201
204 # title
202 # title
205 pdf.SetFontStyle('B',11)
203 pdf.SetFontStyle('B',11)
206 pdf.RDMCell(190,10, title)
204 pdf.RDMCell(190,10, title)
207 pdf.Ln
205 pdf.Ln
208
206
209 # headers
207 # headers
210 pdf.SetFontStyle('B',8)
208 pdf.SetFontStyle('B',8)
211 pdf.SetFillColor(230, 230, 230)
209 pdf.SetFillColor(230, 230, 230)
212 pdf.RDMCell(15, row_height, "#", 1, 0, 'L', 1)
210 pdf.RDMCell(15, row_height, "#", 1, 0, 'L', 1)
213 query.columns.each_with_index do |column, i|
211 query.columns.each_with_index do |column, i|
214 pdf.RDMCell(col_width[i], row_height, column.caption, 1, 0, 'L', 1)
212 pdf.RDMCell(col_width[i], row_height, column.caption, 1, 0, 'L', 1)
215 end
213 end
216 pdf.Ln
214 pdf.Ln
217
215
218 # rows
216 # rows
219 pdf.SetFontStyle('',8)
217 pdf.SetFontStyle('',8)
220 pdf.SetFillColor(255, 255, 255)
218 pdf.SetFillColor(255, 255, 255)
221 previous_group = false
219 previous_group = false
222 issues.each do |issue|
220 issues.each do |issue|
223 if query.grouped? &&
221 if query.grouped? &&
224 (group = query.group_by_column.value(issue)) != previous_group
222 (group = query.group_by_column.value(issue)) != previous_group
225 pdf.SetFontStyle('B',9)
223 pdf.SetFontStyle('B',9)
226 pdf.RDMCell(277, row_height,
224 pdf.RDMCell(277, row_height,
227 (group.blank? ? 'None' : group.to_s) + " (#{query.issue_count_by_group[group]})",
225 (group.blank? ? 'None' : group.to_s) + " (#{query.issue_count_by_group[group]})",
228 1, 1, 'L')
226 1, 1, 'L')
229 pdf.SetFontStyle('',8)
227 pdf.SetFontStyle('',8)
230 previous_group = group
228 previous_group = group
231 end
229 end
232 pdf.RDMCell(15, row_height, issue.id.to_s, 1, 0, 'L', 1)
230 pdf.RDMCell(15, row_height, issue.id.to_s, 1, 0, 'L', 1)
233 query.columns.each_with_index do |column, i|
231 query.columns.each_with_index do |column, i|
234 s = if column.is_a?(QueryCustomFieldColumn)
232 s = if column.is_a?(QueryCustomFieldColumn)
235 cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id}
233 cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id}
236 show_value(cv)
234 show_value(cv)
237 else
235 else
238 value = issue.send(column.name)
236 value = issue.send(column.name)
239 if value.is_a?(Date)
237 if value.is_a?(Date)
240 format_date(value)
238 format_date(value)
241 elsif value.is_a?(Time)
239 elsif value.is_a?(Time)
242 format_time(value)
240 format_time(value)
243 else
241 else
244 value
242 value
245 end
243 end
246 end
244 end
247 pdf.RDMCell(col_width[i], row_height, s.to_s, 1, 0, 'L', 1)
245 pdf.RDMCell(col_width[i], row_height, s.to_s, 1, 0, 'L', 1)
248 end
246 end
249 pdf.Ln
247 pdf.Ln
250 end
248 end
251 if issues.size == Setting.issues_export_limit.to_i
249 if issues.size == Setting.issues_export_limit.to_i
252 pdf.SetFontStyle('B',10)
250 pdf.SetFontStyle('B',10)
253 pdf.RDMCell(0, row_height, '...')
251 pdf.RDMCell(0, row_height, '...')
254 end
252 end
255 pdf.Output
253 pdf.Output
256 end
254 end
257
255
258 # Returns a PDF string of a single issue
256 # Returns a PDF string of a single issue
259 def issue_to_pdf(issue)
257 def issue_to_pdf(issue)
260 if ( current_language.to_s.downcase == 'ko' ||
258 if ( current_language.to_s.downcase == 'ko' ||
261 current_language.to_s.downcase == 'ja' ||
259 current_language.to_s.downcase == 'ja' ||
262 current_language.to_s.downcase == 'zh' ||
260 current_language.to_s.downcase == 'zh' ||
263 current_language.to_s.downcase == 'zh-tw' ||
261 current_language.to_s.downcase == 'zh-tw' ||
264 current_language.to_s.downcase == 'th' )
262 current_language.to_s.downcase == 'th' )
265 pdf = IFPDF.new(current_language)
263 pdf = IFPDF.new(current_language)
266 else
264 else
267 pdf = ITCPDF.new(current_language)
265 pdf = ITCPDF.new(current_language)
268 end
266 end
269 pdf.SetTitle("#{issue.project} - ##{issue.tracker} #{issue.id}")
267 pdf.SetTitle("#{issue.project} - ##{issue.tracker} #{issue.id}")
270 pdf.alias_nb_pages
268 pdf.alias_nb_pages
271 pdf.footer_date = format_date(Date.today)
269 pdf.footer_date = format_date(Date.today)
272 pdf.AddPage
270 pdf.AddPage
273
271
274 pdf.SetFontStyle('B',11)
272 pdf.SetFontStyle('B',11)
275 pdf.RDMCell(190,10,
273 pdf.RDMCell(190,10,
276 "#{issue.project} - #{issue.tracker} # #{issue.id}: #{issue.subject}")
274 "#{issue.project} - #{issue.tracker} # #{issue.id}: #{issue.subject}")
277 pdf.Ln
275 pdf.Ln
278
276
279 y0 = pdf.GetY
277 y0 = pdf.GetY
280
278
281 pdf.SetFontStyle('B',9)
279 pdf.SetFontStyle('B',9)
282 pdf.RDMCell(35,5, l(:field_status) + ":","LT")
280 pdf.RDMCell(35,5, l(:field_status) + ":","LT")
283 pdf.SetFontStyle('',9)
281 pdf.SetFontStyle('',9)
284 pdf.RDMCell(60,5, issue.status.to_s,"RT")
282 pdf.RDMCell(60,5, issue.status.to_s,"RT")
285 pdf.SetFontStyle('B',9)
283 pdf.SetFontStyle('B',9)
286 pdf.RDMCell(35,5, l(:field_priority) + ":","LT")
284 pdf.RDMCell(35,5, l(:field_priority) + ":","LT")
287 pdf.SetFontStyle('',9)
285 pdf.SetFontStyle('',9)
288 pdf.RDMCell(60,5, issue.priority.to_s,"RT")
286 pdf.RDMCell(60,5, issue.priority.to_s,"RT")
289 pdf.Ln
287 pdf.Ln
290
288
291 pdf.SetFontStyle('B',9)
289 pdf.SetFontStyle('B',9)
292 pdf.RDMCell(35,5, l(:field_author) + ":","L")
290 pdf.RDMCell(35,5, l(:field_author) + ":","L")
293 pdf.SetFontStyle('',9)
291 pdf.SetFontStyle('',9)
294 pdf.RDMCell(60,5, issue.author.to_s,"R")
292 pdf.RDMCell(60,5, issue.author.to_s,"R")
295 pdf.SetFontStyle('B',9)
293 pdf.SetFontStyle('B',9)
296 pdf.RDMCell(35,5, l(:field_category) + ":","L")
294 pdf.RDMCell(35,5, l(:field_category) + ":","L")
297 pdf.SetFontStyle('',9)
295 pdf.SetFontStyle('',9)
298 pdf.RDMCell(60,5, issue.category.to_s,"R")
296 pdf.RDMCell(60,5, issue.category.to_s,"R")
299 pdf.Ln
297 pdf.Ln
300
298
301 pdf.SetFontStyle('B',9)
299 pdf.SetFontStyle('B',9)
302 pdf.RDMCell(35,5, l(:field_created_on) + ":","L")
300 pdf.RDMCell(35,5, l(:field_created_on) + ":","L")
303 pdf.SetFontStyle('',9)
301 pdf.SetFontStyle('',9)
304 pdf.RDMCell(60,5, format_date(issue.created_on),"R")
302 pdf.RDMCell(60,5, format_date(issue.created_on),"R")
305 pdf.SetFontStyle('B',9)
303 pdf.SetFontStyle('B',9)
306 pdf.RDMCell(35,5, l(:field_assigned_to) + ":","L")
304 pdf.RDMCell(35,5, l(:field_assigned_to) + ":","L")
307 pdf.SetFontStyle('',9)
305 pdf.SetFontStyle('',9)
308 pdf.RDMCell(60,5, issue.assigned_to.to_s,"R")
306 pdf.RDMCell(60,5, issue.assigned_to.to_s,"R")
309 pdf.Ln
307 pdf.Ln
310
308
311 pdf.SetFontStyle('B',9)
309 pdf.SetFontStyle('B',9)
312 pdf.RDMCell(35,5, l(:field_updated_on) + ":","LB")
310 pdf.RDMCell(35,5, l(:field_updated_on) + ":","LB")
313 pdf.SetFontStyle('',9)
311 pdf.SetFontStyle('',9)
314 pdf.RDMCell(60,5, format_date(issue.updated_on),"RB")
312 pdf.RDMCell(60,5, format_date(issue.updated_on),"RB")
315 pdf.SetFontStyle('B',9)
313 pdf.SetFontStyle('B',9)
316 pdf.RDMCell(35,5, l(:field_due_date) + ":","LB")
314 pdf.RDMCell(35,5, l(:field_due_date) + ":","LB")
317 pdf.SetFontStyle('',9)
315 pdf.SetFontStyle('',9)
318 pdf.RDMCell(60,5, format_date(issue.due_date),"RB")
316 pdf.RDMCell(60,5, format_date(issue.due_date),"RB")
319 pdf.Ln
317 pdf.Ln
320
318
321 for custom_value in issue.custom_field_values
319 for custom_value in issue.custom_field_values
322 pdf.SetFontStyle('B',9)
320 pdf.SetFontStyle('B',9)
323 pdf.RDMCell(35,5, custom_value.custom_field.name + ":","L")
321 pdf.RDMCell(35,5, custom_value.custom_field.name + ":","L")
324 pdf.SetFontStyle('',9)
322 pdf.SetFontStyle('',9)
325 pdf.RDMMultiCell(155,5, (show_value custom_value),"R")
323 pdf.RDMMultiCell(155,5, (show_value custom_value),"R")
326 end
324 end
327
325
328 pdf.SetFontStyle('B',9)
326 pdf.SetFontStyle('B',9)
329 pdf.RDMCell(35,5, l(:field_subject) + ":","LTB")
327 pdf.RDMCell(35,5, l(:field_subject) + ":","LTB")
330 pdf.SetFontStyle('',9)
328 pdf.SetFontStyle('',9)
331 pdf.RDMCell(155,5, issue.subject,"RTB")
329 pdf.RDMCell(155,5, issue.subject,"RTB")
332 pdf.Ln
330 pdf.Ln
333
331
334 pdf.SetFontStyle('B',9)
332 pdf.SetFontStyle('B',9)
335 pdf.RDMCell(35,5, l(:field_description) + ":")
333 pdf.RDMCell(35,5, l(:field_description) + ":")
336 pdf.SetFontStyle('',9)
334 pdf.SetFontStyle('',9)
337 pdf.RDMMultiCell(155,5, issue.description.to_s,"BR")
335 pdf.RDMMultiCell(155,5, issue.description.to_s,"BR")
338
336
339 pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
337 pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
340 pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
338 pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
341 pdf.Ln
339 pdf.Ln
342
340
343 if issue.changesets.any? &&
341 if issue.changesets.any? &&
344 User.current.allowed_to?(:view_changesets, issue.project)
342 User.current.allowed_to?(:view_changesets, issue.project)
345 pdf.SetFontStyle('B',9)
343 pdf.SetFontStyle('B',9)
346 pdf.RDMCell(190,5, l(:label_associated_revisions), "B")
344 pdf.RDMCell(190,5, l(:label_associated_revisions), "B")
347 pdf.Ln
345 pdf.Ln
348 for changeset in issue.changesets
346 for changeset in issue.changesets
349 pdf.SetFontStyle('B',8)
347 pdf.SetFontStyle('B',8)
350 pdf.RDMCell(190,5,
348 pdf.RDMCell(190,5,
351 format_time(changeset.committed_on) + " - " + changeset.author.to_s)
349 format_time(changeset.committed_on) + " - " + changeset.author.to_s)
352 pdf.Ln
350 pdf.Ln
353 unless changeset.comments.blank?
351 unless changeset.comments.blank?
354 pdf.SetFontStyle('',8)
352 pdf.SetFontStyle('',8)
355 pdf.RDMMultiCell(190,5, changeset.comments.to_s)
353 pdf.RDMMultiCell(190,5, changeset.comments.to_s)
356 end
354 end
357 pdf.Ln
355 pdf.Ln
358 end
356 end
359 end
357 end
360
358
361 pdf.SetFontStyle('B',9)
359 pdf.SetFontStyle('B',9)
362 pdf.RDMCell(190,5, l(:label_history), "B")
360 pdf.RDMCell(190,5, l(:label_history), "B")
363 pdf.Ln
361 pdf.Ln
364 for journal in issue.journals.find(
362 for journal in issue.journals.find(
365 :all, :include => [:user, :details],
363 :all, :include => [:user, :details],
366 :order => "#{Journal.table_name}.created_on ASC")
364 :order => "#{Journal.table_name}.created_on ASC")
367 pdf.SetFontStyle('B',8)
365 pdf.SetFontStyle('B',8)
368 pdf.RDMCell(190,5,
366 pdf.RDMCell(190,5,
369 format_time(journal.created_on) + " - " + journal.user.name)
367 format_time(journal.created_on) + " - " + journal.user.name)
370 pdf.Ln
368 pdf.Ln
371 pdf.SetFontStyle('I',8)
369 pdf.SetFontStyle('I',8)
372 for detail in journal.details
370 for detail in journal.details
373 pdf.RDMCell(190,5, "- " + show_detail(detail, true))
371 pdf.RDMCell(190,5, "- " + show_detail(detail, true))
374 pdf.Ln
372 pdf.Ln
375 end
373 end
376 if journal.notes?
374 if journal.notes?
377 pdf.SetFontStyle('',8)
375 pdf.SetFontStyle('',8)
378 pdf.RDMMultiCell(190,5, journal.notes.to_s)
376 pdf.RDMMultiCell(190,5, journal.notes.to_s)
379 end
377 end
380 pdf.Ln
378 pdf.Ln
381 end
379 end
382
380
383 if issue.attachments.any?
381 if issue.attachments.any?
384 pdf.SetFontStyle('B',9)
382 pdf.SetFontStyle('B',9)
385 pdf.RDMCell(190,5, l(:label_attachment_plural), "B")
383 pdf.RDMCell(190,5, l(:label_attachment_plural), "B")
386 pdf.Ln
384 pdf.Ln
387 for attachment in issue.attachments
385 for attachment in issue.attachments
388 pdf.SetFontStyle('',8)
386 pdf.SetFontStyle('',8)
389 pdf.RDMCell(80,5, attachment.filename)
387 pdf.RDMCell(80,5, attachment.filename)
390 pdf.RDMCell(20,5, number_to_human_size(attachment.filesize),0,0,"R")
388 pdf.RDMCell(20,5, number_to_human_size(attachment.filesize),0,0,"R")
391 pdf.RDMCell(25,5, format_date(attachment.created_on),0,0,"R")
389 pdf.RDMCell(25,5, format_date(attachment.created_on),0,0,"R")
392 pdf.RDMCell(65,5, attachment.author.name,0,0,"R")
390 pdf.RDMCell(65,5, attachment.author.name,0,0,"R")
393 pdf.Ln
391 pdf.Ln
394 end
392 end
395 end
393 end
396 pdf.Output
394 pdf.Output
397 end
395 end
398 end
396 end
399 end
397 end
400 end
398 end
General Comments 0
You need to be logged in to leave comments. Login now