##// END OF EJS Templates
pdf: fix Vietnamese Italic is not shown (#21328)...
Toshi MARUYAMA -
r14506:41c64d126653
parent child
Show More
@@ -1,153 +1,153
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 set_display_mode('default', 'OneColumn')
45 set_display_mode('default', 'OneColumn')
46 end
46 end
47
47
48 def SetFontStyle(style, size)
48 def SetFontStyle(style, size)
49 set_font(@font_for_content, style, size)
49 set_font(@font_for_content, style, size)
50 end
50 end
51
51
52 def SetFont(family, style='', size=0, fontfile='')
52 def SetFont(family, style='', size=0, fontfile='')
53 # FreeSerif Bold Thai font has problem.
53 # FreeSerif Bold Thai font has problem.
54 style.delete!('B') if l(:general_pdf_fontname) == 'freeserif'
54 style.delete!('B') if l(:general_pdf_fontname) == 'freeserif'
55 # DejaVuSans Italic Arabic and Persian font has problem.
55 # DejaVuSans Italic Arabic and Persian font has problem.
56 style.delete!('I') if l(:general_pdf_fontname) == 'DejaVuSans'
56 style.delete!('I') if l(:general_pdf_fontname) == 'DejaVuSans' && current_language.to_s.casecmp("vi") != 0
57 super(family, style, size, fontfile)
57 super(family, style, size, fontfile)
58 end
58 end
59 alias_method :set_font, :SetFont
59 alias_method :set_font, :SetFont
60
60
61 def fix_text_encoding(txt)
61 def fix_text_encoding(txt)
62 RDMPdfEncoding::rdm_from_utf8(txt, "UTF-8")
62 RDMPdfEncoding::rdm_from_utf8(txt, "UTF-8")
63 end
63 end
64
64
65 def formatted_text(text)
65 def formatted_text(text)
66 Redmine::WikiFormatting.to_html(Setting.text_formatting, text)
66 Redmine::WikiFormatting.to_html(Setting.text_formatting, text)
67 end
67 end
68
68
69 def RDMCell(w ,h=0, txt='', border=0, ln=0, align='', fill=0, link='')
69 def RDMCell(w ,h=0, txt='', border=0, ln=0, align='', fill=0, link='')
70 cell(w, h, txt, border, ln, align, fill, link)
70 cell(w, h, txt, border, ln, align, fill, link)
71 end
71 end
72
72
73 def RDMMultiCell(w, h=0, txt='', border=0, align='', fill=0, ln=1)
73 def RDMMultiCell(w, h=0, txt='', border=0, align='', fill=0, ln=1)
74 multi_cell(w, h, txt, border, align, fill, ln)
74 multi_cell(w, h, txt, border, align, fill, ln)
75 end
75 end
76
76
77 def RDMwriteFormattedCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
77 def RDMwriteFormattedCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
78 @attachments = attachments
78 @attachments = attachments
79
79
80 css_tag = ' <style>
80 css_tag = ' <style>
81 table, td {
81 table, td {
82 border: 2px #ff0000 solid;
82 border: 2px #ff0000 solid;
83 }
83 }
84 th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; text-align: center; font-style: bold;}
84 th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; text-align: center; font-style: bold;}
85 pre {
85 pre {
86 background-color: #fafafa;
86 background-color: #fafafa;
87 }
87 }
88 </style>'
88 </style>'
89
89
90 # Strip {{toc}} tags
90 # Strip {{toc}} tags
91 txt.gsub!(/<p>\{\{([<>]?)toc\}\}<\/p>/i, '')
91 txt.gsub!(/<p>\{\{([<>]?)toc\}\}<\/p>/i, '')
92 writeHTMLCell(w, h, x, y, css_tag + txt, border, ln, fill)
92 writeHTMLCell(w, h, x, y, css_tag + txt, border, ln, fill)
93 end
93 end
94
94
95 def RDMwriteHTMLCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
95 def RDMwriteHTMLCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
96 txt = formatted_text(txt)
96 txt = formatted_text(txt)
97 RDMwriteFormattedCell(w, h, x, y, txt, attachments, border, ln, fill)
97 RDMwriteFormattedCell(w, h, x, y, txt, attachments, border, ln, fill)
98 end
98 end
99
99
100 def get_image_filename(attrname)
100 def get_image_filename(attrname)
101 atta = RDMPdfEncoding.attach(@attachments, attrname, "UTF-8")
101 atta = RDMPdfEncoding.attach(@attachments, attrname, "UTF-8")
102 if atta
102 if atta
103 return atta.diskfile
103 return atta.diskfile
104 else
104 else
105 return nil
105 return nil
106 end
106 end
107 end
107 end
108
108
109 def get_sever_url(url)
109 def get_sever_url(url)
110 if !empty_string(url) and (url[0, 1] == '/')
110 if !empty_string(url) and (url[0, 1] == '/')
111 Setting.host_name.split('/')[0] + url
111 Setting.host_name.split('/')[0] + url
112 else
112 else
113 url
113 url
114 end
114 end
115 end
115 end
116
116
117 def Footer
117 def Footer
118 set_font(@font_for_footer, 'I', 8)
118 set_font(@font_for_footer, 'I', 8)
119 set_x(15)
119 set_x(15)
120 if get_rtl
120 if get_rtl
121 RDMCell(0, 5, @footer_date, 0, 0, 'R')
121 RDMCell(0, 5, @footer_date, 0, 0, 'R')
122 else
122 else
123 RDMCell(0, 5, @footer_date, 0, 0, 'L')
123 RDMCell(0, 5, @footer_date, 0, 0, 'L')
124 end
124 end
125 set_x(-30)
125 set_x(-30)
126 RDMCell(0, 5, get_alias_num_page() + '/' + get_alias_nb_pages(), 0, 0, 'C')
126 RDMCell(0, 5, get_alias_num_page() + '/' + get_alias_nb_pages(), 0, 0, 'C')
127 end
127 end
128 end
128 end
129
129
130 class RDMPdfEncoding
130 class RDMPdfEncoding
131 def self.rdm_from_utf8(txt, encoding)
131 def self.rdm_from_utf8(txt, encoding)
132 txt ||= ''
132 txt ||= ''
133 txt = Redmine::CodesetUtil.from_utf8(txt, encoding)
133 txt = Redmine::CodesetUtil.from_utf8(txt, encoding)
134 txt.force_encoding('ASCII-8BIT')
134 txt.force_encoding('ASCII-8BIT')
135 txt
135 txt
136 end
136 end
137
137
138 def self.attach(attachments, filename, encoding)
138 def self.attach(attachments, filename, encoding)
139 filename_utf8 = Redmine::CodesetUtil.to_utf8(filename, encoding)
139 filename_utf8 = Redmine::CodesetUtil.to_utf8(filename, encoding)
140 atta = nil
140 atta = nil
141 if filename_utf8 =~ /^[^\/"]+\.(gif|jpg|jpe|jpeg|png)$/i
141 if filename_utf8 =~ /^[^\/"]+\.(gif|jpg|jpe|jpeg|png)$/i
142 atta = Attachment.latest_attach(attachments, filename_utf8)
142 atta = Attachment.latest_attach(attachments, filename_utf8)
143 end
143 end
144 if atta && atta.readable? && atta.visible?
144 if atta && atta.readable? && atta.visible?
145 return atta
145 return atta
146 else
146 else
147 return nil
147 return nil
148 end
148 end
149 end
149 end
150 end
150 end
151 end
151 end
152 end
152 end
153 end
153 end
General Comments 0
You need to be logged in to leave comments. Login now