##// END OF EJS Templates
Merged r14888 from trunk to 3.0-stable (#21328)...
Toshi MARUYAMA -
r14542:741a967a4677
parent child
Show More
@@ -1,152 +1,152
1 # encoding: utf-8
1 # encoding: utf-8
2 #
2 #
3 # Redmine - project management software
3 # Redmine - project management software
4 # Copyright (C) 2006-2015 Jean-Philippe Lang
4 # Copyright (C) 2006-2015 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 'rbpdf'
20 require 'rbpdf'
21
21
22 module Redmine
22 module Redmine
23 module Export
23 module Export
24 module PDF
24 module PDF
25 class ITCPDF < RBPDF
25 class ITCPDF < RBPDF
26 include Redmine::I18n
26 include Redmine::I18n
27 attr_accessor :footer_date
27 attr_accessor :footer_date
28
28
29 def initialize(lang, orientation='P')
29 def initialize(lang, orientation='P')
30 @@k_path_cache = Rails.root.join('tmp', 'pdf')
30 @@k_path_cache = Rails.root.join('tmp', 'pdf')
31 FileUtils.mkdir_p @@k_path_cache unless File::exist?(@@k_path_cache)
31 FileUtils.mkdir_p @@k_path_cache unless File::exist?(@@k_path_cache)
32 set_language_if_valid lang
32 set_language_if_valid lang
33 super(orientation, 'mm', 'A4')
33 super(orientation, 'mm', 'A4')
34 set_print_header(false)
34 set_print_header(false)
35 set_rtl(l(:direction) == 'rtl')
35 set_rtl(l(:direction) == 'rtl')
36
36
37 @font_for_content = l(:general_pdf_fontname)
37 @font_for_content = l(:general_pdf_fontname)
38 @font_for_footer = l(:general_pdf_fontname)
38 @font_for_footer = l(:general_pdf_fontname)
39 set_creator(Redmine::Info.app_name)
39 set_creator(Redmine::Info.app_name)
40 set_font(@font_for_content)
40 set_font(@font_for_content)
41
41
42 set_header_font([@font_for_content, '', 10])
42 set_header_font([@font_for_content, '', 10])
43 set_footer_font([@font_for_content, '', 8])
43 set_footer_font([@font_for_content, '', 8])
44 set_default_monospaced_font(@font_for_content)
44 set_default_monospaced_font(@font_for_content)
45 end
45 end
46
46
47 def SetFontStyle(style, size)
47 def SetFontStyle(style, size)
48 set_font(@font_for_content, style, size)
48 set_font(@font_for_content, style, size)
49 end
49 end
50
50
51 def SetFont(family, style='', size=0, fontfile='')
51 def SetFont(family, style='', size=0, fontfile='')
52 # FreeSerif Bold Thai font has problem.
52 # FreeSerif Bold Thai font has problem.
53 style.delete!('B') if l(:general_pdf_fontname) == 'freeserif'
53 style.delete!('B') if l(:general_pdf_fontname) == 'freeserif'
54 # DejaVuSans Italic Arabic and Persian font has problem.
54 # DejaVuSans Italic Arabic and Persian font has problem.
55 style.delete!('I') if l(:general_pdf_fontname) == 'DejaVuSans'
55 style.delete!('I') if l(:general_pdf_fontname) == 'DejaVuSans' && current_language.to_s.casecmp("vi") != 0
56 super(family, style, size, fontfile)
56 super(family, style, size, fontfile)
57 end
57 end
58 alias_method :set_font, :SetFont
58 alias_method :set_font, :SetFont
59
59
60 def fix_text_encoding(txt)
60 def fix_text_encoding(txt)
61 RDMPdfEncoding::rdm_from_utf8(txt, "UTF-8")
61 RDMPdfEncoding::rdm_from_utf8(txt, "UTF-8")
62 end
62 end
63
63
64 def formatted_text(text)
64 def formatted_text(text)
65 Redmine::WikiFormatting.to_html(Setting.text_formatting, text)
65 Redmine::WikiFormatting.to_html(Setting.text_formatting, text)
66 end
66 end
67
67
68 def RDMCell(w ,h=0, txt='', border=0, ln=0, align='', fill=0, link='')
68 def RDMCell(w ,h=0, txt='', border=0, ln=0, align='', fill=0, link='')
69 cell(w, h, txt, border, ln, align, fill, link)
69 cell(w, h, txt, border, ln, align, fill, link)
70 end
70 end
71
71
72 def RDMMultiCell(w, h=0, txt='', border=0, align='', fill=0, ln=1)
72 def RDMMultiCell(w, h=0, txt='', border=0, align='', fill=0, ln=1)
73 multi_cell(w, h, txt, border, align, fill, ln)
73 multi_cell(w, h, txt, border, align, fill, ln)
74 end
74 end
75
75
76 def RDMwriteFormattedCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
76 def RDMwriteFormattedCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
77 @attachments = attachments
77 @attachments = attachments
78
78
79 css_tag = ' <style>
79 css_tag = ' <style>
80 table, td {
80 table, td {
81 border: 2px #ff0000 solid;
81 border: 2px #ff0000 solid;
82 }
82 }
83 th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; text-align: center; font-style: bold;}
83 th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; text-align: center; font-style: bold;}
84 pre {
84 pre {
85 background-color: #fafafa;
85 background-color: #fafafa;
86 }
86 }
87 </style>'
87 </style>'
88
88
89 # Strip {{toc}} tags
89 # Strip {{toc}} tags
90 txt.gsub!(/<p>\{\{([<>]?)toc\}\}<\/p>/i, '')
90 txt.gsub!(/<p>\{\{([<>]?)toc\}\}<\/p>/i, '')
91 writeHTMLCell(w, h, x, y, css_tag + txt, border, ln, fill)
91 writeHTMLCell(w, h, x, y, css_tag + txt, border, ln, fill)
92 end
92 end
93
93
94 def RDMwriteHTMLCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
94 def RDMwriteHTMLCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
95 txt = formatted_text(txt)
95 txt = formatted_text(txt)
96 RDMwriteFormattedCell(w, h, x, y, txt, attachments, border, ln, fill)
96 RDMwriteFormattedCell(w, h, x, y, txt, attachments, border, ln, fill)
97 end
97 end
98
98
99 def get_image_filename(attrname)
99 def get_image_filename(attrname)
100 atta = RDMPdfEncoding.attach(@attachments, attrname, "UTF-8")
100 atta = RDMPdfEncoding.attach(@attachments, attrname, "UTF-8")
101 if atta
101 if atta
102 return atta.diskfile
102 return atta.diskfile
103 else
103 else
104 return nil
104 return nil
105 end
105 end
106 end
106 end
107
107
108 def get_sever_url(url)
108 def get_sever_url(url)
109 if !empty_string(url) and (url[0, 1] == '/')
109 if !empty_string(url) and (url[0, 1] == '/')
110 Setting.host_name.split('/')[0] + url
110 Setting.host_name.split('/')[0] + url
111 else
111 else
112 url
112 url
113 end
113 end
114 end
114 end
115
115
116 def Footer
116 def Footer
117 set_font(@font_for_footer, 'I', 8)
117 set_font(@font_for_footer, 'I', 8)
118 set_x(15)
118 set_x(15)
119 if get_rtl
119 if get_rtl
120 RDMCell(0, 5, @footer_date, 0, 0, 'R')
120 RDMCell(0, 5, @footer_date, 0, 0, 'R')
121 else
121 else
122 RDMCell(0, 5, @footer_date, 0, 0, 'L')
122 RDMCell(0, 5, @footer_date, 0, 0, 'L')
123 end
123 end
124 set_x(-30)
124 set_x(-30)
125 RDMCell(0, 5, get_alias_num_page() + '/' + get_alias_nb_pages(), 0, 0, 'C')
125 RDMCell(0, 5, get_alias_num_page() + '/' + get_alias_nb_pages(), 0, 0, 'C')
126 end
126 end
127 end
127 end
128
128
129 class RDMPdfEncoding
129 class RDMPdfEncoding
130 def self.rdm_from_utf8(txt, encoding)
130 def self.rdm_from_utf8(txt, encoding)
131 txt ||= ''
131 txt ||= ''
132 txt = Redmine::CodesetUtil.from_utf8(txt, encoding)
132 txt = Redmine::CodesetUtil.from_utf8(txt, encoding)
133 txt.force_encoding('ASCII-8BIT')
133 txt.force_encoding('ASCII-8BIT')
134 txt
134 txt
135 end
135 end
136
136
137 def self.attach(attachments, filename, encoding)
137 def self.attach(attachments, filename, encoding)
138 filename_utf8 = Redmine::CodesetUtil.to_utf8(filename, encoding)
138 filename_utf8 = Redmine::CodesetUtil.to_utf8(filename, encoding)
139 atta = nil
139 atta = nil
140 if filename_utf8 =~ /^[^\/"]+\.(gif|jpg|jpe|jpeg|png)$/i
140 if filename_utf8 =~ /^[^\/"]+\.(gif|jpg|jpe|jpeg|png)$/i
141 atta = Attachment.latest_attach(attachments, filename_utf8)
141 atta = Attachment.latest_attach(attachments, filename_utf8)
142 end
142 end
143 if atta && atta.readable? && atta.visible?
143 if atta && atta.readable? && atta.visible?
144 return atta
144 return atta
145 else
145 else
146 return nil
146 return nil
147 end
147 end
148 end
148 end
149 end
149 end
150 end
150 end
151 end
151 end
152 end
152 end
General Comments 0
You need to be logged in to leave comments. Login now